ComiaTip Excelin käsittelyä Javalla


Excelin käsittelyä Javalla

Kirjoittanut J-P Julkaistu 13.5.2009

MS Excel-dokumentit ovat saavuttaneet lähes de facto -standardin aseman taulukkomuotoisen tiedon siirrossa. Exceleinä siirtyvät laskut, kirjanpito, kyselytulokset ja monet muut tiedot ja mikäs siinä. Excel on loppujen lopuksi työkalu paikallaan, lähes kaikki osaavat sitä käyttää. Erilaisia ohjelmia tehdessäni olen usein törmännyt käyttäjien vaatimukseen, että ohjelman on kyettävä lukemaan ja/tai kirjoittamaan excel-tiedostoja.

Java -maailmassa excelin käsittely onnistuu helposti JExcel API -kirjaston avulla. Kirjasto on lisensoitu LGPL-lisenssillä, joten sen käyttäminen omissa tuotteissa antaa hieman enemmän vapauksia kuin perinteiseen GPL-lisenssiin perustuvat ohjelmakomponentit. Kuten moni muukin hyvä avoimen lähdekoodi luokka kirjasto, myös JExcel API löytyy source forgesta.

Excel-tiedostojen lukeminen

Jexcel APIlla excel-tiedosto (tai mikä tahansa excel-tietovirta) voidaan lukea oliorakenteeksi. Workbook -luokan metodilla getWorkbook voidaan avata tiedosto tai minkä tahansa syötevirran sisältämä Excel-dokumentti ja sijoittaa se Workbook olioon. Workbook-olion kauttu päästään vastaavasti käsiksi Excelin sisältämiin välilehtiin (Sheet-luokka). Sheet-luokan kautta päästään käsiksi taulukon soluihin ja solujen sisältämiin tietoihin. Myös kaavojen ja solujen muotoilun käsittely onnistuu komponentin avulla.

Alla olevassa lyhyessä esimerkissä avataan ohjelmalle parametrina annettu Excel-tiedosto ja tulostetaan sen sisältämien välilehtien nimet ja välilehdillä olevien rivien ja sarakkeiden määrä.

import java.io.File; import java.io.IOException; import jxl.Sheet; import jxl.Workbook; import jxl.read.biff.BiffException; public class ExcelReader { public static void main(String[] argh) throws IOException, BiffException { Workbook workbook = Workbook.getWorkbook(new File(argh[0])); System.out.println( "Excel tiedostossa on seuraavat välilehdet:"); //Tulostetaan kaikkien välilehtien nimet //sekä sarakkeiden ja rivien määrä for (Sheet sheet:workbook.getSheets()) { System.out.println("\t"+sheet.getName()+ " [Sarakkeita: "+sheet.getColumns()+ " Rivejä: "+sheet.getRows()+"]"); } } }

Excel-tiedostojen tallentaminen

JExcel APIn avulla voidaan myös luoda ja tallentaa uusia excel-dokumentteja. Oheinen esimerkki kuvaa, miten luodaan yksinkertainen, yhden välilehden excel-dokumentti, jonka ensimmäisessä solussa on merkkijono ja toisessa numero. Jokaisella solutyypillä on oma luokkansa ja esimerkiksi jxl.write.Label kuvaa teksisoluja ja jxl.write.Number numerotietoa sisältäviä soluja.

import java.io.File; import java.io.IOException; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; public class ExcelWriter { public static void main(String[] argh) throws IOException, WriteException { //Luodaan uusi excel-dokumentti ja //ohjataan se tiedostoon WritableWorkbook workbook = Workbook.createWorkbook(new File(argh[0])); //Luodaan dokumenttiin välilehti WritableSheet sheet = workbook.createSheet( "Ensimmäinen välilehti", 0); int column=0; int row=0; //luodaan uusi tekstisolu Label textCell = new Label(column, row, "Tässä excelissä on rivejä tasan:"); //siirrytään seuraavaan sarakkeeseen column++; //luodaan uusi numerosolu jxl.write.Number numberCell = new jxl.write.Number(column, row, 1.0); //Sijoitetaan solu välilehdelle sheet.addCell(textCell); //sijoitetaan toinenkin solu välilehdelle sheet.addCell(numberCell); //Suljetaan dokumentti. workbook.close(); } }

Kun uutta halutaan luoda uusi tai muokata olemassa olevaa Excel-dokumenttia, on käytettävä WritableWorkbook ja WritableSheet rajapintoja tavallisten Workbook ja Sheet -rajapintojen sijasta, sillä nämä sisältävät dokumenttien muokkaukseen tarvittavia metodeja.

Koska excel-dokumentin rakentaminen ja muokkaaminen, erityisesti ulkoasullisesti kauniiksi, saattaa vaatia paaaaaljon koodia, olen monesti todennut, että kätevin tapa luoda uusia (nättejä) excel dokumentteja on rakentaa Excelillä valmis pohja, jonka tiedot täydennetään Java-koodissa. Näin ohjelmakoodissa ei tarvitse kiinnittää huomiota dokumentin ulkoasuun liittyviin muotoseikkoihin kuten väreihin ja solujen pituuksiin.