Java动态填充Excel模板实战教程:自动化报表生成方案

Excel模板引擎的魔法:从Java对象到动态报表的自动化之旅 本文深入探讨了如何利用Java技术栈(特别是EasyExcel和POI)构建高性能、可维护的动态报表生成系统。通过将数据与样式分离,使用模板定义报表结构,实现从Java对象到Excel报表的自动化转换,大幅提升开发效率和灵活性。文章对比了POI和EasyExcel的优劣,并提供了实战案例和性能优化技巧,适用于金融、电商等多个行业的报表需求。 阅读详情

在日常开发中,我们经常需要生成格式统一的 Excel 文件,比如报表、发票、订单清单、成绩单等。手动创建 Excel 文件不仅效率低,而且难以保证样式的一致性。相比之下,使用预先设计好的 Excel 模板,通过Java代码自动填充数据,既省时省力,又能确保输出文档专业规范。

这种“基于模板生成Excel”的方式,特别适用于处理结构固定、数据来源动态的场景,比如从数据库导出销售记录、根据用户输入生成报价单、批量生成发票等。本文将介绍如何通过Java实现Excel模板的数据填充与自动化导出。主要涵盖内容如下:

  • 为什么选择Java编程方式填充Excel模板
  • 准备工作
  • Java填充Excel模板的实现方式
    • 方法一、替换模板中的占位符文本
    • 方法二、使用Smart Marker动态插入数据
    • 进阶示例:填充自定义数据对象
    • 将导出结果保存为PDF(可选操作)

为什么选择Java编程方式填充Excel模板

相比手动填充,采用Java编程方式按模板生成Excel文件具有多方面的优势:

  • 提高效率:快速处理大量数据,节省人力和时间成本。
  • 保持样式统一:继承模板样式,确保文档美观、规范。
  • 支持动态数据:自动填充来自数据库或接口的实时数据。
  • 便于批量生成:轻松创建多份文档,如报表、发票等。
  • 易于集成:可嵌入业务系统,实现自动化文档处理流程。
  • 降低错误率:避免手动输入失误,提高数据准确性。

准备工作

1. 引入 Spire.XLS for Java 库

Spire.XLS for Java是一款功能全面的 Excel 操作类库,支持读取、编辑、生成、格式化以及导出 Excel 文档。在开始前,确保项目中已正确引入该库:

  • 如果使用 Maven,可添加如下依赖(当前版本号15.6.3):
    <repositories>
        <repository>
            <id>com.e-iceblue</id>
            <name>e-iceblue</name>
            <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
        </repository>
    </repositories>
    
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.xls</artifactId>
        <version>15.6.3</version>
    </dependency>
  • 或下载 Spire.Xls.jar 并手动将其添加到项目。

2. 准备 Excel 模板文件

根据业务需求,设计好 Excel 模板。模板中可以包含:

  • 占位符文本:用于简单替换;
  • 或Smart Marker:用于绑定结构化数据。

模板应预设好样式、布局和表头,确保填充后文档整洁规范。

Java填充Excel模板的实现方式

方法一、替换模版中的占位符文本

适用场景说明

当模板结构固定,仅需填充个别字段(如姓名、职位、日期等)时,可在模板中设置占位符文字,通过程序自动查找并替换这些占位符,实现数据的动态填充。

实现步骤
  1. 创建Excel模板
    新建一个Excel模板文档,在模板中预设占位符文字,例如{姓名}、{年龄}、{职位} 等:Excel模板-含占位文字
  2. 使用Java查找并替换模板中的占位符文字

以下代码展示了如何在模板中查找占位符文字,并将其替换为实际数据:

import com.spire.xls.*;

import java.awt.*;
import java.util.EnumSet;
import java.util.HashMap;

