java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java填充Excel模板

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

作者:SunnyDays1011

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

引言

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

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

为什么选择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 模板。模板中可以包含:

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

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

常见的语法格式包括:

实现步骤

创建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模板的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文