我使用poi-3.17生成一个包含两张工作表的Excel xls文件,用于创建工作簿的代码和第一张工作表如下:
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文件并在“sheet1”中进行一些修改时,Excel中将会有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
所以我在构建路径中添加了lib“commons-collections4-4.1.jar”,即使修改了“sheet1”中的内容,也可以正确地再次生成Excel文件。是什么原因?我的意思是不管“sheet1”是否被修改,我已经删除它已经执行程序,它怎么可能发生?
答案 0 :(得分:0)
我对命令&#39; workbook.write(out);&#39;有同样的问题。 jdk-8u144(POI ... 3.16和3.17)以及jdk-9(POI ... 3.17)都会发生错误。因为我使用&#39; .getCellTypeEnum()&#39; POI ... 3.15在编译时会导致错误 - 所以也不会。 所以我被迫使用旧版本的软件。
答案 1 :(得分:0)
显然,这是由于POI库的版本所致。 我在SoapUI上编写了一个Groovy脚本,我遇到了同样难以理解的异常。 我刚刚下载并使用了SoapUI上的3.14(我在3.17上)并且没有例外。
答案 2 :(得分:0)
如果使用XSSFWorkbook而不是HSSFWorkbook为“xls”文件创建“xlsx”文件,似乎可以解决问题。
答案 3 :(得分:0)
我遇到了同样的问题。在构建路径中添加了lib“ commons-collections4-4.1.jar”,问题就消失了。是解决方案