核心依赖

需求

导出多个表格,包含图片,类似商品标签

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;

    @Test
    public 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()));

Jonny
25 声望1 粉丝

窃格瓦拉从入门到放弃