【2023】Utilice el marco easyexcel de alibaba para implementar tablas de Excel y descargas de códigos QR (simple, eficiente, sin código redundante, todo con comentarios)

introducción básica

Los marcos más famosos para generar Excel incluyen Apache poi y jxl. Pero todos tienen un problema grave que consume mucha memoria: POI tiene una API en modo SAX que puede resolver algunos problemas de desbordamiento de memoria hasta cierto punto, pero POI todavía tiene algunos defectos, como la descompresión y el almacenamiento después de la descompresión de Excel versión 07. Se hace en la memoria y el consumo de memoria sigue siendo muy grande. easyexcel reescribió el análisis de poi de la versión 07 de Excel, que puede reducir la memoria de aproximadamente 100 M a un nivel de KB para un Excel de 3 M usando POI sax, y no importa cuán grande sea el excel, no habrá desbordamiento de memoria. La versión 03 se basa en POI sax modo. La conversión del modelo está encapsulada en la capa superior para que sea más fácil y conveniente para los usuarios. Easyexcel de Alibaba se encapsula aún más sobre esta base, haciéndolo más operable.

1. Agregar dependencias

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.0</version>
        </dependency>
        <!--二维码需要使用到的-->
                  <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.4.1</version>
        </dependency>
	<!--阿里巴巴easyexcel工具-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.6</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel-core</artifactId>
            <version>3.1.1</version>
        </dependency>

2. plantilla de excel

Para
las plantillas de llamada de exportación, la interpolación de variables ordinarias se realiza mediante {var} y la lista es {.var}.
Insertar descripción de la imagen aquí

3. Clase de entidad modelo

@Data
public class DeliverCardVO {
    
    
    private String workOrderCode;
    private byte[] qrCode;
    private String productCode;
    private String productName;
}

3.5 Código de implementación específico del controlador

Por simplicidad y conveniencia en teoría, no se escriben por separado. Durante el proceso de desarrollo real, parte del código se puede encapsular en clases de herramientas para facilitar la llamada;

@RestController
@RequestMapping("/token")
public class BasicController {
    
    



  @PostMapping("/qrCode")
    public void prCode(HttpServletResponse response){
    
    
        File file = new File("workOrder模板.xlsx");    //使用的模板(使用的相对地址)
       final String fileName = "workOrder";   //文件名
        try {
    
    
//         设置请求头
//              设置响应内容编码
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
//              使用 UTF-8 编码对文件名进行编码
            String encodedFileName = URLEncoder.encode(fileName, "UTF-8");
            encodedFileName = encodedFileName.replace("+", "%20");  // 替换空格字符

            response.setHeader("Content-Disposition", "attachment; filename=" + encodedFileName + ".xlsx");

//            lombok的资源关闭注解,可以在使用完毕时自动关闭
            @Cleanup ServletOutputStream outputStream = response.getOutputStream();
//              用来写入Excel的文件工具类,底层引用了POI实现
            @Cleanup("finish") ExcelWriter excelWriter = EasyExcel.write(outputStream)
                    .excelType(ExcelTypeEnum.XLSX)
                    .withTemplate(file).build();

//            配置sheet参数(因为是引用的模板,实际配置sheet名称不会生效,会使用的模板的名称)
            WriteSheet writeSheet = EasyExcel.writerSheet(0, "test01").build();

//              集合列表
            List<DeliverCardVO> list= new ArrayList<>();
            for (int i = 0; i < 10; i++) {
    
    
                DeliverCardVO deliverCardVO = new DeliverCardVO();
                deliverCardVO.setProductCode("100010A"+i);
                deliverCardVO.setProductName("张三"+i);
                deliverCardVO.setWorkOrderCode("1831783812A"+i);
//                添加二维码,把二维码转为byte[]
                byte[] qrCode = QrCodeUtil.generatePng(deliverCardVO.getProductCode() + "-" + deliverCardVO.getWorkOrderCode(),
                        QrConfig.create().setCharset(Charset.forName("GBK")));
                deliverCardVO.setQrCode(qrCode);
                list.add(deliverCardVO);
            }
//              二维码配置类
            QrConfig qrConfig = QrConfig.create();
            qrConfig.setImg("D:\\1zheng\\test\\token\\mode01\\a1.jpg");  //设置二维码图片
            qrConfig.setCharset(Charset.forName("GBK"));  //设置编码
            qrConfig.setForeColor(new Color(115,155,208));  //设置前景色  依赖为(import java.awt.Color;)我这边默认引用的是另外一个路径的同名的,找了好一会原因
//            qrConfig.setBackColor(new Color(0,0,0));

            byte[] homepage = QrCodeUtil.generatePng("https://blog.csdn.net/weixin_52315708",qrConfig);  //添加二维码内容,可以为链接也可以是数据
                    
            HashMap<String, Object> map = new HashMap<>();
            map.put("date",new Date());
            map.put("sum",list.size());
            map.put("homepage",homepage);
//            添加普通遍历的值
            excelWriter.fill(map,writeSheet);

// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.FALSE).build();
//            添加列表的值
            excelWriter.fill(list,fillConfig ,writeSheet);
            excelWriter.finish();
        } catch (IOException e) {
    
    
            e.printStackTrace();

        }
    }
}

4. Utilice el cartero para realizar la prueba.

El encabezado de la solicitud se puede agregar al realizar la solicitud, porque es una prueba y el backend agrega los datos directamente.
Insertar descripción de la imagen aquí

5. Realización del efecto EXCELD impreso final.

Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_52315708/article/details/131814241
Recomendado
Clasificación