Java Excel API problem z kopiowaniem arkusza.

0

Cześć,
Wielka prośba o pomoc z poniższym kodem. Próbuje napisać sobie kawałek programu który będzie mi automatyzował pewne czynności wykonywane w pliku excella.
Do odczytu i edycji plików xls używam Java Excel API (http://jexcelapi.sourceforge.net/)

Póki co napotkałem na następujące problemy, które być może ktoś byłby w stanie pomóc rozwiązać.

  1. Nie znalazłem nigdzie metody do otwarcia pliku xls i jego edycji. Czy jedyną opcją w tym API jest utworzenie nowego pliku xls i skopiowanie zawartości starego metodą Workbook.createWorkbook();
  2. Chciałbym wykonać operację skopiowania ostatniego arkusza.
    W kodzie próbowałem użyć do tego metody copySheet oraz importSheet (trochę na około ale jak pierwsza nie działała to próbowałem kolejnej).
    Obie zwracają wyjątek NullPointerException. Metoda printStackTrace wyrzuca następujący komunikat:
java.lang.NullPointerException
	at jxl.write.biff.SheetCopier.deepCopyCells(SheetCopier.java:996)
	at jxl.write.biff.SheetCopier.importSheet(SheetCopier.java:542)
	at jxl.write.biff.WritableSheetImpl.importSheet(WritableSheetImpl.java:2699)
	at jxl.write.biff.WritableWorkbookImpl.importSheet(WritableWorkbookImpl.java:1897)
	at de.vogella.java.excel.reader.ReadExcell.read(ReadExcell.java:51)
	at de.vogella.java.excel.reader.ProtocoleMaker.main(ProtocoleMaker.java:17)

Czy ktoś ma na to pomysł?
3. Czy znacie może jakieś inne lepsze API do odczytu i zapisu plików excella ?

Z góry dzięki za pomoc.

public class ReadExcell {

    private String inputFile;

    public void setInputFile(String inputFile) {
        this.inputFile = inputFile;
    }

    public void read() throws IOException  {
        File baseWorkbook = new File(inputFile);
        File outputWorkbook = new File("c:/temp/protokol2.xls");
        Workbook w;
        String[] Miesiace = {"Styczen", "Luty", "Marzec", "Kwiecien", "Maj", "Czerwiec", "Lipiec", "Sierpien", "Wrzesien", "Pazdziernik", "Listopad","Grudzien"};
       
        try {
            w = Workbook.getWorkbook(baseWorkbook);
            System.out.println("nazwy arkuszy");
            System.out.println(w.getSheets().length);
            WritableWorkbook wr = Workbook.createWorkbook(outputWorkbook, w);
            
            LocalDate Data = LocalDate.now();
            String SheetName = "";
            if (Data.getDayOfMonth() < 17)
            {
            	SheetName = Miesiace[Data.getMonthValue()-1]+"_"+Data.getYear();
            }
            else
            {
            	SheetName = Miesiace[Data.getMonthValue()]+"_"+Data.getYear();
            }
            System.out.println(wr.getSheets().length);
            Sheet wsp = w.getSheet(wr.getSheetNames().length-1);   
            System.out.println(wsp.getName());
            System.out.println(SheetName);
            WritableSheet wsn = wr.importSheet(SheetName, wr.getNumberOfSheets()-1, wsp);
            
            wr.write();
            wr.close();

            
         
        } catch (BiffException e) {
                System.out.println("BiffException ");
        	e.printStackTrace();
        }
        catch (WriteException e) {
        	System.out.println("WriteException ");
        	e.printStackTrace();
        }
        catch (NullPointerException e) {
        	System.out.println("Null pointer exception");
                e.printStackTrace();
        }
    }

    public static void main(String[] args) throws IOException {

    }
}
0

Najbardziej znaną i najbardziej godną zaufania była biblioteka Apache POI. Ale ona potrafi tylko czytać i tworzyć arkusze. Wydaje mi się, że nie ma opcji edycji. Z tym że stan wiedzy mam z dość dawna.

Do edycji Excela najlepiej używać narzędzi Microsoftu, na przykład vb script. Jeżeli musi być Java, to zastosowałbym (kiedyś stosowałem) bridge Java-COM. Najlepszy jaki zlokalizowałem to Jacob. Niestety ma on trochę wad, m.in. nie za dobrze zarządzał obiektami i pamięć się zapychała przy długich operacjach. Antidotum było restartowanie biblioteki co jakiś czas, albo poprawienie jej i staranne korzystanie, tak żeby obiekty się nie rozmnażały bez nadzoru. Tak czy owak trzeba robić testy vbscriptem i porównywać z działaniem Javy, żeby rozumieć, dlaczego nasz kod nie działa. Podsumowując - zadanie trudne.

Lepiej z COM-em radzi sobie C#, szczególnie jeżeli zrobi mu się dll-a excelowego. A C# jest już bardzo podobny do Javy.

0

Ale ona potrafi tylko czytać i tworzyć arkusze.

to można robić sobie kopie i na nich operować

Czy znacie może jakieś inne lepsze API do odczytu i zapisu plików excella ?

Nie znam takowych, ewentualnie parsuj sobie do csv i na tym działaj.

1 użytkowników online, w tym zalogowanych: 0, gości: 1