public class ReplacePlaceholderText {
    public static void main(String[] args) {
        // 打开Excel模板
        Workbook workbook = new Workbook();
        workbook.loadFromFile("占位符模板.xlsx");

        // 获取指定工作表(工作表索引从0开始)
        Worksheet sheet = workbook.getWorksheets().get(0);

        // 定义要替换的占位符及对应值
        HashMap<String, Object> replacements = new HashMap<>();
        replacements.put("{姓名}", "张立强");
        replacements.put("{年龄}", 28);
        replacements.put("{职位}", "财务总监");

        // 在工作表中查找占位符并替换为对应值
        for (String placeholder : replacements.keySet()) {
            Object value = replacements.get(placeholder);
            CellRange[] foundRanges = sheet.findAll(placeholder, EnumSet.of(FindType.Text), EnumSet.of(ExcelFindOptions.MatchEntireCellContent));
            for (int i = 0; i < foundRanges.length; i++) {
                CellRange cell = foundRanges[i];
                cell.setValue2(value);
                // 高亮替换后的单元格 (可选)
                cell.getStyle().setColor(Color.YELLOW);
            }
        }

        // 保存结果文件
        workbook.saveToFile("替换占位符.xlsx", ExcelVersion.Version2016);
        workbook.dispose();
    }
}

结果文档如图:
Java 替换模板中的占位文字生成Excel文档

方法二、使用Smart Marker动态插入数据

什么是Smart Marker(智能标记)

Smart Marker 是一种用在Excel 模板中的特殊语法标识符,用于将外部数据源动态填充到工作表的指定位置。它在模板中以占位符的形式存在,程序运行过程中会根据绑定的数据源自动替换为实际内容,从而实现批量生成报表、订单、清单等文档。

借助 Smart Marker,开发者可快速、灵活地将数据自动写入 Excel,提高文档生成的效率和自动化程度。

Smart Marker语法说明

Smart Marker的写法会根据所绑定的数据类型有所不同。每个标记必须单独放置在一个单元格中,一个单元格中只能包含一个智能标记,不能与其他文本混合使用,以确保正确解析和填充数据。

常见的语法格式包括:

  • &=变量名:将一个单一值插入当前单元格。适用于填充如姓名、日期或编号等基础数据项。
    示例:&=姓名,表示将姓名变量的值插入该单元格。
  • &=集合对象:将一个集合对象中的元素按垂直方向(即逐行)填充到多个单元格中。适用于批量插入记录,如员工姓名、产品名称或订单编号等。
    示例:&=Language,表示将Language集合中的每一项按垂直方向依次填入各行。
  • &=数据源.字段名:用于绑定结构化数据源中的具体字段。数据源可以是数据库查询结果、对象集合、DataTable 等。此语法适用于需要从复杂数据结构中提取字段值进行批量填充的场景。
    示例:&=Student.Name ,表示从名为 Student 的数据源中提取 Name 字段的数据并逐行填充。
实现步骤
  1. 创建Excel模板
    新建一个Excel模板文档,并插入以下Smart Marker智能标记:

    Excel模板-含Smart Marker智能标记
  2. 使用Java填充数据到模板
    以下代码展示了如何创建一个结构化表格DataTable,将DataTable数据绑定到模板的Smart Marker智能标记,并应用Smart Marker来填充数据到模板:
    import com.spire.xls.ExcelVersion;
    import com.spire.xls.Workbook;
    import com.spire.xls.Worksheet;
    import com.spire.xls.data.table.DataColumn;
    import com.spire.xls.data.table.DataRow;
    import com.spire.xls.data.table.DataTable;
    
    public class ApplySmartMarker {
        public static void main(String[] args) throws Exception {
            // 加载 Excel 模板
            Workbook workbook = new Workbook();
            workbook.loadFromFile("智能标记模板.xlsx");
    
            // 获取第一个工作表
            Worksheet sheet = workbook.getWorksheets().get(0);
    
            // 创建一个新的 DataTable 对象,并命名为 "data"
            DataTable dt = new DataTable();
            dt.setTableName("data");
    
            // 添加三列:姓名、年龄、职位
            dt.getColumns().add(new DataColumn("姓名"));
            dt.getColumns().add(new DataColumn("年龄"));
            dt.getColumns().add(new DataColumn("职位"));
    
            // 创建数据行
            DataRow row1 = dt.newRow();
            row1.setString("姓名", "张三");
            row1.setString("年龄", "28");
            row1.setString("职位", "销售经理");
    
            DataRow row2 = dt.newRow();
            row2.setString("姓名", "李四");
            row2.setString("年龄", "32");
            row2.setString("职位", "市场主管");
    
            DataRow row3 = dt.newRow();
            row3.setString("姓名", "王五");
            row3.setString("年龄", "25");
            row3.setString("职位", "技术支持");
    
            // 添加数据行到表格中
            dt.getRows().add(row1);
            dt.getRows().add(row2);
            dt.getRows().add(row3);
    
            // 绑定表格的数据
            workbook.getMarkerDesigner().addDataTable("data", dt);
    
            // 应用Smart Marker,填充数据
            workbook.getMarkerDesigner().apply();
    
            // 自动调整行高和列宽 (可选)
            //sheet.getAllocatedRange().autoFitRows();
            //sheet.getAllocatedRange().autoFitColumns();
    
            // 保存结果文件
            workbook.saveToFile("应用智能标记.xlsx", ExcelVersion.Version2016);
            workbook.dispose();
        }
    }
    结果文档如图:Java 使用Smark Marker动态插入数据到Excel模板

    Smart Marker附加设置

    1. 格式复制

    从以上结果文档中可以看出,后两行的格式与前两行不同,没有居中,这是因为在插入数据的时候没有复制格式。要解决这一问题,可以在模版的Smart Marker中添加add:styles参数,如下图所示:

    Smart Marker格式参数设置

    保存模板文档,再执行代码,结果文档如图:

    Smart Marker格式设置效果

    2. 数据填充方向设置

    默认情况下,Smart Marker的数据填充方向为垂直方向。在模板的Smart Marker中添加horizontal参数,即可调整填充方向为水平方向。

    示例:&=data.姓名(horizontal)

