核心依赖
需求
导出多个表格,包含图片,类似商品标签
1.配置模板
创建一个xlsx的模板文件,配置如下
- 该模板进行遍历了两次,因为我想要导出的数据分为两列展示,左右布局,一个循环实现不了,所以采用两个循环奇偶遍历展示
2.引入依赖
<dependency><groupId>org.jxls</groupId><artifactId>jxls</artifactId><version>2.12.0</version>
</dependency>
<dependency><groupId>org.jxls</groupId><artifactId>jxls-poi</artifactId><version>2.12.0</version>
</dependency>
3.创建测试类
package com.example;import org.example.SpringBootWsDemoApplication;
import org.example.domain.vo.ProductVO;
import org.junit.jupiter.api.Test;
import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.Resource;
import org.springframework.test.context.TestPropertySource;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;@SpringBootTest(classes = SpringBootWsDemoApplication.class)
@TestPropertySource(properties = {"app.template.path=classpath:/templates/jxl_temp_img2.xlsx"})
public class ExportImg2Test {@Value("${app.template.path}")private Resource templateResource;@Testpublic void test() throws IOException {List<ProductVO> batch = ProductVO.batchToJxls();// 创建上下文并设置数据Context context = new Context();context.putVar("products", batch);// 加载模板OutputStream os = new FileOutputStream("output_img.xlsx");// 获取模板文件输入流// InputStream templateStream = ExportTest.class.getResourceAsStream("templates/jxl_temp.xlsx");// JxlsHelper.getInstance().processTemplate(templateStream, os, context);// imageType图片类型默认是PNG,支持:PNG, JPEG, EMF, WMF, PICT, DIB,模板中src是model中传入的字节数组byte[]JxlsHelper instance = JxlsHelper.getInstance();instance.processTemplate(templateResource.getInputStream(), os, context);}}
4.效果图
注意事项
-
模板文件放到
src/main/resources
下本地开发工具直接运行可以访问,打包jar后也许访问不到,这种情况如果出现了的话,要么就把模板文件放到服务器本地磁盘,通过文件路径读取,而不是从demo.jar!/BOOT-INF/classes!/templates/jxls_temp.xlsx -
导出需要的是一个图片文件的byte数组
// InputStream imageInputStream = new FileInputStream("D:/qr.jpg");File file = ResourceUtils.getFile("classpath:static/img/qr.jpg");
// 使用工具方法把流转成byte数组
byte[] imageBytes = Util.toByteArray(Files.newInputStream(file.toPath()));