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

《Java动态填充Excel模板实战教程》在日常开发中,我们经常需要生成格式统一的Excel文件,比如报表、发票、订单清单、成绩单等,手动创建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>
  • 或下载Spire.Xls.jar并手动将其添加到项目。

2. 准备 Excel 模板文件

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

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

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

Java填充Excel模板的实现方式

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

适用场景说明

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

实现步骤

创建Excel模板

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

Java动态填充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();
}
}

结果文档如图:

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

方法二、使用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动态填充Excel模板实战教程

使用Java填充数据到模板

以下代码展示了如何创建一个结构化表格DataTable,将DataTable数据绑定到模板的Smartjs 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动态填充Excel模板实战教程

Smart Marker附加设置

1. 格式复制

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

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

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

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

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;
HooNyXmxKr 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("分数");
// 添加Smapythonrt 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.getCelHooNyXmxKrlRange("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模板实战教程

.
搜索