Springboot 导出Excel文件方式对比与注意事项

Excel导出系列目录:

【Springboot 使用EasyExcel导出Excel文件】
【Springboot 使用EasyExcel导出含图片并设置样式的Excel文件】
【Springboot 使用POI导出Excel文件】
【Springboot 导出Excel文件方式对比与注意事项】

前两篇中,我们使用EasyExcel、POI两种常用的方式实现Excel的导出功能,并且最后我留了三个问题,这次讲解一下:

  1. 为什么不导出.xls后缀的文件?
  2. POI导出与EasyExcel导出相比哪种方式最优呢?
  3. POI导出与EasyExcel导出两种方式有没有需要注意的坑呢?

为什么不导出.xls后缀的文件?

这个一般没有强制,不管是在工作中,一般不会强制让你生成的Excel文件后缀。不同软件对xls后缀的文件兼容性好。如果需要导出.xls后缀的文件,那就见以下代码,修改一下。

根据不同软件的兼容情况,想共同兼容Office与WPS的话,导出后缀xls的文件即可。

EasyExcel导出xls后缀文件

以【Springboot 使用EasyExcel导出Excel文件】文章为例

将导出的文件名修改为.xls后缀即可。

POI导出xls后缀文件

以【Springboot 使用POI导出Excel文件】文章为例

  1. 将导出的文件名修改为.xls后缀
  2. XSSF前缀的类,修改为HSSF前缀。
  3. 插入图片使用的XSSFDrawing类,修改为HSSFPatriarch
  4. 插入图片时使用的XSSFClientAnchorHSSFClientAnchor中的参数有极大的区别,需要特殊注意,具体见下文描述。

POI导出与EasyExcel导出相比哪种方式最优呢?

情况代码实现扩展性
EasyExcel简单不易扩展
POI复杂易扩展

我感觉如果导出的全是文字或者对导出内容样式没有极高的要求,可以优先选EasyExcel导出,否则,选择POI导出

POI导出与EasyExcel导出两种方式有没有需要注意的坑呢?

  1. 因为服务中的前置过滤器处理,导致响应的二进制流下载后无法正常打开文件
  2. 上文中,POI导出时插入图片使用的XSSFClientAnchorHSSFClientAnchor类一定要注意他们的参数差异
  3. 经比对,POI导出的后缀为xlsx后缀有内边距的图片,在Office中打开没问题,但是在WPS打开时右侧与下侧的边距会消失样式有差距

服务过滤器踩坑

为了能在调用服务接口的时候打印出响应体内容,大家一般会继承HttpServletRequestWrapper类,将响应内容取出并打印,但是这个会对响应内容做处理并输出,如果是返回二进制流数据,就会出现问题,我当前的处理方式是如果请求url属于导出接口,那就不使用继承HttpServletRequestWrapper的类接收响应

XSSFClientAnchor参数配置踩坑

用于在xlsx后缀文件中插入图片并可以在单元格中定位图片位置。
如果想实现文章中的图片所在单元格有内边距效果,代码如下:

// row=行号(从0开始),col=列号(从0开始)
XSSFClientAnchor anchor = 
		new XSSFClientAnchor
			(100000, 100000, -100000, -100000, 
			(short) col, row, (short) col + 1, row + 1);

HSSFClientAnchor参数配置踩坑

用于在xls后缀文件中插入图片并可以在单元格中定位图片位置。
如果想实现文章中的图片所在单元格有内边距效果,代码如下:

// row=行号(从0开始),col=列号(从0开始)
HSSFClientAnchor anchor = 
		new HSSFClientAnchor
			(100, 25, 900, 240, 
			(short) col, row, (short) col, row);

导出文件使用不同软件打开有差别

目前发现只有POI导出的xlsx后缀的文件会出现这种问题,发现这种问题的解决方案如下:

  1. 导出excel中的图片不设置内边距,直接覆盖整个单元格
  2. 导出xls后缀的excel文件,就可以让Office与WPS同时兼容样式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值