`
guhanjie
  • 浏览: 300762 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JXL调用copySheet()和importSheet()方法时报异常

 
阅读更多
处理EXCEL的开源java util中我了解的有JXL、POI。
而我一直是用jxl来处理excel文件的,之前只是用它来做简单的读写等操作,因此觉得这个jxl还是比较简单轻便的。然而,最近项目中客户有一个带宏(Macro)的sheet要做处理,而JXL貌似在处理带宏的excel方面有些局限(不是一点点),不是很能够处理这方面内容。
我查看了jxl的API文档,发现在jxl.WorkbookSettings中有这么一段:
引用

setPropertySets(boolean r)
          Sets whether or not to enable any property sets (such as macros) to be copied along with the workbook Leaving this feature enabled will result in the JXL process using more memory


因为我不需要对宏做任何修改,只是简单地想把这个宏拷贝下来,因此我认为我只需要将以上这个方法置true,然后再调用copySheet()或者importSheet()方法拷贝这个sheet,应该就能把这个带宏的sheet拷贝下来。

但是当我这样做的时候,我发现我在copySheet()方法中捕获了一个异常,显示如下:
引用

java.lang.NullPointerException
at java.lang.String.compareTo(Unknown Source)
at java.lang.String.compareTo(Unknown Source)
at java.util.Arrays.binarySearch0(Unknown Source)
at java.util.Arrays.binarySearch(Unknown Source)
at jxl.write.biff.SheetCopier.importNames(SheetCopier.java:1049)
at jxl.write.biff.SheetCopier.importSheet(SheetCopier.java:784)
at jxl.write.biff.WritableSheetImpl.importSheet(WritableSheetImpl.java:2638)
at jxl.write.biff.WritableWorkbookImpl.importSheet(WritableWorkbookImpl.java:1897)
at test_JXL.Test_JXL_copysheet.<init>(Test_JXL_copysheet.java:62)
at test_JXL.Test_JXL_copysheet.main(Test_JXL_copysheet.java:80)


于是,我在网上搜索了一下,关于这个“JXL的copySheet()方法出现异常”,看到在OSChina讨论组里有一篇跟我遇到一样情况的人写的帖子:
这两天使用Jexcel进行copySheet时总是报异常:
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);  
} 

代码中少写了一个&符,虽然也可以用来表示“且”的逻辑,但一个&符是没有用到短路算法的,这样就会导致不 管&前面表达式的结果是true还是flase,&符后面的表达式都会执行。在这段代码中,在c.getCellFeatures()是 null 的情况下,c.getCellFeatures().hasDataValidation()必然会报 java.lang.NullPointerException异常。

http://www.oschina.net/question/42346_67474

我在jxl的原站上http://www.andykhan.com/jexcelapi/download.html下载了最新版本的源包,并查看了源码,发现确实如以上网友所言。

并且,我在网上找到了一个jxl.jar(688 KB),这个jar包与最新版本有区别,我调用这个包就不会出异常,我想应该是好心人已经把源码修正了并打包成jar包,这里我也把它贴出来,好方便大家使用,省得自己还得修改源码再打包,浪费时间。

现在,用新jxl包,copySheet()出异常问题解决了,并且,我可以按上面我的想法尝试用jxl能否对带宏(macro)的sheet进行copy,以下是具体实现代码:
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()) {//如果该文件不存在,则先创建一个wwb				
				to_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");
	}
	
}


程序大概是这样:
其中"d:\\FAP1301578_4_Item_Upload.xls"是一个带宏的excel文件,而 "d:\\test.xls" 是想要把带宏的excel文件中的表单拷贝到这个文件的目的文件。
然后我就设置了一下setPropertySets属性,然后调用了copySheet()和importSheet()进行了复制和导入,其中importSheet()是从另一个workbook中深拷贝一个sheet。

程序运行结果是,可以正常运行,拷贝也成功,但是宏好像失效了
于是,我想到了另外一种方法,避开这个问题:
先将我们要拷贝的excel文件以字节流的形式拷贝一份,然后打开那个带有宏的sheet,因为我不需要对宏做什么修改,只是在这个带宏的表单上修改一些字符,比如在指定Cell中写入一些字符等,这时只需要正常的用jxl的addCell()即可,写完后再保存,ok!
这样我们就实现了一个拷贝了带宏的excel文件,并在相关sheet上进行了更新!
代码修改如下:
... ...
//--------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();
... ...
  • jxl.jar (688 KB)
  • 下载次数: 417
分享到:
评论
6 楼 ww_xx 2018-03-09  
宏还是丢失了啊
5 楼 贝塔ZQ 2017-02-14  
处理excel文件,可以用pageoffice插件实现,使用PageOffice的RunMacro方法可以运行Office文档本身包含的宏命令。需要的可以看看。
4 楼 johenry 2016-01-04  
谢谢,今天进行excel文件合并,恰好遇到了这个问题
3 楼 bjuth 2014-10-10  
官方到现在都没改 注册itele号 又等了一天 终于能过了
2 楼 ying890 2014-03-28  
非常感谢!花了我一天的时间。
1 楼 Ray.Allen 2013-06-27  
尴尬的遇到这个问题,多谢了~

相关推荐

    解决JXL调用copySheet()和importSheet()方法时报异常的jar包

    今天调试了一下,发现在jxl.write.biff.WritableSheetCopier.shallowCopyCells方法中有如下代码 Java代码 if (c.getCellFeatures() != null & c.getCellFeatures().hasDataValidation()) { validatedCells....

    修复jxl中importSheet方法bug

    NULL 博文链接:https://tangshuo.iteye.com/blog/1094882

    jxl.jar和jxl.api文档及使用方法

    标题"jxl.jar和jxl.api文档及使用方法"指的是一个Java库,名为JExcelAPI(通常简称为jxl),用于处理Excel文件。它包含了一个名为`jxl.jar`的可执行Java档案,这个档案集成了JExcelAPI的所有类和方法,使得开发人员...

    jxl.jar和jml源码和jxlAPI下载

    首先,"jxl.jar"是JXL库的主要运行时文件,包含了处理Excel文件所需的类和方法。将其添加到项目的类路径(classpath)中,就能在代码中调用JXL提供的功能,如读取、写入和修改Excel文件。JXL支持多种操作,包括创建...

    jxl包和它的使用方法

    5. **错误处理和异常**:在使用jxl时,需要注意可能出现的异常,例如`BiffException`、`FormulaParseException`等。应当适当地捕获并处理这些异常,确保程序的健壮性。 在“使用方法.txt”文件中,可能包含了更多...

    jxl生成excel的通用方法

    使用jxl生成excel的通用方法,参数List&lt;?&gt;数据,LinkedHashMap,String&gt;实体类属性名和中文列名的键值对

    jxl-2.6.10.jar包

    在实际应用中,使用jxl-2.6.10.jar包时,需要将其添加到项目的类路径中,这样就可以在代码中直接引用jxl的类和方法。需要注意的是,虽然jxl库在处理小规模数据时表现出色,但对于大规模数据,由于内存限制,可能会...

    jxl对excel添加水印(含有setWaterMarkImage方法).zip

    `jxl`库是一个广泛使用的开源库,它允许开发者用Java读取、写入和修改Excel文件。在这个特定的场景中,我们将探讨如何利用`jxl`库为Excel文件添加水印,特别关注`setWaterMarkImage`方法。 首先,`jxl`库不直接提供...

    jxl 实现 excel的导入和 导出

    在这个类中,你会找到调用`jxl`库的方法,如`Workbook`和`Sheet`的相关API,用于读取和写入Excel数据。 具体到`jxl`的使用,以下是一些关键知识点: 1. **读取Excel文件**:使用`Workbook`类的静态方法`Workbook....

    jxl相关jar和api

    首先,`jxl-2.6.jar`是JXL库的主要组成部分,包含了所有必要的类和方法,使得Java程序能够与Excel文件进行交互。此版本(2.6)虽然较旧,但仍适用于许多现有的项目,因为它提供了稳定的API并支持大部分Excel功能。 ...

    jxlAPI(jxl完整的API)

    `jxldoc`可能包含了jxl库的API文档,这将是你了解和使用jxl API的重要资源,通过阅读文档,可以更深入地理解各个类和方法的用途和用法。 总之,jxl为Java开发者提供了强大的Excel文件处理能力,无论是读取现有数据...

    jxl接口和类的api

    在处理Excel文件时,应捕获并处理可能出现的异常,如`WriteException` 和 `BiffRecordException`。 ### 7. 示例代码 ```java import jxl.*; public class JXLExample { public static void main(String[] args) ...

    jxl.zip_excel_jxl_jxl.biff.drawing.dg_jxl.biff.drawingdg

    `WritableWorkbook`和`WritableSheet`类分别对应于读取模式下的`Workbook`和`Sheet`,提供了设置单元格值、样式和格式的方法。 3. **处理图形和图表**:"jxl.biff.drawing.dg"和"jxl.biff.drawingdg"暗示了JXL库对...

    jxl及jxlApi

    此外,jxlApi是jxl库提供的API文档,它详细介绍了所有类、方法和属性,是你学习和使用jxl不可或缺的参考资料。通过查阅jxlApi,你可以找到更多关于如何处理复杂数据结构、合并单元格、处理日期和时间等特定需求的...

    jxl.jar 和 源代码

    标题 "jxl.jar 和 源代码" 描述了这个压缩包包含的两个主要元素:一个名为 `jxl.jar` 的Java库文件以及与之相关的源代码。`jxl.jar` 是一个流行的Java库,用于读取、写入和修改Microsoft Excel文件。源代码可能包含...

    java操作excel——jxl和poi比较

    本文将对比两种主流的Java Excel处理库:jxl和Apache POI,并探讨它们的特性和适用场景。 首先,jxl是较早的Java Excel处理库,主要用于读写Excel 97-2003格式的.XLS文件。它的API简洁,易于上手,对于简单的读写...

    关于jxl操作excel说明以及jxl.jar包下载2.6

    Jxl.jar文件包含了JXL库的所有类和方法,将其添加到Java项目的类路径中,即可在代码中使用JXL功能。 要开始使用JXL,首先需要下载jxl.jar文件。在描述中提到的“jxl.jar包”,可以通过访问JXL的官方网站或者通过第...

    jxl api说明文档

    通过Cell类的方法设置数据和格式。 2. **读取Excel**:从Excel文件加载Workbook对象,然后遍历其工作表和单元格,读取数据并处理。 四、JXL API中的其他特性 - **Formula support**:JXL支持处理Excel中的公式,...

    JXL操作EXCEL的各个类的解析.doc

    WritableFont 类、WritableCellFormat 类和 Label 类是 JXL 中用于修饰 WritableSheet 的核心类。WritableFont 类用于设置字体样式,WritableCellFormat 类用于设置单元格格式,Label 类用于设置单元格的标签。 在 ...

Global site tag (gtag.js) - Google Analytics