java使用Aspose向word模板写入数据

Wesley13
• 阅读 1021

Aspose.Words是一个商业.NET类库,可以使得应用程序处理大量的文件任务。Aspose.Words支持Doc,Docx,RTF,HTML,OpenDocument,PDF,XPS,EPUB和其他格式。使用Aspose.Words可以在不使用Microsoft.Word的情况下生成、修改、转换和打印文档。

1、Aspose在maven下的包引用,例如:

java使用Aspose向word模板写入数据 java使用Aspose向word模板写入数据

<dependency>
   <groupId>com.mlsc</groupId>
   <artifactId>aspose-cells</artifactId>
   <version>8.3.1</version>
</dependency>

View Code

2、word模板

    创建一个word文档,asposeTemplate.docx,内容如下:

xxx部门人员信息表

部门名称*

$department$

 

姓名

性别

职务

身份证号

联系电话

«TableStart:staffList»«staff»

«name»

«sex»

«post»

«IDNum»

«TableEnd:staffList»«phoneNum»

    java使用Aspose向word模板写入数据

  说明:文档中的«name»等尖括号内容,是通过菜单的"插入→文档部件→域”找到MergeField并输入相应的域名而来。

3、java代码实现模板填充

(1)获取模板文件路径

  例如:在webapp/file文件夹下,String templateFilePath = request.getServletContext().getRealPath("") + "/files/asposeTemplate.docx";

(2)获取aspose的许可证

  例如:通过配置的license.xml文件,设置许可

InputStream is = this.getClass().getClassLoader().getResourceAsStream("license.xml");

ByteArrayOutputStream dstStream = null; //填充后的文档输出流

License aposeLic = new License();
aposeLic.setLicense(is);

  license.xml内容如下:

java使用Aspose向word模板写入数据 java使用Aspose向word模板写入数据

<License>
  <Data>
    <Products>
      <Product>Aspose.Total for Java</Product>
      <Product>Aspose.Words for Java</Product>
    </Products>
    <EditionType>Enterprise</EditionType>
    <SubscriptionExpiry>20991231</SubscriptionExpiry>
    <LicenseExpiry>20991231</LicenseExpiry>
    <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
  </Data>
  <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License>

View Code

(3)获取文档对象
  Document doc = new Document(templateFilePath);

(4)填充word模板中$$占位字段

  doc.getRange().replace("$department$", data.getDepartment, true, false); //data.getDepartment 部门名称

(5)填充word模板中«»占位字段

  (a)从数据源获取员工集合,如

List<Staff> staffList = data.getStaffList();

  (b)创建名称为staffList的DataTable,并绑定字段

DataTable staffTable = new DataTable("staffList");
staffTable.getColumns().add("staff");
staffTable.getColumns().add("name");
staffTable.getColumns().add("sex");
staffTable.getColumns().add("post");
staffTable.getColumns().add("IDNum");
staffTable.getColumns().add("phoneNum");

  (c)循环员工集合,构建新的DataTable,填充每一个员工的信息

for (int i = 0; i < staffList.size(); i++) {
      Staff staff = staffList.get(i);
      DataRow row = staffTable.newRow();
      row.set(0, "员工信息");
      row.set(1, staff.getName());
      row.set(2, staff.getSex());
      row.set(3, staff.getPost());
      row.set(4, staff.getIDNum());
      row.set(5, staff.getPhoneNum());
      staffTable.getRows().add(row);
}

  (d)递归填充,替换文档中mergeField域字段 

doc.getMailMerge().executeWithRegions(staffTable);

  (e)单元格的合并,样式设置

DocumentBuilder builder = new DocumentBuilder(doc);
builder.moveToCell(0, 2, 0, 0);  //移动到第一个表格的第3行第一个格子(即tableStart)
builder.getCellFormat().setVerticalMerge(CellMerge.FIRST);

for(int i = 1; i < staffList.size() + 1; i++ ) { 
      builder.moveToCell(0, 1 + i, 0, 0);
      builder.getCellFormat().setVerticalMerge(CellMerge.PREVIOUS);
}

  (e)保存并返回文件流

dstStream = new ByteArrayOutputStream();
doc.save(dstStream, saveFormat);

return dstStream.toByteArray(); //返回的文件流

 4、填充结果文档

  web项目可通过HttpServletResponse返回下载填充后的文档,例如在controller中,可如下处理

java使用Aspose向word模板写入数据 java使用Aspose向word模板写入数据

response.setContentType("application/octet-stream; charset=utf-8");
       response.setHeader("Content-Disposition", "attachment;  filename=" + URLEncoder.encode(genfileName, "utf-8").replace("+", "%20"));  //genfileName要生成的文件名

OutputStream out = response.getOutputStream();

out.write(outByte);

View Code

  填充后的文档类容如下图:

java使用Aspose向word模板写入数据

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
3年前
Aspose.Words for Java应用之一,word转png怎么去掉水印?为什么要收费?
    Aspose.Words是一款先进的文档处理控件,在不使用MicrosoftWords的情况下,它可以使用户在各个应用程序中执行各种文档处理任务,其中包括文档的生成、修改、渲染、打印,文档格式转换和邮件合并等文档处理。此外,Aspose.Words支持DOC,OOXML,RTF,HTML,OpenDocument,PDF,XPS,EPUB和
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究