【发布时间】:2013-09-04 14:00:57
【问题描述】:
我需要使用 JExcel 将内容附加到现有的 excel 文件中。
我正在尝试以下方法:
-
从现有工作簿中读取
workbook = Workbook.getWorkbook(new File(errorFilePath)); -
将现有工作簿中的可写工作簿创建到临时文件中
if (!tempFile.exists()) { tempFile.getParentFile().mkdirs(); tempFile.createNewFile(); } newCopy = Workbook.createWorkbook(tempFile, workbook); excelSheet = newCopy.getSheet(0); -
写入可写工作簿(times 是可写单元格格式变量)
Label label; label = new Label(column, row, stringData, times); excelSheet .addCell(label); -
关闭现有和可写工作簿->删除现有工作簿 在 finally 块中 -> 将临时文件名重命名为现有(现已删除)工作簿名称
finally { if (null != newCopy) { newCopy.write(); newCopy.close(); } if (null != workbook) { workbook.close(); } if (null != errorFile && errorFile.exists()) { errorFile.delete(); } if (null != tempFile) { tempFile.renameTo(new File(errorFilePath)); } }问题是第一次运行一切正常(无需重新部署)。 但是,每当我更改一些 java 代码,并且重新部署 Web 应用程序时,在关闭新创建的工作簿时(写入后),我都会收到一个空指针异常。
我得到以下堆栈跟踪(源自 newCopy.write() 行)
java.lang.NullPointerException
at jxl.write.biff.CellValue.getData(CellValue.java:259)
at jxl.write.biff.LabelRecord.getData(LabelRecord.java:141)
at jxl.biff.WritableRecordData.getBytes(WritableRecordData.java:71)
at jxl.write.biff.File.write(File.java:147)
at jxl.write.biff.RowRecord.writeCells(RowRecord.java:329)
at jxl.write.biff.SheetWriter.write(SheetWriter.java:479)
at jxl.write.biff.WritableSheetImpl.write(WritableSheetImpl.java:1514)
at jxl.write.biff.WritableWorkbookImpl.write(WritableWorkbookImpl.java:950)
Java 版本:1.6
JExcel 版本:2.6.10
Windows 7
【问题讨论】:
-
发布您的错误堆栈跟踪
-
你是在生成 xls 还是 xlsx 文件?
-
xls 文件...并发布堆栈跟踪
-
能否请您也尝试关闭 tempFile。问题是 excel API 通常会为每次编辑保留一个锁定文件,这可能会阻止您在重新部署后再次使用该文件。
-
tempFile 是一个文件对象(它们没有关闭方法。) tempFile 作为参数传递给 jexcel,它从中创建 newCopy(参见代码 sn-p 2) newCopy 在 finally 块中关闭