利用jxl工具实现写入已有的excel模板数据地址下标越界问题

提醒

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();
            }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值