我们的需求是要一次导出多个(根据前台传参) 专家的文章
如下内容:
文章1标题:xxx
专家姓名:专家1
单位:xxx
文章内容:xxx
----------------------------------------------------------
文章2标题:xxx
专家姓名:专家1
单位:xxx
文章内容:xxx
先推荐一个框架 http://deepoove.com/poi-tl/ 里面有很多动态表格的例子
引入依赖
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.0</version>
</dependency>
对应原生的最新版 POI 5.2.2
如果也可以直接使用POI原生API直接操作更灵活
如果遇到jar包依赖问题建议直接去apache poi 官网下载离线 jar包到本地导入使用
看了网上的例子很多写的太复杂,其实要实现循环输出很简单并不需要太多代码。
明白下面几个概念 操作起来就很简单了
XWPFTable word中的表格
XWPFTableRow 代表表格的一行
XWPFTableCell 代表表格的一个单元格
XWPFParagraph word中的任意一个段落
XWPFRun 段落中的文本对象包括字体和文本样式
private void insertValueToTable(XWPFDocument xwpfDocument, List<Map<String,String>> params, int tableIndex) throws Exception {
List<XWPFTable> tableList = xwpfDocument.getTables();
XWPFTable table = tableList.get(0);
List<XWPFTableRow> rows = table.getRows();
//模板的那一行
XWPFTableRow tmpRow = rows.get(8);
XWPFTableCell Cell = tmpRow.getCell(0);
XWPFParagraph parag = Cell.getParagraphs().get(0);
XWPFRun rn = parag.getRuns().get(0);
for( Map<String,String> map : params )
{
XWPFParagraph nparag = tmpRow.getCell(0).addParagraph();
nparag.setSpacingBetween(parag.getSpacingBetween());
extracted(rn, map, nparag,"name");
extracted(rn, map, nparag,"au");
extracted(rn, map, nparag,"auorg");
extracted(rn, map, nparag,"source");
extracted(rn, map, nparag,"summary");
}
tmpRow.getCell(0).removeParagraph(0);
}
private void extracted(XWPFRun rn, Map<String, String> map, XWPFParagraph nparag,String key) {
XWPFRun nrn = nparag.createRun();
nrn.setFontSize(rn.getFontSizeAsDouble());
nrn.setFontFamily(rn.getFontFamily());
nrn.setCharacterSpacing(rn.getCharacterSpacing());
nrn.setTextPosition( rn.getTextPosition() );
nrn.setText(map.get(key));
nrn.addBreak(BreakType.TEXT_WRAPPING);
}
测试代码
List<Map<String, String>> list = new ArrayList<>();
for (int i =1;i < 6; i++){
Map<String,String> map = new HashMap<>();
map.put("name", " 【篇 名】抽油烟机的应用"+i);
map.put("au", " 【作 者】朱世平"+i);
map.put("auorg", " 【作者单位】电子科技大学,2016 "+i);
map.put("source", " 【文献出处】中国优秀硕士学"+i);
map.put("summary", " 【摘 要】目前抽油烟机......");
list.add(map);
}
XWPFTemplate template = XWPFTemplate.compile("D:\\检索报告-模板.docx");
NewReportUtil wordReporter = new NewReportUtil();
wordReporter.setXWPFDocument(template.getXWPFDocument());
wordReporter.export(list,0);
template.render(
new HashMap<String, Object>(){{
put("reqname", "XX需求");
put("org", "科技大市场");
}});
template.writeAndClose(new FileOutputStream("d://output.docx"));
以上就是全部代码了
模板如下: