错误信息如下:
......
java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at jxl.biff.StringHelper.getBytes(StringHelper.java:127)
at jxl.write.biff.WriteAccessRecord.<init>(WriteAccessRecord.java:59)
at jxl.write.biff.WritableWorkbookImpl.write(WritableWorkbookImpl.java:726)
......
根据错误信息的提示,发现问题出在WriteAccessRecord文件里,其源代码如下所示:
package jxl.write.biff;
import jxl.Workbook;
import jxl.biff.StringHelper;
import jxl.biff.Type;
import jxl.biff.WritableRecordData;
/**
* The name used when Excel was installed.
* When writing worksheets, it uses the value from the WorkbookSettings object,
* if this is not set (null) this is hard coded as
* Java Excel API + Version number
*/
class WriteAccessRecord extends WritableRecordData {
/**
* The data to output to file
*/
private byte[] data;
// String of length 112 characters
/**
* The author of this workbook (ie. the Java Excel API)
*/
private final static String authorString = "Java Excel API";
private String userName;
/**
* Constructor
*/
public WriteAccessRecord(String userName) {
super(Type.WRITEACCESS);
data = new byte[112];
String astring = userName != null ?
userName :
authorString + " v" + Workbook.getVersion();
StringHelper.getBytes(astring, data, 0);
// Pad out the record with space characters
for (int i = astring.length() ; i < data.length ;i++) {
data[i] = 0x20;
}
}
/**
* Gets the data for output to file
*
* @return the binary data
*/
public byte[] getData() {
return data;
}
}
分析上诉代码发现,byte数组data的最大长度被定义为112,当被传入的参数userName达到一定长度时就会抛错。
跟踪代码WritableWorkbookImpl发现,userName实际就是WorkbookSettings类中的writeAccess字段,亦即生成Excel是的用户信息。可能在linux环境UTF8下每个汉字的字节数为3位(Windows中是2位)的缘故,出现了上诉的奇异现象。
解决的办法如下:
1.修改JXL源代码中WriteAccessRecord文件代码,重新设置变量data的长度,例如:data = new byte[astring.getBytes().length];
2.一般我们在读取模板文件生成新的Excel时往往使用如下代码:
import java.io.File;
import jxl.Workbook;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
public class Test {
public static void main(String[] args) throws Exception {
Workbook wb = Workbook.getWorkbook(new File("C:/data_template.xls"));
WritableWorkbook workbook = Workbook.createWorkbook(new File("C:/data_output.xls"), wb);
WritableSheet sheet = workbook.getSheet(3);
sheet.getSettings().setSelected(true);
workbook.write();
workbook.close();
}
}
只要在代码中强制设置变量WorkbookSettings.writeAccess的值即可,例如:
File file = new File("data/lglk/excle/LandNeed.xls");
Workbook workbook = Workbook.getWorkbook(file);
OutputStream outputStream = new FileOutputStream(new File(path));
WorkbookSettings wbSettings = new WorkbookSettings ();
wbSettings.setWriteAccess(null);
// 工作表
WritableWorkbook writableWorkbook = Workbook.createWorkbook(os, workbook,wbSettings);
// 写入文件
writableWorkbook.write();
writableWorkbook.close();
workbook.close();
os.close();
相关推荐
java中使用jxl打印excel报表,java中使用jxl打印excel报表,java中使用jxl打印excel报表
Java通过POI和JXL给Excel动态添加水印.docxJava通过POI和JXL给Excel动态添加水印.docx
java利用jxl生成excel文件,代码直接导入就可以跑(修改自己的生成的ecxel地址)
NULL 博文链接:https://yuanyuan7891.iteye.com/blog/656388
使用jxl解析excel固定模版(导入解析),本资源是以智联excel简历为例解析, 1:上传 2:临时存储,3:解析保存,4:删除临时资源关闭流
jxl模版生成excel,采用类似EL表达式的方式生成模版
主要介绍了Exception in thread main java.lang.NoClassDefFoundError错误解决方法,需要的朋友可以参考下
java_Jxl(导入导出Excel).pdf
jxl导出excel加水印 WritableWorkbook、WritableSheet、WritableCellFormat
jxl操作excel说明以及jxl jar包
自己封装的方法,调用 XlHelper.getXl(List<?> voList , Object head , OutputStream ops)方法,直接返回需要的excel,而不需要再去写jxl的方法。第一个参数voList 是excel里的内容,第二个参数head是excel表头。第...
poi jxl 生成EXCEL 报表 POI 用的JAR poi-3.6-20091214.jar jxl 用到的jar jxl-2.6.jar
使用jxl生成excel的通用方法,参数List<?>数据,LinkedHashMap,String>实体类属性名和中文列名的键值对
资源包含:(1)一个txt转为excel Demo(2)将解析出的数据写入excel表格里所需要架包jxl。
java利用jxl工具包操作Excel文件.doc
java实现数据的导入与导出依赖包 jxl.jar
Java-Excel开发包 jxl.jar 可用Java来操作Excel,读取,写入
java_Jxl(导入导出Excel)