提醒
jxl的版本不要太高,否则会出现数组下标越界如下我使用的2.6.10版本爆出来(会导致你导出文件损坏)
因为writableWorkbook.write();爆出的,dug排查这两个版本,在进行access时候授权设置,原权限名称字节数太大,拷贝时地址越界。如果相应解决只需要自己创建一个WorkbookSettings 并对其变量图三writeAccess变量赋值大小要小于112个byte
图一
图二
通过dug查到jxl默认设置的WorkbookSettings中的writeAccess值,在2.6.3版本中是null,更高版本会有一个很大值。
图三
解决方案1,降低自己的版本直到不会爆出地址下标越界可以使用2.6.3版本亲测有效
解决方案2,就是需要在创建工作簿的时候创建一个WorkbookSettings对应,并对其writeAccess参数进行小于112Byte的字符串进行赋值,我直接给了一个123,也可以
//这个是实现向已有的excel模版写入数据
WritableWorkbook writableWorkbook = null;
OutputStream servletOutputStream = null;
try {
servletOutputStream = response.getOutputStream();
Workbook wb = Workbook.getWorkbook(New FileInputStream(new File("文件名")));//获取原有的工作簿
Workbook wb = Workbook.getWorkbook(new File("文件路径"));//获取原有的工作簿
WorkbookSettings workbookSettings = new WorkbookSettings();
workbookSettings.setWriteAccess("123");
//这个创建是依据于原有的工作簿
writableWorkbook = Workbook.createWorkbook(servletOutputStream,wb,workbookSettings);
WritableSheet sheet1 = writableWorkbook.getSheet(0);//获取原有工作簿中的第一张表
WritableSheet sheet = writableWorkbook.createSheet("第一页", 0);//这个是用来创建一张新表
writableWorkbook.write();
servletOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (inputStream!=null) {
inputStream.close();
}
if (writableWorkbook!=null) {
writableWorkbook.close();
}
if (servletOutputStream!=null) {
servletOutputStream.close();
}
} catch (Exception e1) {
e1.printStackTrace();
}