首页 > 编程语言 >使用Java填充Word模板的方法详解

使用Java填充Word模板的方法详解

时间:2024-11-12 21:19:06浏览次数:1  
标签:Java 文档 import Word document public 模板

From: https://www.jb51.net/program/324679hhw.htm

Java填充Word模板是一种将动态数据插入到Word文档模板中生成最终文档的过程,通常用于批量创建包含个人信息、报告结果或其他动态内容的文档,本文给大家介绍了使用Java填充Word模板的方法,需要的朋友可以参考下

  +
目录

概述

在Java中填充Word模板的需求通常涉及以下几个步骤:

  1. 准备一个Word模板文件,包含占位符。
  2. 使用Java代码读取模板文件。
  3. 根据实际数据替换模板中的占位符。
  4. 生成最终的Word文档并保存或输出。

为了实现这一过程,我们可以选择不同的Java库,每种库有其独特的优势和使用场景。本文将介绍三种常见的Java Word处理库:Apache POI、Aspose.Words for Java和Docx4j。

常见的Java Word处理库

Apache POI

Apache POI是一个开源的Java API,用于读取和写入Microsoft Office文档。POI支持Word、Excel和PowerPoint文件格式。它是处理Word文档的一个常用选择,尤其是在需要处理较简单的文档操作时。

优点:

  • 开源免费
  • 社区支持活跃
  • 适用于简单的文档操作

缺点:

  • 对复杂文档操作支持有限
  • API较为底层,使用复杂

Aspose.Words for Java

Aspose.Words for Java是一个功能强大的商业库,用于创建、修改、转换和渲染Word文档。它支持各种复杂的Word文档操作,包括填充模板、插入图片、设置样式等。

优点:

  • 功能强大,支持复杂的文档操作
  • API简洁易用
  • 优秀的文档和示例支持

缺点:

  • 商业库,需要购买许可证
  • 较高的学习成本

Docx4j

Docx4j是一个开源的Java库,用于创建和操作Office Open XML(OOXML)文件。它特别适用于处理Word(.docx)文档,支持较复杂的文档操作和格式。

优点:

  • 开源免费
  • 支持复杂的文档操作
  • 良好的文档和社区支持

缺点:

  • 学习曲线较陡
  • 对某些高级特性支持有限

使用Apache POI填充Word模板

创建和读取Word文档

