项目中有一个需要用到导出报表的功能,在网上找了很久,找到的几个博客都不够具体,最后在不断的尝试下总算成功了,这里记录一下是如何实现根据word模板,创建新的word文档填充内容,将word文档导出到指定路径下。(docx格式)
1、首先我们需要引入以下jar包: 下载链接:https://pan.baidu.com/s/1S88PX1NxXtSsafbm2tW1fw 提取码:l4z0
2、我们在build.gradle中添加这些内容: (1)在android{}中添加:
packagingOptions{
exclude 'META-INF/INDEX.LIST'
}
defaultConfig{
multiDexEnabled true
}
(2)在dependencies{}中添加
implementation files('libs\\dom4j-1.6.1.jar')
implementation files('libs\\poi-3.9-20121203.jar')
implementation files('libs\\poi-ooxml-3.9-20121203.jar')
implementation files('libs\\poi-ooxml-schemas-3.9-20121203.jar')
implementation files('libs\\stax-api-1.0.1.jar')
implementation files('libs\\xmlbeans-2.3.0.jar')
(3)在菜单栏的File中点击Sync Project with Gradle Files。
3、我们要准备一个docx文件作为模板(可以包含表格),在你需要替换的位置输入$name$这种形式的字符串,之后我们会将它替换成你想要填充的内容。准备好后,在src/main/下创建一个文件夹,名称叫assets,将docx模板文件放进去。
4、之后我们就可以开始创建N组HashMap键值对,将你希望填写的内容写进去,例如:
Map<String, Object> map = new HashMap<String, Object>();
map.put("$name$", "张三");
map.put("$sex$", "男");
5、然后我们获取模板文件,遍历map将相应的内容填充进文档中,选择新文件要导出的路径:
InputStream is = context.getAssets().open("模板文件.docx");
XWPFDocument document = new XWPFDocument(is);
List<XWPFParagraph> listParagraphs = document.getParagraphs();
processParagraphs(listParagraphs, map);
List<XWPFFooter> footerList = document.getFooterList();
processParagraph(footerList, map);
Iterator<XWPFTable> it = document.getTablesIterator();
while (it.hasNext()) {
XWPFTable table = it.next();
List<XWPFTableRow> rows = table.getRows();
for (XWPFTableRow row : rows) {
List<XWPFTableCell> cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
List<XWPFParagraph> paragraphListTable = cell.getParagraphs();
processParagraphs(paragraphListTable, map);
}
}
}
FileOutputStream fopts = new FileOutputStream("/storage/emulated/0/poiTest/Report/测试.docx");
document.write(fopts);
if (fopts != null) {
fopts.close();
}
6、这样就可以导出docs文件至指定的路径下了。
|