5年的坚持
小郭一直在努力

Aspose.Words for Java基于模板的WORD文档报告生成

最近需要在Linux平台上创建WORD文档,在非Windows平台上,以前的基于微软Office的com接口全部不能使用!百度又谷歌了好久,综合比较下来,发现Aspose.words是最好的生成word文档的组件,并且支持doc和docx,功能丰富,性能稳定,真的是不二选择。
学习了前辈的经验加上自己的摸索,终于实现了基于模板的word文档生成,满足了工作需要。Aspose.Words是付费软件,在没有授权的情况下会在创建的word文档中输出水印!

你可以下载本文的软件和模板调试(含Aspose.Words.jar):下载AsposeWordsForJaveTest
首先根据实际情况,创建一个word模板。模板可以是doc或者docx文档。我创建的简单模板如下:
asposewordsjava-tmp1
这个模板包含了常用的功能:普通文本域,如<<Title>>,单层循环的表格,如访问量统计表格,两层嵌套循环,如用户信息。
模板中的所有变量(文本域)必须按照下述方法插入:“域”:
asposewordsjava-tmp2

模板准备好后,将Asponse.Words for Java的jar包加入到工程中,并准备好授权文件。
第一步 加载授权文件license.xml

License license = new License();
try {
license.setLicense( “license.xml” );
} catch (Exception e) {
System.out.println(e.getMessage());
}

//第二步 读取word模板文件,可以是.doc或者.docx

String template = “xiaoguo123.docx”; //可以是doc或docx
String destdoc = “xiaoguo123_new.docx”; //可以是doc或docx
Document doc = new Document( template ); //定义文档接口

第三步 向模板中填充数据

//主要调用aspose.words的邮件合并接口MailMerge
//3.1 填充单个文本域
String[] Flds = new String[]{“Title”, “Name”, “URL”, “Note”}; //文本域
String Name = “小郭软件”;
String URL = “http://xiaoguo123.com”;
String Note = “分享绿色简单易用的小软件”;
Object[] Vals = new Object[]{“小郭软件@2016”, Name, URL, Note }; //值
doc.getMailMerge().execute(Flds, Vals); //调用接口

//3.2 填充单层循环的表格
DataTable visitTb = new DataTable(“Visit”); //网站访问量表格
visitTb.getColumns().add(“Date”); //0 增加三个列 日期
visitTb.getColumns().add(“IP”); //1 IP访问数量
visitTb.getColumns().add(“PV”); //2 页面浏览量
//向表格中填充数据
for(int i=1; i<15; i++){
DataRow row = visitTb.newRow(); //新增一行
row.set(0, “2016年2月”+i+”日”); //根据列顺序填入数值
row.set(1, i*300);
row.set(2, i*400);
visitTb.getRows().add( row ); //加入此行数据
}
//对于无数据的情况,增加一行空记录
if( visitTb.getRows().getCount() == 0 ){
DataRow row = visitTb.newRow();
visitTb.getRows().add( row );
}
doc.getMailMerge().executeWithRegions( visitTb ); //调用接口

//3.3 填充具有两层循环的表格
//需要定义两个数据表格,且两者之间通过某列关联起来
DataTable userTb = new DataTable(“User”); //用户
userTb.getColumns().add(“Name”); //用户名称
userTb.getColumns().add(“RegDate”);
DataTable infoTb = new DataTable(“Info”); //用户信息
infoTb.getColumns().add(“Name”); //用户名称 通过此列和上个表User关联
infoTb.getColumns().add(“Date”);
infoTb.getColumns().add(“Time”);

//3.3.1 填充用户信息
for(int i=1; i<4; i++){
DataRow row = userTb.newRow();
row.set(0, “User”+i );
row.set(1, “2015年3月”+i+”日”);
userTb.getRows().add( row );
}
//3.3.2 填充详细信息
for(int i=1; i<6; i++){
for(int j=1; j<5; j++){
DataRow row = infoTb.newRow();
row.set(0, “User”+i );
row.set(1, “2016年1月”+j+”日”);
row.set(2, j*2*i );
infoTb.getRows().add( row );
}
}

//3.3.3 将 User 和 Info 关联起来
DataSet userSet = new DataSet();
userSet.getTables().add( userTb );
userSet.getTables().add( infoTb );
String[] contCols = {“Name”};
String[] lstCols = {“Name”};
userSet.getRelations().add( new DataRelation(“UserInfo”, userTb, infoTb, contCols, lstCols) );
doc.getMailMerge().executeWithRegions(userSet); //调用接口

//第四步 保存新word文档

doc.save( destdoc );

最终创建的Word文档如下:
asposewordsjava-tmp3

未经允许不得转载:小郭软件 » Aspose.Words for Java基于模板的WORD文档报告生成
分享到: 更多 (0)

评论 1

评论前必须登录!

 

  1. #1
    用户头像

    你好,这个能实现三层循环吗?跪求!

    2个月前 (04-25)

小郭软件在线打字,快速提高打字水平!

去在线打字排行榜