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

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

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

1<dependency> 2 <groupId>com.mlsc</groupId> 3 <artifactId>aspose-cells</artifactId> 4 <version>8.3.1</version> 5</dependency>

View Code

2、word模板

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

xxx部门人员信息表

部门名称*

$department$

 

姓名

性别

职务

身份证号

联系电话

«TableStart:staffList»«staff»

«name»

«sex»

«post»

«IDNum»

«TableEnd:staffList»«phoneNum»

   

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

3、java代码实现模板填充

(1)获取模板文件路径

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

(2)获取aspose的许可证

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

1InputStream is = this.getClass().getClassLoader().getResourceAsStream("license.xml"); 2 3ByteArrayOutputStream dstStream = null; //填充后的文档输出流 4 5License aposeLic = new License(); 6aposeLic.setLicense(is);

  license.xml内容如下:

1<License> 2 <Data> 3 <Products> 4 <Product>Aspose.Total for Java</Product> 5 <Product>Aspose.Words for Java</Product> 6 </Products> 7 <EditionType>Enterprise</EditionType> 8 <SubscriptionExpiry>20991231</SubscriptionExpiry> 9 <LicenseExpiry>20991231</LicenseExpiry> 10 <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber> 11 </Data> 12 <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature> 13</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,并绑定字段

1DataTable staffTable = new DataTable("staffList"); 2staffTable.getColumns().add("staff"); 3staffTable.getColumns().add("name"); 4staffTable.getColumns().add("sex"); 5staffTable.getColumns().add("post"); 6staffTable.getColumns().add("IDNum"); 7staffTable.getColumns().add("phoneNum");

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

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

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

doc.getMailMerge().executeWithRegions(staffTable);

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

1DocumentBuilder builder = new DocumentBuilder(doc); 2builder.moveToCell(0, 2, 0, 0); //移动到第一个表格的第3行第一个格子(即tableStart) 3builder.getCellFormat().setVerticalMerge(CellMerge.FIRST); 4 5for(int i = 1; i < staffList.size() + 1; i++ ) { 6  builder.moveToCell(0, 1 + i, 0, 0); 7  builder.getCellFormat().setVerticalMerge(CellMerge.PREVIOUS); 8}

  (e)保存并返回文件流

1dstStream = new ByteArrayOutputStream(); 2doc.save(dstStream, saveFormat); 3 4return dstStream.toByteArray(); //返回的文件流

 4、填充结果文档

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

1response.setContentType("application/octet-stream; charset=utf-8"); 2 response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(genfileName, "utf-8").replace("+", "%20")); //genfileName要生成的文件名 3 4OutputStream out = response.getOutputStream(); 5 6out.write(outByte);

View Code

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

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )