Java使用模板生成Excel报表

前言

由于公司业务经常需要导出Excel报表,原本都是使用POI,每个报表模板都需要写一个方法,导致每次报表有改动,无论大小,都需要重写方法并重新发布。网上找了一圈,不是收费就是功能太少,无法满足业务需求。唯一找到的一个好久没更新,功能也不全,但基本框架能用得上,网址如下:https://excelutils.sourceforge.net

再次基础上,我重建了一个项目,命名为ExcelUtil,在保留原基本结构的前提下,优化修改了大部分的功能,并加入了自己所需的功能,github地址:https://github.com/xuhai19901018/ExcelUtil

ExcelUtil特色

  1. 支持xls,xlsx版本的Excel
  2. 支持循环,且支持循环嵌套,#foreach标签
  3. 支持插入图片,#img标签(本项目新增)
  4. 支持设置打印区域,#print标签(本项目新增)
  5. 支持公式,#formula标签
  6. 支持条件,#if标签
  7. 根据参数自动设置单元格格式(本项目新增)
  8. 支持分页,#page标签
  9. 循环中支持条件格式(本项目新增,待完善)

SpringBoot中使用

maven配置

Jar包已上传Maven中央仓库的snapshots中,首先要现在pom中添加以下内容以搜索snapshots库

<repositories>
    <repository>
        <id>oss-sonatype</id>
        <name>oss-sonatype</name>
        <url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

再引入Jar

<dependency>
    <groupId>io.github.xuhai19901018</groupId>
    <artifactId>ExcelUtil</artifactId>
    <version>1.0.6-SNAPSHOT</version>
</dependency>

两行代码使用ExcelUtil导出报表

ExcelUtils.addValue(value, 10086);
ExcelUtils.export(模板绝对路径, new FileOutputStream(new File(输出绝对路径)));

实践

Excel模板如下

下载模板

代码如下

ExcelUtils.addValue(logo, "D:\\home\\logo.png");

List<Object> pages = new ArrayList<Object>();

for (int i = 0; i < 5; i++) {

    Map<String, Object> page = new HashMap<String, Object>();
    pages.add(page);

    page.put(date, 2022-09-18);
    page.put(in, 100* Math.random());
    page.put(out, 100* Math.random());
    List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
    page.put(rows, rows);

    for (int j = 0; j < 10; j++) {
        Map<String, Object> row = new HashMap<String, Object>();
        rows.add(row);
        row.put(value_1, 10* Math.random());
        row.put(value_2, 10* Math.random());
        row.put(value_3, 10* Math.random());
        row.put(value_4, 10* Math.random());
        row.put(value_5, 10* Math.random());
        row.put(value_6, 10* Math.random());
        row.put(value_7, 10* Math.random());
        row.put(value_8, 10* Math.random());
    }
}

ExcelUtils.addValue(pages, pages);

OutputStream out = new FileOutputStream(new File("D:\\home\\t1.xlsx"));
// 输出Excel
ExcelUtils.export("D:\\home\\s1.xlsx", out);

生成的Excel如下

下载报表

模板讲解

  1. #foreach page in ${pages}
    #foreach标签表示循环一个列表,这边循环的是pages这个list。#foreach标签需要和#end成对使用,#end标签表示循环结束。page表示循环中的元素。
  2. #img ${logo} 5 2 0 5 0 -5
    #img标签表示这里将插入一张图片,#img标签带有7个参数,前三个参数为必要参数。第一个参数为图片的本地绝对路径;第二、三个参数表示图片占据的单元格数量,示例中表示横向为5个单元格,纵向为2个单元格;第四、五个参数表示图片相对于左上角的缩进,第六、七个参数表示图片相对于右下角的缩进,后四个参数可不写,默认为0。
    注:#img标签第二、三个参数表示图片占据的单元格数量,这些参数不会受合并单元格影响。
  3. ${logo} /${page.date}/${page.rows}/${row.value_1}
    取值表达式
  4. ${pageId}/${rowId}
    内置变量,循环中的元素+Id表示序号。
  5. #page
    #page标签表示插入一个分页符
  6. #print 35 1:5
    #print标签表示设置sheet的打印区域,注意:使用#print标签能设置一个矩形的打印区域。打印的开始行为第一行,结束行为#print标签所在行,开始列为#print标签所在列。第一个参数表示打印区域的列数;第二个参数可选,用于设置打印标题行,1:5表示设置1到5行为打印标题行。
  7. 单元格格式
    ExcelUtil会根据所传的值自动设置单元格格式,例如某单元格中填入了数字,则会将单元格类型设置为数值型。如在模板中设置了单元格的格式,生成的报表将完美继承格式,例如小数保留位数、日期的格式化等。此外Excel公式也会保留。
暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