介绍

上次公司项目需要一个生成word文档的功能,有固定的模板根据业务填充数据即可,由于从来没做过,项目也比较着急于是去网上找有没有合适的工具类,找了好几种,看到其中有freeMark模板生成比较靠谱于是采用这个,正常生成成功了还挺高兴的于是修改优化部署测试,出问题了,由于我一直使用wps可以正常打开,但是同事使用office打不开,于是各种查找原因都没好,于是只能转变思路又试了两种还是不好用,直到发现这款模板生成 poi-tl 真的做的很不错,而且是国人写的,关于学习这个东西还是看官方文档的好。
文档地址: http://deepoove.com/poi-tl

源码

源码查看规则
源码位置: blog-study:static-utils - word
在源码里可以完整的操作

代码展示

public static void main(String[] args) {
        //模板、文件、图片路径
        String workPath=System.getProperty("user.dir") + "/static-utils/src/main/resources/word/";
        String templateName="test.docx";
        Map<String, Object> datas = new HashMap<String, Object>() {
            {
                //文本
                put("name","xiaoguo");
                put("sex","男");
                put("year","20200105");
                put("hello","xiaoguo写于2020年一月");                 //自定义表格
                RowRenderData header = RowRenderData.build(new TextRenderData("1C86EE", "姓名"), new TextRenderData("1C86EE", "学历"));
                RowRenderData row0 = RowRenderData.build("张三", "研究生");
                RowRenderData row1 = RowRenderData.build("李四", "博士");
                RowRenderData row2 = RowRenderData.build("王五", "博士后");
                put("tables", new MiniTableRenderData(header, Arrays.asList(row0, row1, row2)));                 //自定义有序列表
                put("testText", new NumbericRenderData(NumbericRenderData.FMT_DECIMAL, new ArrayList<TextRenderData>() {
                    {
                        add(new TextRenderData("Plug-in grammar"));
                        add(new TextRenderData("Supports word text, header..."));
                        add(new TextRenderData("Not just templates, but also style templates"));
                    }
                }));                 //网落图片
                put("picture", new PictureRenderData(200, 150, ".jpg", BytePictureUtils.getUrlBufferedImage("https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=61c551093f6d55fbd1cb7e740c4b242f/d8f9d72a6059252d937820d3369b033b5ab5b9fd.jpg")));
                //本地图片
                put("picture2", new PictureRenderData(200, 150, ".jpg", BytePictureUtils.getLocalByteArray(new File(workPath + "c1.jpg"))));             }
        };         generateWord(datas, workPath + templateName, workPath);
    }     /**
     * 通过word模板并生成word文档
     *
     * @param paramData    参数数据
     * @param templatePath word模板地址加模板文件名字
     * @param outFilePath  输出文件地址(不带文件名字)
     * @return 生成的word文件
     */
    public static File generateWord(Map<String, Object> paramData, String templatePath, String outFilePath) {
        String outFileName = "word_" + System.currentTimeMillis() + "_" + random.nextInt(100) + ".doc";
        return generateWord(paramData, templatePath, outFilePath, outFileName);
    }     /**
     * 通过word模板并生成word文档
     *
     * @param paramData    参数数据
     * @param templatePath word模板地址加模板文件名字
     * @param outFilePath  输出文件地址(不带文件名字)
     * @param outFileName  输出文件名字
     * @return 生成的word文件
     */
    public static File generateWord(Map<String, Object> paramData, String templatePath, String outFilePath, String outFileName) {
        //判断输出文件路径和文件名是否含有指定后缀
        outFilePath = CommonUtil.addIfNoSuffix(outFilePath, "/", "\\");
        outFileName = CommonUtil.addIfNoSuffix(outFileName, ".doc", ".docx");
        //解析word模板
        XWPFTemplate template = XWPFTemplate.compile(templatePath).render(paramData);
        //输出文件
        FileOutputStream out = null;
        File outFile = new File(outFilePath + outFileName);
        try {
            out = new FileOutputStream(outFile);
            template.write(out);
            out.flush();
        } catch (IOException e) {
            log.error("生成word写入文件失败", e);
        } finally {
            if (template != null) {
                try {
                    template.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return outFile;
    }

最新文章

  1. 增强版字典DictionaryEx
  2. HttpUrlConnection发送url请求(后台springmvc)
  3. 自定义Dialog宽度占满屏幕
  4. IE6中使用通用选择器模拟子选择器效果
  5. android开发之如何使TabHost的TabWidget位于屏幕下方
  6. Linux查看文件以及文件夹的大小
  7. js监听
  8. 使用node-webkit开发Clover桌面客户端的一些记录(一)
  9. 根据SVN的MESSAGE进行多版本输出,反向排序,真是曲折~~~啊
  10. Laravel 5.1 ACL权限控制 一
  11. 论.net平台的切身感触(惑)
  12. 高考志愿填报:java 软件 程序员 目前的就业现状
  13. Flex中的FusionCharts 2D面积图
  14. HTML的基本介绍
  15. Python里面 search0和 match0的区别?
  16. Python机器学习(基础篇---监督学习(集成模型))
  17. Scrapy中集成selenium
  18. 在“非软件企业”开发软件的困局 ZT
  19. css溢出显示省略号
  20. python基础-闭包

热门文章

  1. 写一个js配合rem
  2. 扶桑号战列舰 (单调栈+线段树区间更新懒惰标记 or 栈)
  3. Linux下tomcat启动成功但是Windows打不开tomcat网址
  4. 2018-2-13-C#-解析-sln-文件
  5. WebLogic Developer版创建domain
  6. 如何用python“优雅的”调用有道翻译?
  7. poj/OpenJ_Bailian - 2528 离散化+线段树
  8. 使用eclipse运行maven web项目 插件/非插件
  9. nixyx —— 一个小巧的项目工程/编译文件生成器(构建系统?)
  10. 多线程之美8一 AbstractQueuedSynchronizer源码分析&lt;二&gt;