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

最近写点东西练练手,就是页面中表格输入的数据要存入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
    评论
在使用Poi-tl插入网络图片时,可以通过设置图片的宽度和高度来控制图片的大小,并且通过设置图片的锁定纵横比来保持图片的比例不变。 具体方法如下: 1.先通过URL获取网络图片的输入流,如下所示: ```java URL url = new URL(imageUrl); InputStream is = url.openStream(); ``` 2.然后通过Poi-tl的ImageUtils类将输入流转换为byte[]类型的图片数据,如下所示: ```java byte[] imageData = ImageUtils.getImageByteArray(is); ``` 3.接着创建图片对象,并设置图片的宽度和高度,如下所示: ```java XWPFParagraph p = document.createParagraph(); XWPFRun r = p.createRun(); r.addPicture(new ByteArrayInputStream(imageData), XWPFDocument.PICTURE_TYPE_JPEG, "image.jpg", Units.toEMU(200), Units.toEMU(200)); ``` 其,Units.toEMU(200)表示设置图片的宽度和高度均为200个EMU,EMU是一种长度单位,1厘米=914400EMU。 4.最后,通过设置图片的锁定纵横比来保持图片的比例不变,如下所示: ```java CTInline inline = r.getCTR().getDrawingArray(0).getInlineArray(0); CTPositiveSize2D extent = inline.getExtent(); extent.setCx(Units.toEMU(200)); extent.setCy(Units.toEMU(200)); CTNonVisualDrawingProps docPr = inline.getDocPr(); docPr.addNewCNvPr().setDescr("image.jpg"); docPr.addNewCNvPr().setDocName("image.jpg"); CTShapeProperties shapeProperties = inline.addNewGraphic().addNewGraphicData().addNewPic().addNewSpPr(); shapeProperties.addNewXfrm().addNewOff().setX(0); shapeProperties.getXfrm().addNewOff().setY(0); shapeProperties.getXfrm().addNewExt().setCx(Units.toEMU(200)); shapeProperties.getXfrm().getExt().setCy(Units.toEMU(200)); shapeProperties.addNewPrstGeom().setPrst(STShapeType.RECT); CTPositiveSize2D crop = shapeProperties.getPrstGeom().addNewAvLst().addNewCustGeom().addNewRect().addNewLimo().addNewCustAdj(); crop.setAmt(0); crop.setMin(0); crop.setMax(100000); crop.setFmla("val 60000"); ``` 其,设置锁定纵横比的关键代码是crop.setFmla("val 60000"),这里的60000表示锁定比例为1:1,如果需要设置其他比例可以根据实际需求进行调整。 通过以上方法,即可在使用Poi-tl插入网络图片时保持图片的比例不变。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值