我们的需求是要一次导出多个(根据前台传参) 专家的文章
如下内容:
文章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"));

以上就是全部代码了

模板如下:
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