Java动态填充Excel模板实战教程

 更新时间:2025年07月20日 09:40:09   作者:SunnyDays1011  
在日常开发中,我们经常需要生成格式统一的 Excel 文件,比如报表、发票、订单清单、成绩单等,手动创建 Excel 文件不仅效率低,而且难以保证样式的一致性相比之下,所以本文将介绍如何通过Java实现Excel模板的数据填充与自动化导出,需要的朋友可以参考下

引言

在日常开发中,我们经常需要生成格式统一的 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>

2. 准备 Excel 模板文件

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

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

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

Java填充Excel模板的实现方式

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

适用场景说明

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

实现步骤

创建Excel模板

新建一个Excel模板文档,在模板中预设占位符文字,例如{姓名}{年龄}{职位} 等:

使用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();
    }
}

结果文档如图:

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

什么是Smart Marker(智能标记)

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

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

Smart Marker语法说明

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

常见的语法格式包括:

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

实现步骤

创建Excel模板

新建一个Excel模板文档,并插入以下Smart Marker智能标记:

使用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();
    }
}

结果文档如图:

Smart Marker附加设置

1. 格式复制

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

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

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();
    }
}

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

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

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

总结

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

以上就是Java动态填充Excel模板实战教程的详细内容,更多关于Java填充Excel模板的资料请关注脚本之家其它相关文章!

相关文章

  • java跨域cookie失效问题及解决

    java跨域cookie失效问题及解决

    文章介绍了现代Web应用中前后端分离架构下跨域请求和Cookie处理的问题,包括现象描述、跨域Cookie的原理、解决方案(如Java后端、前端Vue、Nginx配置,以及使用window.localStorage存储数据),以及实践案例和常见问题排查
    2025-01-01
  • Java实现父子线程共享数据的几种方法

    Java实现父子线程共享数据的几种方法

    本文主要介绍了Java实现父子线程共享数据的几种方法,包括直接共享变量、使用 ThreadLocal、同步机制、线程安全的数据结构以及ExecutorService,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • java web实现分页查询实例方法

    java web实现分页查询实例方法

    在本篇文章里我们给大家分享了java web实现分页查询的详细方法知识点,有需要的朋友们参考学习下。
    2018-10-10
  • SpringBoot 动态配置Profile环境的方式

    SpringBoot 动态配置Profile环境的方式

    这篇文章主要介绍了SpringBoot 动态配置Profile环境的方式,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • Java字节流和字符流及IO流的总结

    Java字节流和字符流及IO流的总结

    本文主要将Java中的IO流进行了梳理,通过将其分成字节流和字符流,以及输入流和输出流分别统计,来建立一个对 Java中IO流全局的概念,通过一些实例来演示了如何通过不同类型的流来组合实现强大灵活的输入和输出,最后介绍了同时支持输入和输出的 RandomAccessFile。
    2021-04-04
  • 一文带你搞懂Java单例模式

    一文带你搞懂Java单例模式

    单例就是单实例的意思,即在系统全局,一个类只创建一个对象,并且在系统全局都可以访问这个对象而不用重新创建。本文将通过示例为大家详细讲解Java单例模式的使用,需要的可以参考一下
    2022-11-11
  • MyBatis结果映射(ResultMap)的使用

    MyBatis结果映射(ResultMap)的使用

    在MyBatis中,结果映射是实现数据库结果集到Java对象映射的核心,它不仅支持简单的字段映射,还能处理字段名不一致、嵌套对象和集合映射等复杂场景,通过ResultMap,开发者可以灵活定义映射关系,以适应各种需求,感兴趣的可以了解一下
    2024-09-09
  • Java如何获取视频文件的视频时长

    Java如何获取视频文件的视频时长

    文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案
    2025-02-02
  • Java去除字符串中的空格实现方式

    Java去除字符串中的空格实现方式

    这篇文章主要介绍了Java去除字符串中的空格实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • 【面试】Spring事务面试考点吐血整理(建议珍藏)

    【面试】Spring事务面试考点吐血整理(建议珍藏)

    本文是小编给大家收藏整理的Spring事务面试考点,非常不错,值得收藏,感兴趣的朋友参考下吧
    2019-04-04

最新评论