首先,我们需要创建一个Word模板文档,并在Java代码中读取它。以下是如何使用Apache POI创建和读取Word文档的示例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import org.apache.poi.xwpf.usermodel.XWPFDocument; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;   public class PoiExample {     public static void main(String[] args) throws IOException {         // 创建Word文档         XWPFDocument document = new XWPFDocument();                   // 创建文件输出流         FileOutputStream out = new FileOutputStream("template.docx");         document.write(out);         out.close();                   // 读取Word文档         FileInputStream fis = new FileInputStream("template.docx");         XWPFDocument doc = new XWPFDocument(fis);         fis.close();     } }

填充文本

在模板中,使用占位符(如${placeholder})来表示需要填充的数据。以下示例展示了如何使用Apache POI替换占位符:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import java.util.List;   public class PoiTextFiller {     public static void fillText(XWPFDocument document, String placeholder, String value) {         List<XWPFParagraph> paragraphs = document.getParagraphs();         for (XWPFParagraph paragraph : paragraphs) {             List<XWPFRun> runs = paragraph.getRuns();             for (XWPFRun run : runs) {                 String text = run.getText(0);                 if (text != null && text.contains(placeholder)) {                     text = text.replace(placeholder, value);                     run.setText(text, 0);                 }             }         }     } }

填充表格

对于表格数据,可以使用类似的方法遍历表格并替换占位符:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableCell; import org.apache.poi.xwpf.usermodel.XWPFTableRow;   public class PoiTableFiller {     public static void fillTable(XWPFDocument document, String placeholder, String value) {         List<XWPFTable> tables = document.getTables();         for (XWPFTable table : tables) {             for (XWPFTableRow row : table.getRows()) {                 for (XWPFTableCell cell : row.getTableCells()) {                     String text = cell.getText();                     if (text != null && text.contains(placeholder)) {                         text = text.replace(placeholder, value);                         cell.removeParagraph(0);                         cell.setText(text);                     }                 }             }         }     } }

使用Aspose.Words for Java填充Word模板

创建和读取Word文档

使用Aspose.Words for Java创建和读取Word文档相对简单,以下是示例代码:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import com.aspose.words.Document; import com.aspose.words.DocumentBuilder;   public class AsposeExample {     public static void main(String[] args) throws Exception {         // 创建Word文档         Document document = new Document();         DocumentBuilder builder = new DocumentBuilder(document);                   // 添加内容到文档         builder.write("Hello World!");                   // 保存文档         document.save("template.docx");                   // 读取Word文档         Document doc = new Document("template.docx");     } }

填充文本

Aspose.Words提供了更高级的API来替换文本占位符,例如使用DocumentBuilder类:

1 2 3 4 5 public class AsposeTextFiller {     public static void fillText(Document document, String placeholder, String value) throws Exception {         document.getRange().replace(placeholder, value, new FindReplaceOptions());     } }

填充表格

使用Aspose.Words填充表格也非常简单,以下是示例代码:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import com.aspose.words.Cell; import com.aspose.words.Row; import com.aspose.words.Table;   public class AsposeTableFiller {     public static void fillTable(Document document, String placeholder, String value) throws Exception {         Table table = (Table) document.getChild(NodeType.TABLE, 0, true);         for (Row row : table.getRows()) {             for (Cell cell : row.getCells()) {                 if (cell.getText().contains(placeholder)) {                     cell.getFirstParagraph().getRuns().clear();                     cell.getFirstParagraph().appendChild(new Run(document, value));                 }             }         }     } }

使用Docx4j填充Word模板

创建和读取Word文档

使用Docx4j创建和读取Word文档如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4   j.openpackaging.parts.WordprocessingML.MainDocumentPart;   public class Docx4jExample {     public static void main(String[] args) throws Exception {         // 创建Word文档         WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();         MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart();                   // 添加内容到文档         mainDocumentPart.addParagraphOfText("Hello World!");                   // 保存文档         wordMLPackage.save(new java.io.File("template.docx"));                   // 读取Word文档         WordprocessingMLPackage wordMLPackageRead = WordprocessingMLPackage.load(new java.io.File("template.docx"));     } }

填充文本

使用Docx4j替换文本占位符的示例如下:

1 2 3 4 5 6 7 8 9 10 11 import org.docx4j.wml.Text; import org.docx4j.XmlUtils;   public class Docx4jTextFiller {     public static void fillText(WordprocessingMLPackage wordMLPackage, String placeholder, String value) throws Exception {         String xml = XmlUtils.marshaltoString(wordMLPackage.getMainDocumentPart().getJaxbElement(), true, true);         xml = xml.replaceAll(placeholder, value);         wordMLPackage.getMainDocumentPart().setJaxbElement(                 (org.docx4j.wml.Document) XmlUtils.unmarshalString(xml));     } }

填充表格

使用Docx4j填充表格数据的示例代码如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 import org.docx4j.wml.Tc; import org.docx4j.wml.Tr; import org.docx4j.wml.Tbl;   public class Docx4jTableFiller {     public static void fillTable(WordprocessingMLPackage wordMLPackage, String placeholder, String value) throws Exception {         List<Object> tables = getAllElementsFromObject(wordMLPackage.getMainDocumentPart(), Tbl.class);         if (tables.size() > 0) {             Tbl table = (Tbl) tables.get(0);             List<Object> rows = getAllElementsFromObject(table, Tr.class);             for (Object row : rows) {                 List<Object> cells = getAllElementsFromObject(row, Tc.class);                 for (Object cell : cells) {                     Tc tableCell = (Tc) cell;                     if (tableCell.toString().contains(placeholder)) {                         tableCell.getContent().clear();                         tableCell.getContent().add(wordMLPackage.getMainDocumentPart().createParagraphOfText(value));                     }                 }             }         }     }       private static List<Object> getAllElementsFromObject(Object obj, Class<?> toSearch) {         List<Object> result = new ArrayList<>();         if (obj instanceof JAXBElement) obj = ((JAXBElement<?>) obj).getValue();           if (obj.getClass().equals(toSearch)) result.add(obj);         else if (obj instanceof ContentAccessor) {             List<?> children = ((ContentAccessor) obj).getContent();             for (Object child : children) result.addAll(getAllElementsFromObject(child, toSearch));         }         return result;     } }

实际应用示例

生成合同文档

合同文档通常包含多个部分和表格,需要填充客户信息、合同条款等。以下是一个使用Apache POI生成合同文档的示例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import org.apache.poi.xwpf.usermodel.XWPFDocument; import java.io.FileOutputStream; import java.io.IOException;   public class ContractGenerator {     public static void main(String[] args) throws IOException {         XWPFDocument document = new XWPFDocument();                   // 填充合同内容         PoiTextFiller.fillText(document, "${customerName}", "张三");         PoiTextFiller.fillText(document, "${contractDate}", "2024-07-05");         PoiTableFiller.fillTable(document, "${itemDescription}", "服务项目");                   // 保存合同文档         FileOutputStream out = new FileOutputStream("contract.docx");         document.write(out);         out.close();     } }

生成发票文档

发票文档需要填充客户信息、商品明细和金额等。以下是一个使用Aspose.Words for Java生成发票文档的示例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import com.aspose.words.Document; import com.aspose.words.DocumentBuilder; import java.util.List;   public class InvoiceGenerator {     public static void main(String[] args) throws Exception {         Document document = new Document("invoice_template.docx");                   // 填充发票内容         AsposeTextFiller.fillText(document, "${customerName}", "李四");         AsposeTextFiller.fillText(document, "${invoiceDate}", "2024-07-05");         AsposeTableFiller.fillTable(document, "${itemDescription}", "商品明细");                   // 保存发票文档         document.save("invoice.docx");     } }

生成报告文档

报告文档通常包含多个章节和数据图表,需要填充数据分析结果和图表。以下是一个使用Docx4j生成报告文档的示例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import java.io.File;   public class ReportGenerator {     public static void main(String[] args) throws Exception {         WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File("report_template.docx"));                   // 填充报告内容         Docx4jTextFiller.fillText(wordMLPackage, "${reportTitle}", "2024年度报告");         Docx4jTextFiller.fillText(wordMLPackage, "${reportDate}", "2024-07-05");         Docx4jTableFiller.fillTable(wordMLPackage, "${dataDescription}", "数据分析结果");                   // 保存报告文档         wordMLPackage.save(new File("report.docx"));     } }

最佳实践

模板设计

  • 使用清晰的占位符:选择易于识别和替换的占位符,如${placeholder}
  • 保持模板简洁:尽量减少复杂的格式和样式,确保模板易于维护。
  • 分段设计:将模板分为多个独立的部分,便于单独替换和填充。

性能优化

  • 批量处理:对于大量文档生成任务,使用批量处理方法,减少单次操作的开销。
  • 缓存数据:将常用的数据缓存到内存中,减少重复读取的开销。
  • 异步处理:对于耗时的文档生成任务,使用异步处理方式,提高系统的响应速度。

错误处理

  • 捕获异常:在文档操作过程中,捕获可能出现的异常,并记录错误日志。
  • 数据验证:在填充模板之前,验证数据的完整性和准确性,避免生成错误的文档。
  • 回滚机制:在批量生成文档过程中,出现错误时,支持回滚机制,避免部分数据的生成失败。

总结

本文详细介绍了如何使用Java填充Word模板,包括常见的Java Word处理库(Apache POI、Aspose.Words for Java和Docx4j)的使用方法和实际应用示例。通过理解和应用这些技术,可以高效地生成符合特定格式的Word文档,满足各种业务需求。

标签:Java,文档,import,Word,document,public,模板
From: https://www.cnblogs.com/joeblackzqq/p/18542684

相关文章

  • 基于java+springboot的Vehicle management系统网站
    课题说明基于Java+SpringBoot的Vehiclemanagement系统网站是一款专门用于车辆管理的综合性网络平台。该网站可实现车辆基本信息管理,详细记录车辆型号、车架号、发动机号、购置日期、颜色等内容,方便随时查询和更新。车辆状态跟踪功能可标记车辆是处于闲置、使用中、......
  • 基于java+springboot的社区帮帮团系统网站
    前言基于java+springboot的社区帮帮团系统网站是一个促进社区互助的综合性平台。它为社区居民提供便捷的注册与登录入口。居民可发布求助信息,详细描述问题,如家电维修、管道疏通、家教需求等,并可设置悬赏金额。同时,有能力提供帮助的居民能浏览这些求助,根据自身技能和......
  • 基于java+springboot的免费体育馆场地预约系统
    前言基于Java+SpringBoot的免费体育馆场地预约系统为民众健身提供了便利。系统存储体育馆各个场地的详细信息,包括场地类型(如篮球场、羽毛球场、乒乓球场等)、场地规格、可容纳人数、配套设施(如灯光、计分牌等)。用户可以方便地查看这些信息,根据自身需求选择合适的场地......
  • 基于java+springboot的美妆类免税商品选购系统
    前言基于Java+SpringBoot的美妆类免税商品选购系统为美妆爱好者购买免税商品提供了便捷途径。系统中存有丰富的美妆免税商品信息,涵盖各类品牌的口红、眼影、粉底、腮红等。每种商品都详细记录了品牌、型号、色号、功效、规格、免税价格等内容。同时,展示商品的高清图......
  • 基于java+springboot的美食推荐系统
    前言基于Java+SpringBoot的美食推荐系统能为用户带来个性化的美食体验。系统收集了海量的美食信息,包括各种菜系、餐厅菜品、街头小吃等。每道美食都有详细介绍,如口味特点、食材构成、烹饪方式、价格范围等。同时,还整合了餐厅的相关信息,如地址、环境、营业时间、服务......
  • 字符串Java--- [蓝桥杯 2020 省 AB3] 日期识别
    题目描述小蓝要处理非常多的数据,其中有一些数据是日期。在小蓝处理的日期中有两种常用的形式:英文形式和数字形式。英文形式采用每个月的英文的前三个字母作为月份标识,后面跟两位数字表示日期,月份标识第一个字母大写,后两个字母小写,日期小于 1010 时要补前导 00。11 ......
  • P8680 [蓝桥杯 2019 省 B] 特别数的和 java
    题目描述小明对数位中含有 22、00、11、99 的数字很感兴趣(不包括前导 00),在 11 到 4040 中这样的数包括 11、22、99、1010 至 3232、3939 和 4040,共 2828 个,他们的和是 574574。请问,在 11 到 nn 中,所有这样的数的和是多少?输入格式输入一行包含一个整数 ......
  • 新手如何学习CSP-S组知识STL模板和线性结构?一篇博文让你明白
    一、C++STL模板学习STL是C++标准库的一部分,提供了一套通用的、可重用的模板类和函数,用于处理常见的数据结构和算法。STL的设计理念是“泛型编程”,即编写与类型无关的代码,通过模板参数在编译时指定具体类型。STL主要包含容器、算法和迭代器三个组件。1.容器(Containers)容器......
  • Java代码实现行列转换
    本代码想要达到的效果 测试完整代码如下(copy直接运行):publicclassTestConvert{publicstaticvoidmain(String[]args){ArrayList<Attribute>sourceList=newArrayList<>();for(inti=0;i<3;i++){for(intj=0;j<3;j+......
  • C++基础 抽象类 类模板 STL库 QT环境
    一、抽象类1、纯虚函数        在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容,因此可以将虚函数改为纯虚函数。        语法:virtual返回值类型函数名(参数列表)=0;2.抽象类1)概念        有纯虚函数所在的类,称......