JXL调用copySheet()和importSheet()方法时报异常
处理EXCEL的开源java util中我了解的有JXL、POI。
而我一直是用jxl来处理excel文件的,之前只是用它来做简单的读写等操作,因此觉得这个jxl还是比较简单轻便的。然而,最近项目中客户有一个带宏(Macro)的sheet要做处理,而JXL貌似在处理带宏的excel方面有些局限(不是一点点),不是很能够处理这方面内容。
我查看了jxl的API文档,发现在jxl.WorkbookSettings中有这么一段:
java.lang.NullPointerException at jxl.write.biff.WritableSheetCopier.shallowCopyCells(WritableSheetCopier.java:499) [jxl.ja r:na] at jxl.write.biff.WritableSheetCopier.copySheet(WritableSheetCopier.java:239) [jxl.jar:na] at jxl.write.biff.WritableSheetImpl.copy(WritableSheetImpl.java:1622) [jxl.jar:na] at jxl.write.biff.WritableWorkbookImpl.copySheet(WritableWorkbookImpl.java:987) [jxl.jar:na]
今天跟了下jexcel的源代码,发现在jxl.write.biff.WritableSheetCopier.shallowCopyCells方法中
if (c.getCellFeatures() != null & c.getCellFeatures().hasDataValidation()) { validatedCells.add(c); } package test_JXL;import java.io.File;import jxl.Sheet;import jxl.Workbook;import jxl.WorkbookSettings;import jxl.write.WritableSheet;import jxl.write.WritableWorkbook;public class Test_JXL_copysheet {File to_file,from_file;public Test_JXL_copysheet(String from_filename, String to_filename) {to_file = new File(to_filename);from_file = new File(from_filename);try {WritableWorkbook to_wwb; //创建可写入workbook对象if(!this.to_file.exists()) {//如果该文件不存在,则先创建一个wwbto_wwb = Workbook.createWorkbook(this.to_file);} else {//如果该文件已经存在,则应该是获取该workbook,并update其Workbook rw = jxl.Workbook.getWorkbook(this.to_file);to_wwb = Workbook.createWorkbook(this.to_file, rw);}WritableSheet ws = to_wwb.createSheet("Product Tree", to_wwb.getNumberOfSheets()); //创建工作表1 -- Tree型文件jxl.write.Label label = new jxl.write.Label(0, 0, "This is Sheet 1"); //写excel单元格数据ws.addCell(label);//--------testing...------------------------WorkbookSettings newSettings = new WorkbookSettings();newSettings.setPropertySets(true);Workbook from_rw = jxl.Workbook.getWorkbook(this.from_file, newSettings);Sheet from_sheet1 = from_rw.getSheet(0);Sheet from_sheet2 = from_rw.getSheet(1);WritableWorkbook from_wwb = Workbook.createWorkbook(this.from_file, from_rw, newSettings);from_wwb.copySheet(1, "yes", 2);to_wwb.copySheet("Product Tree", "copy", 1);to_wwb.importSheet("YES", 2, from_sheet1);to_wwb.importSheet("hao", 3, from_sheet2);//写入到Exel工作表中to_wwb.write();from_wwb.write();//关闭Excel工作薄对象to_wwb.close();from_rw.close();from_wwb.close();}catch (Exception e) {e.printStackTrace();System.err.println("There is an error!\n");}}public static void main(String[] args) {new Test_JXL_copysheet("d:\\FAP1301578_4_Item_Upload.xls", "d:\\test.xls");}}... ...//--------testing...------------------------WorkbookSettings newSettings = new WorkbookSettings();newSettings.setPropertySets(true);Workbook from_rw = jxl.Workbook.getWorkbook(this.from_file, newSettings);Sheet from_sheet1 = from_rw.getSheet(0);Sheet from_sheet2 = from_rw.getSheet(1);WritableWorkbook from_wwb = Workbook.createWorkbook(this.from_file, from_rw, newSettings);WritableSheet from_ws = from_wwb.getSheet(1); //修改部分label = new jxl.write.Label(1, 1, "This has been changed!"); //写excel单元格数据 修改部分from_ws.addCell(label);//修改部分to_wwb.copySheet("Product Tree", "copy", 1);to_wwb.importSheet("YES", 2, from_sheet1);to_wwb.importSheet("hao", 3, from_sheet2);//写入到Exel工作表中to_wwb.write();from_wwb.write();//关闭Excel工作薄对象to_wwb.close();from_rw.close();from_wwb.close();... ...