使用SpringEL功能动态解析模板Excel来生成Excel

SpringEL可以参考:https://www.cnblogs.com/yangzhilong/p/11282560.html

本文基于POI 3.1.7,spring 5.1.7编写。

由于excel里的#是数字的关键字,所有我使用${}来替换了#字符。

核心帮助类:

package com.longge.util;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.util.CollectionUtils;

/**
 * @author yangzhilong
 * @date 8/01/2019
 */
public class ExcelTemplateWriteUtils {
    
    /**
     * get excel template Workbook
     * @param templateFilePath  eg: static/excelTemplate/xx.xlsx
     * @return
     */
    public static Workbook getWorkbook(String templateFilePath) {
        try {
            InputStream is;
            if(templateFilePath.startsWith("/")) {
                is = ExcelTemplateWriteUtils.class.getResourceAsStream(templateFilePath);
            } else {
                is = new ClassPathResource(templateFilePath).getInputStream();
            }
            return WorkbookFactory.create(is);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    
    /**
     * @param sheet
     * @param templateRowIndex
     * @param list
     */
    public static void fillDataWithTemplate(Sheet sheet, int templateRowIndex, List<? extends Object> list) {
        int tIndex = templateRowIndex;
        Row templateRow = sheet.getRow(templateRowIndex);
        if(CollectionUtils.isEmpty(list)) {
            sheet.removeRow(templateRow);
        } else {
            List<Object> template = new ArrayList<>(templateRow.getPhysicalNumberOfCells());
            List<CellStyle> sytles = new ArrayList<>(templateRow.getPhysicalNumberOfCells());
            templateRow.forEach(cell -> {
                sytles.add(cell.getCellStyle());
                cell.getCellStyle();
                CellType type = cell.getCellTypeEnum();
                if(CellType.NUMERIC.equals(type)) {
                    template.add(cell.getNumericCellValue());
                } else if(CellType.STRING.equals(type)) {
                    String value = cell.getStringCellValue();
                    if(value.startsWith("${")) {
                        value = formatEl(value);
                    }
                    template.add(value);
                } else if(CellType.BLANK.equals(type)) {
                    template.add(null);
                } else {
                    throw new RuntimeException("can't support cell type:" + type.toString());
                }
            });
            ExpressionParser parser = new SpelExpressionParser();
            for(int i=0,len=list.size(); i<len; i++) {
                Object item = list.get(i);
                
                Row newRow = sheet.createRow(tIndex++);
                EvaluationContext context = new StandardEvaluationContext();
                context.setVariable("item", item);
                
                ForEachUtils.forEach(0, template, (index, value) -> {
                    Cell newCell = newRow.createCell(index);
                    newCell.setCellStyle(sytles.get(index));
                    if(null != value) {
                        if (value instanceof String) {
                            String v = (String)value;
                            if(v.startsWith("#")) {
                                v = parser.parseExpression(v).getValue(context, String.class);
                            }
                            newCell.setCellValue(v);
                        } else if(value instanceof Number) {
                            newCell.setCellValue(((Number)value).doubleValue());
                        }
                    }
                });
            }
        }
    }
    
    private static String formatEl(String el) {
        return el.replace("${", "#").replace("}", "");
    }
}

单元测试类:

package com.longge.util;

import static org.junit.Assert.assertEquals;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.junit.Test;

import com.longge.dto.CustomerDto;

/**
 * @author yangzhilong
 * @date 8/01/2019
 */
public class ExcelTemplateWriteUtilsTest {
    @Test
    public void test() throws Exception {
        String path = "util/template.xlsx";
        //String path = "/util/template.xlsx";
        Workbook workbook = ExcelTemplateWriteUtils.getWorkbook(path);
        Sheet sheet = workbook.getSheetAt(0);
        
        List<CustomerDto> list = new ArrayList<>(10);
        for(int i=0; i<10; i++) {
            CustomerDto dto = new CustomerDto();
            dto.setChineseName("name:" + i);
            dto.setCustomerCode("code:" + i);
            dto.setOwnerGroup("group:" + i);
            list.add(dto);
        }
        
        ExcelTemplateWriteUtils.fillDataWithTemplate(sheet, 1, list);
        
        assertEquals(sheet.getPhysicalNumberOfRows(), 11);
        
        workbook.write(new FileOutputStream(new File("C:\\Users\\RYan27\\Desktop\\test\\" + UUID.randomUUID().toString() + ".xlsx")));
        workbook.close();
    }
}

模板文件:

最终生成的文件实例:

 

转载于:https://www.cnblogs.com/yangzhilong/p/11283155.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Spring Boot和EasyPOI导出Excel文件的步骤如下: 1. 在pom.xml文件中添加EasyPOI的依赖: ``` <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>4.2.0</version> </dependency> ``` 2. 创建一个POJO类,用于表示Excel中的每一行数据。 3. 在Controller中创建一个请求处理方法,用于处理导出Excel文件的请求。在该方法中,使用EasyPOI创建Excel文件并将其写入输出流中,然后返回一个ResponseEntity对象,该对象包含Excel文件的数据和响应头信息。 以下是一个示例Controller方法: ``` @GetMapping("/export") public ResponseEntity<byte[]> exportExcel() throws IOException { // 创建Excel文件 List<MyData> dataList = getDataList(); Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), MyData.class, dataList); // 将Excel文件写入输出流中 ByteArrayOutputStream out = new ByteArrayOutputStream(); workbook.write(out); // 设置响应头信息 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDisposition(ContentDisposition.attachment().filename("data.xlsx").build()); return new ResponseEntity<>(out.toByteArray(), headers, HttpStatus.OK); } private List<MyData> getDataList() { // 返回需要导出的数据的集合 } ``` 在这个示例中,我们首先创建了一个MyData类,用于表示Excel中的每一行数据。然后,在Controller中创建了一个请求处理方法,该方法使用EasyPOI创建Excel文件,并将其写入输出流中。最后,我们设置了响应头信息,将Excel文件作为响应体返回给客户端。 希望这个示例能够帮助您理解如何使用Spring Boot和EasyPOI导出Excel文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值