按照模板导出复杂样式的excel

导出excel通常使用的是apache poi,但是poi的api相当复杂,所以当导出的excel样式比较复杂时,写起来就比较头疼了,这里推荐使用easypoi, 可以很方便的根据模板来导出复杂excel

文档地址: 1.1 介绍 - Powered by MinDoc

我们要实现如图所示效果,该怎么实现呢

 第一步,导入依赖

<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-spring-boot-starter</artifactId>
    <version>4.5.0</version>
</dependency>

第二步,新建excel模板,然后写入内容

如果是变量,就用双大括号包裹变量,如果是列表,则使用$fe指令,maplist是变量名,t.id是要输出的字段,最后以t.hdje}}结果表示结束

模板指令文档:EasyPoi教程_V1.0

示例模板下载地址:  src/test/resources/WEB-INF/doc/专项支出用款申请书_map.xls · 悟耘开源/easypoi-test - Gitee.com

 

第三步,获取数据,写入输出流

public class ExportController extends BaseController {
    @Operation(summary = "导出支出用款申请书")
    @GetMapping("exportPayForm")
    public void exportPayForm(HttpServletRequest request, HttpServletResponse response) throws IOException {
        TemplateExportParams params = new TemplateExportParams(
                "template/专项支出用款申请书_map.xls");
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("date", "2014-12-25");
        map.put("money", 2000000.00);
        map.put("upperMoney", "贰佰万");
        map.put("company", "执笔潜行科技有限公司");
        map.put("bureau", "财政局");
        map.put("person", "JueYue");
        map.put("phone", "1879740****");
        List<Map<String, String>> listMap = new ArrayList<Map<String, String>>();
        for (int i = 0; i < 4; i++) {
            Map<String, String> lm = new HashMap<String, String>();
            lm.put("id", i + 1 + "");
            lm.put("zijin", i * 10000 + "");
            lm.put("bianma", "A001");
            lm.put("mingcheng", "设计");
            lm.put("xiangmumingcheng", "EasyPoi " + i + "期");
            lm.put("quancheng", "开源项目");
            lm.put("sqje", i * 10000 + "");
            lm.put("hdje", i * 10000 + "");

            listMap.add(lm);
        }
        map.put("maplist", listMap);

        Workbook workbook = ExcelExportUtil.exportExcel(params, map);
        addFileHeader(request, response, "专项支出用款申请书.xls", "application/octet-stream");
        workbook.write(response.getOutputStream());
    }
}

public void addFileHeader(HttpServletRequest request, HttpServletResponse response,     
    String fileName, String contentType) {
        try {
            String agent = request.getHeader("USER-AGENT").toLowerCase();
            response.setContentType(contentType);
            String codedFileName = java.net.URLEncoder.encode(fileName, "UTF-8");
            if (agent.contains("firefox")) {
                response.setCharacterEncoding("utf-8");
                response.setHeader("content-disposition", "attachment;filename=" + new String(fileName.getBytes(), "ISO8859-1"));
            } else {
                response.setHeader("content-disposition", "attachment;filename=" + codedFileName);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

 

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-25 21:54:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-25 21:54:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-25 21:54:02       82 阅读
  4. Python语言-面向对象

    2024-04-25 21:54:02       91 阅读

热门阅读

  1. socket编程实现TCP通信

    2024-04-25 21:54:02       40 阅读
  2. Day20-Python基础学习之正则表达式和递归(完结)

    2024-04-25 21:54:02       33 阅读
  3. css八股

    2024-04-25 21:54:02       33 阅读
  4. verilog 语法及特点

    2024-04-25 21:54:02       35 阅读
  5. Android高手过招之浮动搜索框(SearchManager)

    2024-04-25 21:54:02       36 阅读
  6. 黑马点评学习笔记总结

    2024-04-25 21:54:02       38 阅读
  7. SQL之CASE WHEN用法详解

    2024-04-25 21:54:02       31 阅读
  8. C++ day3

    C++ day3

    2024-04-25 21:54:02      34 阅读
  9. 传输层协议

    2024-04-25 21:54:02       24 阅读
  10. 跨域问题+解决跨域express

    2024-04-25 21:54:02       37 阅读
  11. 如何使用PHP进行邮件发送?

    2024-04-25 21:54:02       34 阅读
  12. 【MHA】MySQL高可用MHA介绍2-安装,配置,要求与限制

    2024-04-25 21:54:02       24 阅读