进阶示例:填充自定义数据对象

在实际开发中,除了使用基础数据类型和表格数据,我们有时还需要将自定义的对象集合填充到 Excel 模板中。

下面的代码展示了如何创建一个 Excel 模板,定义自定义数据对象,并通过 Smart Marker 将对象属性的数据插入到模板中:

import com.spire.xls.*;
import java.util.ArrayList;

public class BindCustomObjects {
    // 定义一个Student类
    public static class Student {
        private String Name;
        private String Course;
        private int Score;
        // 定义构造函数,参数包括:学生姓名、课程、分数
        public Student(String name, String course, int score) {
            this.Name = name;
            this.Course = course;
            this.Score = score;
        }
    }
    public static void main(String[] args) {
        // 创建Excel模板文档
        Workbook workbook = new Workbook();

        // 获取第一个工作表
        Worksheet sheet = workbook.getWorksheets().get(0);

        // 添加表头
        sheet.getCellRange("A1").setValue("姓名");
        sheet.getCellRange("B1").setValue("课程");
        sheet.getCellRange("C1").setValue("分数");

        // 添加Smart Marker智能标记
        sheet.getCellRange("A2").setValue("&=Student.Name(add:styles)");
        sheet.getCellRange("B2").setValue("&=Student.Course(add:styles)");
        sheet.getCellRange("C2").setValue("&=Student.Score(add:styles)");

        // 设置单元格格式
        sheet.getCellRange("A1:C2").getCellStyle().setHorizontalAlignment(HorizontalAlignType.Center);
        sheet.getCellRange("A1:C1").getCellStyle().getFont().isBold(true);
        sheet.getCellRange("A1:C1").getCellStyle().getFont().setSize(12);
        sheet.getCellRange("A2:C2").getCellStyle().getFont().setSize(11);

        // 创建一个ArrayList来存储Student对象
        ArrayList<Student> list = new ArrayList<>();

        // 添加3个学生对象
        list.add(new Student("乔治", "语文", 62));
        list.add(new Student("佩琪", "数学", 88));
        list.add(new Student("艾米丽", "英语", 95));

        // 绑定ArrayList数据到Smart Marker
        workbook.getMarkerDesigner().addParameter("Student", list);

        // 应用Smart Marker,填充数据
        workbook.getMarkerDesigner().apply();

        // 保存结果文件
        workbook.saveToFile("添加自定义数据类型.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

Java 导入自定义数据对象到Excel

将导出结果保存为PDF(可选操作)

要将填充后的Excel模板保存为PDF,只需使用Workbook.saveToFile()方法并指定格式为FileFormat.PDF即可:

workbook.saveToFile("添加自定义数据类型.pdf", FileFormat.PDF);

Java 将导出结果Excel文档保存为PDF

总结

通过 Java 编程方式填充 Excel 模板,可以高效地生成样式一致、数据准确的文档,尤其适用于批量生成、自动化导出等场景。借助 Java和Spire.XLS库,开发者无需手动构建复杂表格结构,即可灵活填充各类动态数据,提升办公自动化水平和开发效率。

java hutool poi 基于excel模板文件,填充数据的思路 基于excel模板文件,填充数据的思路有个excel模板文件,有列头及说明,可下载模板文件,填充数据后上传,也可以下载已上传所有数据的excel,这就相当于在模板文件的基础上填充数据,填充完还不能影响模板文件。在内存中,将模板文件复制一份,不落到磁盘,然后填充数据,输出到response中。.................. 阅读详情

相关推荐

基于java + easyExcel实现模板填充生成动态模板并设置指定单元格为下拉框样式

easyExcel模板填充实现动态模板生成

qq_40041471的博客 5990

Java根据excel模板填充导出excel

{ }中数据用于填充。

weixin_54357730的博客 2179

JavaExcel模板渲染源码解析:动态数据填充与样式控制

微服务网关限流策略 基于 Redis 的令牌桶与漏桶算法实现-摘要

2401_85077271的博客 789

Java 数据 07:Excel 模板导出(EasyExcel 填充动态数据)

本文介绍了阿里巴巴开源的EasyExcel库在Java项目中的应用,重点讲解了如何利用Excel模板实现动态数据导出。EasyExcel相比传统Apache POI具有高性能、低内存占用和易用性强的优势。文章详细说明了环境配置、模板创建方法以及数据填充技术,并提供了员工信息导出的示例模板和Java实体类定义。通过EasyExcel的模板填充功能,开发者可以轻松生成格式统一、样式专业的Excel报表,适用于财务报表、订单详情等需要固定格式的业务场景。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Java动态报表生成的“开挂级”秘籍:3大核心框架+5个实战场景,效率提升300%!

Java动态报表:从Excel手动操作到全栈自动化的革命 传统的Excel手动报表耗时易错,而Java生态通过JasperReports、Apache POI、iText三大框架实现数据到可视化的无缝跃迁: 核心优势:模板化设计(XML/Excel/PDF)、实时数据绑定(JDBC/内存数据源)、多格式输出(PDF/Excel/HTML) 性能对比:JasperReports适合复杂报表,Apache POI轻量级Excel操作,iText提供PDF像素级控制 实战场景:财务报表自动化、员工绩效分页导出、电

java专栏 1872

Easy Excel——从模板到报表:实战填充技巧全解析

本文全面解析Easy Excel在报表填充中的实战技巧,涵盖模板设计、对象映射、批量处理等核心功能。通过实际案例展示如何将复杂报表生成时间从4小时压缩到15分钟,并分享性能优化与特殊场景处理经验,帮助开发者高效利用Easy Excel提升工作效率。

weixin_30655569的博客 358

java动态向excel模板写数据、画图技巧

工作中常需要生成一些Excel报表、Excel报告。而在用程序生成Excel文件时一般有2种方法: 第一种:直接创建一个空的excel,然后往里面写入数据内容。这种方法一般只用于做比较简单的excel,针对需要调整各种格式及样式的excel,写代码操作难度比较大。 第二种:先自己编辑好模板,固定的内容先写好在模板中,动态的内容留空给程序填充,然后用程序读入模板文件去填充其他内容。这种方法可以适用于复杂内容的Excel生成,包括各种复杂的绘图。 这里主要讲述如何用java实现第二种生成方式。

lanhezhong的博客 3573

JAVA - EasyExcel动态填充Excel模板与样式优化实战

本文详细介绍了如何使用JAVA和EasyExcel实现动态填充Excel模板与样式优化的实战技巧。通过对比Apache POI,展示了EasyExcel在内存占用和性能上的优势,并提供了从环境搭建、数据绑定到样式定制的完整解决方案。文章特别强调了处理合并单元格、动态样式调整以及百万级数据导出的实用技巧,帮助开发者高效完成复杂Excel导出需求。

weixin_28716181的博客 413

Java Excel模板动态填充进阶指南:从基础替换到复杂数据绑定

本文详细介绍了Java中Excel模板动态填充的进阶技巧,从基础的占位符文本替换,到利用Smart Marker进行智能数据绑定,再到处理自定义对象集合等复杂场景。通过对比不同方法的优缺点,提供了完整的自动化报表生成方案,帮助开发者高效实现数据导出与报表生成,显著提升工作效率。

weixin_29230773的博客 229

Java动态填充Excel模板:Apache POI实战与性能优化指南

在数据处理与报表生成领域,Excel模板动态填充是一项高频需求,它实现了样式与数据的关注点分离。其核心原理是通过程序化方式定位模板中的特定单元格或区域,并将业务数据精准注入,同时保持原有的复杂样式与格式。这项技术的核心价值在于大幅提升了报表开发的效率和可维护性,避免了手动重建样式的繁琐与错误。它广泛应用于财务对账、业务报表导出、数据批量打印等需要保持专业文档格式的场景。本文聚焦于使用Apache POI这一Java主流库,深入探讨如何高效实现模板读取、数据映射、样式继承等关键步骤,并针对“OutOfMemo

weixin_34101229的博客 304

java easyexcel 基于excel模板填充数据 2023

基于excel模板填充数据,并下载,以及合计转大写工具类。

m0_47484034的博客 6789

多场景easyExcel根据模板填充excel文件(三)

按照上面的案例,日期和统计这两行和最后一个表头是对齐的,如果想要自定义位置,可以用下面这个案例.代码// list 后面还有个统计 想办法手动写入// 这里偷懒直接用list 也可以用对象//todo// 这个统计想放在第几列,这里就是第几个.例:我想把统计:1000放在第8列,前面strList.add(null)就放7个strList.add("统计:1000");//这是write模板效果。

菜菜小菠菠的博客,专注于后端技术 8222

java使用 POI Excel模板导出数据

NULL 博文链接:https://wjsqiuqiu201305143544.iteye.com/blog/1870663

Java读取Excel模板并动态添加数据

在项目开发中,会经常遇到报表的需求;遇到报表后,不可避免的会与Excel打交道。那么面对复杂的表头或者其他要求要怎么处理?我们可以通过模板文件来进行解决!

丹丹的后花园 8903

ctftools-all-in-one使用说明

OAEP (Optimal Asymmetric Encryption Padding) 是一种用于RSA加密的填充方案,目的是提高RSA加密的安全性。在CTF比赛中,如果模数N的两个因子比较接近,使用"费马分解(N)"可能会更快地得到结果;OAEP 是 RSA 的一种标准填充方式(在 PKCS#1 v2.0+ 中定义),因此这类题目本质上仍是 RSA 题,但。,导致你不能直接用常规的 RSA 解密公式 �=�� mod �m=cdmodN 得到有意义的明文。如果你在 CTF 中遇到 RSA 题,

2501_91682449的博客 1692

TC275-AutoSAR实战:Davinci Cfg多核OS配置与调试技巧

本文详细介绍了在TC275芯片上使用Davinci Cfg工具进行AutoSAR多核操作系统配置的实战步骤与调试技巧。内容涵盖从导入arxml文件的常见“坑”开始,到配置Det、EcuC、创建多核OS实例、关联OS应用、创建任务与设置优先级调度,最后分享了利用Det日志、调试器多核视图及处理核间通信与缓存一致性等关键调试方法,旨在帮助开发者高效完成复杂车载ECU软件集成。

weixin_29219189的博客 487

Java操作Excel之JXL (填充EXCEL模板)

前阵子接到一个项目,其中有个功能就需要把数据填充到 绘制好的EXCEL表单里面,在网上搜集了一些东西之后就开始做了,呵呵。 *********************************************先看看转载的这部分************************************************************* Java操作Excel之理解JXL--读...

My Way 1219

一文详细讲解CRM系统(附架构图、流程、功能介绍)

专为中小企业量身打造高性价比的数字化转型路径!企业如何用CRM才能真正做到降本增效?今天,就用一文讲清这些问题!读完本文,你将清楚得了解CRM的概念、框架、流程、功能、企业成功案例,文末还有常见问题解答。

Dabeishandong的博客 9912
上一篇: Java将Word、Excel、PDF和PPT转换为OFD格式(含代码示例)
下一篇: C# 读取 PowerPoint(PPT 和 PPTX)文件内容详解
SunnyDays1011
博客等级 码龄2年 210粉丝 192原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值