java 用poi-tl向word中插入数据,图片

这篇博客介绍了如何在Java中利用poi-tl库动态地根据模板生成Word文档。作者提供了从表单数据到Word模板填充的具体步骤,包括引入依赖、创建Word文档工具类以及后台Servlet的处理过程。示例中,通过Map对象存储表单数据,并将其渲染到模板文件中,最终生成定制化的Word文档。
摘要由CSDN通过智能技术生成

最近写点东西练练手,就是页面中表格输入的数据要存入word的模板当中,记录一下
看了几种办法大概就是:

  1. poi-tl,word模板引擎,可以根据模板来创建word文档,很简单也方便上手。
  2. Jacob,调用微软Office的COM接口,生成的word文件格式规范。
  3. Apache POI包括一系列的API,通过这些API在Java中读写Excel、Word等文件。
  4. FreeMarker生成word文档,是由XML+FreeMarker来实现的。先把word文件另存为xml,在xml文件中插入特殊的字符串占位符,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板,编码调用FreeMarker实现文本替换并输出Doc。
  5. PageOffice,封装了微软Office繁琐的vba接口,支持生成word文件,也可以在线编辑word文档和读取word文档内容。

我最后是用的poi-tl实现的,poi-tl官方文档在这里,下边举个我测试时候的例子:

提交用的表单:

word模板:

在这里插入图片描述

把表单的内容填好提交按照已有的word模板生成word文档,随便提交了点数据,最后生成的结果:

在这里插入图片描述

首先需要引入依赖:

    <!--文件上传的工具,不上传文件就不用了-->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <!--poi-tl 导出word的依赖-->
    <dependency>
      <groupId>com.deepoove</groupId>
      <artifactId>poi-tl</artifactId>
      <version>1.10.0</version>
    </dependency>

生成word文档的工具类:

    public static void word(Map<String,Object> map) {
        String filepath = "d:/"+map.get("name")+"-"+map.get("sign")+".docx";//最终导出word的路径
        try {
            XWPFTemplate template = XWPFTemplate.compile("d:/menzhen.docx").render(map);//这个就是word模板文档
            FileOutputStream out = new FileOutputStream(filepath);
            template.write(out);
            out.flush();
            out.close();
            template.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

后台处理的servlet(这里是把要上传的数据存在hashmap里,图片的话是把上传的图片存在本地再new一个PictureRenderData对象存到hashmap里):

public class exportWord extends HttpServlet {

    private Map<String,Object> BingLiMap= new HashMap<String, Object>();

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            //磁盘文件项工厂
            DiskFileItemFactory diskFileItemFactory =new DiskFileItemFactory();
            //核心解析类
            ServletFileUpload servletFileUpload =new ServletFileUpload(diskFileItemFactory);
            //解析request,返回list集合
            List<FileItem> fileItems = servletFileUpload.parseRequest(request);
            //遍历集合得到请求每个部分的文件项对象
            for (FileItem fileItem : fileItems) {
                if(fileItem.isFormField()){
                    //普通项
                    String name=fileItem.getFieldName();
                    BingLiMap.put(name,fileItem.getString("UTF-8"));

                } else {
                    //文件上传项
                    String LuJing="d:/"+BingLiMap.get("sign")+".png";
                    InputStream inputStream = fileItem.getInputStream();
                    OutputStream outputStream = new FileOutputStream(LuJing);
                    //流对接
                    int len=0;
                    byte[] bytes=new byte[1024];
                    while ((len=inputStream.read(bytes))!=-1){
                        outputStream.write(bytes,0,len);
                    }
                    inputStream.close();
                    outputStream.close();
                    BingLiMap.put("file",new PictureRenderData(120, 110, LuJing));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        wordUtil.word(BingLiMap);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

走完servlet word文档就会创建在工具类的输出路径中,随便写写,水平有限哈~

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java,可以使用POI-TL库来操作Word文档。要在Word文档插入目录,可以按照以下步骤进行: 1. 首先,在pom.xml文件添加POI-TL的依赖: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-tl</artifactId> <version>1.0.5</version> </dependency> ``` 2. 创建一个空白的Word文档: ``` XWPFTemplate template = XWPFTemplate.create(new File("template.docx")); ``` 3. 在需要插入目录的位置插入一个标记,例如“{toc}”: ``` template.replaceTag("{toc}", ""); ``` 4. 在文档的末尾插入一个空白段落: ``` template.doc.createParagraph(); ``` 5. 使用POI-TL提供的方法生成目录: ``` CTSdtContent content = CTSdtContent.Factory.newInstance(); XWPFParagraph paragraph = template.doc.createParagraph(); CTP ctp = paragraph.getCTP(); ctp.setDomNode(content.newDomNode()); content.addNewSdtPr().addNewDocPartObj().addNewDocPartGallery().setVal("Table of contents"); content.addNewSdtEndPr(); CTBookmark bookmark = ctp.addNewBookmarkStart(); bookmark.setName("_Toc521216412"); bookmark.setId(BigInteger.valueOf(521216412)); CTMarkupRange range = ctp.addNewR().addNewFldChar().setFldCharType(STFldCharType.BEGIN); range = ctp.addNewR().addNewInstrText(); range.setStringValue(" TOC \\o \"1-3\" \\h \\z \\u "); range = ctp.addNewR().addNewFldChar().setFldCharType(STFldCharType.SEPARATE); range = ctp.addNewR().addNewFldChar().setFldCharType(STFldCharType.END); bookmark = ctp.addNewBookmarkEnd(); bookmark.setId(BigInteger.valueOf(521216412)); ``` 6. 保存文档并关闭: ``` template.write(new FileOutputStream(new File("output.docx"))); template.close(); ``` 以上是POI-TL实现插入目录的代码,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值