2017-09-21 4 views
0

私は2枚、ワークブックを作成するためのコードのExcel XLSファイルを生成するために、POI-3.17を使用し、1枚目は、次のようになります。奇妙な行動:org.apache.commons.collections4.bidimap.TreeBidiMap

 Sheet sheet; 
    Workbook wb; 
    String excelFileName = "myExcelFile.xls"; 
    String sheet1Name = "sheet1"; 
    // read the excel workbook via input stream if it exists already 
    // otherwise create a new workbook 
    try { 
     if (new File(excelFileName).exists()) 
      wb = new HSSFWorkbook(new FileInputStream(excelFileName)); 
     else 
      wb = new HSSFWorkbook(); 
    } catch (IOException e) { 
     wb = new HSSFWorkbook(); 
    } 

    // try to remove the sheet1 if it existed already 
    try { 
     wb.removeSheetAt(wb.getSheetIndex(sheet1Name)); 
     sheet = wb.createSheet(sheet1Name); 
    } catch (Exception e) { 
     sheet = wb.createSheet(sheet1Name); 
    } 

    // do something here to add contents to the sheets 

    // Write the output to a file 
    FileOutputStream fileOut; 
    try { 
     fileOut = new FileOutputStream(excelFileName); 
     wb.write(fileOut); 
     fileOut.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

私の意図は: "sheet1"は、 "sheet2"(コードはここには表示されていません)が削除されないうちに、プログラムが実行されるときに削除できます。

Excelファイルが存在しない場合、私のプログラムを実行することができます.2枚のExcelファイルが正しく生成されます。 Excelファイルがすでに生成されていても、問題なくプログラムを実行できます(この場合、 "sheet2"はExcelファイルの最初のシート、次に "sheet1"になります)。

問題は、私はExcelファイルを開いて、「シート1」にいくつかの変更を行うとき、にClassNotFoundExceptionsと全くエクセルの内部には、コンテンツが存在します次のとおりです。

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/collections4/bidimap/TreeBidiMap 
at org.apache.poi.hpsf.Section.<init>(Section.java:178) 
at org.apache.poi.hpsf.MutableSection.<init>(MutableSection.java:41) 
at org.apache.poi.hpsf.PropertySet.init(PropertySet.java:494) 
at org.apache.poi.hpsf.PropertySet.<init>(PropertySet.java:196) 
at org.apache.poi.hpsf.MutablePropertySet.<init>(MutablePropertySet.java:44) 
at org.apache.poi.hpsf.SpecialPropertySet.<init>(SpecialPropertySet.java:47) 
at org.apache.poi.hpsf.DocumentSummaryInformation.<init>(DocumentSummaryInformation.java:99) 
at org.apache.poi.hpsf.PropertySetFactory.create(PropertySetFactory.java:116) 
at org.apache.poi.POIDocument.getPropertySet(POIDocument.java:236) 
at org.apache.poi.POIDocument.getPropertySet(POIDocument.java:197) 
at org.apache.poi.POIDocument.readPropertySet(POIDocument.java:175) 
at org.apache.poi.POIDocument.readProperties(POIDocument.java:158) 
at org.apache.poi.hssf.usermodel.HSSFWorkbook.updateEncryptionInfo(HSSFWorkbook.java:2295) 
at org.apache.poi.hssf.usermodel.HSSFWorkbook.getBytes(HSSFWorkbook.java:1506) 
at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:1428) 
at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:1414) 
at excel.WriteToExcel.<init>(WriteToExcel.java:70) 
at main.IndexGenerateFE.main(IndexGenerateFE.java:11) 
Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections4.bidimap.TreeBidiMap 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    ... 18 more 

だから私はコモンズ-collections4-」libが追加しましたビルドパスで4.1.jar "を指定すると、" sheet1 "の内容が変更されてもExcelファイルが正しく再生成されます。理由は何ですか?私は、 "sheet1"が変更されているかどうかにかかわらず、プログラムが実行されたときに既に削除しています。

答えて

0

私は 'workbook.write(out);'コマンドで同じ問題があります。 エラーはjdk-8u144(POI ... 3.16と3.17)とjdk-9(POI ... 3.17)の両方で発生します。私は '.getCellTypeEnum()' POIを使用しているので... 3.15はコンパイル時にエラーにつながります。 私は私のソフトウェアの古いバージョンを使用することを強いられます。

0

明らかに、POIライブラリのバージョンが原因です。 私はSoapUIにGroovy Scriptを書いていますが、私は同じ理解できない例外を抱えていました。 私はちょうどダウンロードして3.14をSoapUI(私は3.17にあった)で使用しましたが、それ以上の例外はありません。

0

「xls」ファイルのHSSFWorkbookの代わりにXSSFWorkbookを使用して「xlsx」ファイルを作成すると問題が解決する可能性があります。