Java根據word 模板,生成自定義內容的word 文件

處理思路:

  1. 將word模板以xml格式另存一份,得到xml格式模板
  2. 在xml 文件中,使用freemark標籤,替換一些自定義值
  3. 使用freemark 解析xml ,輸出到.doc 文件 
  4. 在處理的時候要把文件後綴改成.ftl格式
  5. 獲得自定義內容的word文件

案列資源: 

https://download.csdn.net/download/csdn_heliu/10881778

實際操作: 

word模板:

 另存爲xml文件,修改後綴名爲.ftl格式(ftl文件是使用freemark標籤處理過的,已經替換自定義內容,用idea或者eclipse處理太卡了,在外面用編輯器處理的)

實際代碼實現: 

 public static void main(String[] args) {
        //定義一個集合存放的是學生信息
        List<Student> studentList = new ArrayList<>();
        //學生A
        Student a = new Student();
        a.setName("學生A");
        a.setSex("男");
        a.setAge(18);
        a.setPhone("18856652121");
        a.setAddress("安徽省合肥市");
        studentList.add(a);
        //學生B
        Student b = new Student();
        b.setName("學生B");
        b.setSex("女");
        b.setAge(80);
        b.setPhone("18856654444");
        b.setAddress("美國加州");
        studentList.add(b);
        //學生C
        Student c = new Student();
        c.setName("學生C");
        c.setSex("女");
        c.setAge(19);
        c.setPhone("18856652121");
        c.setAddress("江蘇浙江");
        studentList.add(c);
        //把學生信息放到map裏
        Map<String, Object> params = new HashMap<>();
        params.put("studentList", studentList);
        //標題
        params.put("title", "高三(3)班");

        logger.info("params:{}", params);

        //生成自定義內容word
        String resultFilePath = String.format("D:/edu/test_%s.doc", "高三(3)班");
        FreeMakerParser.process("templates/test.ftl", resultFilePath, params);
    }

解析xml輸出到.doc文件中—生成word文檔時使用的方法:

 /**
     * @Description 解析xml輸出到.doc文件中—生成word文檔時使用
     * @author HeLiu
     * @date 2018/12/27 17:07
     */
    public static String process(String templateFilePath, String resultFilePath, Map param) {
        CONFIGURER.setDefaultEncoding("UTF-8");// 設置默認編碼方式
        try {
            InputStream is = FreeMakerParser.class.getClassLoader().getResourceAsStream(templateFilePath);
            if (null == is) {
                logger.info(".............InputStream is null..........");
            }
            File targetFile = FileToolUtil.createNewFile(resultFilePath);
            Writer resultFileWriter = new OutputStreamWriter(new FileOutputStream(targetFile), "utf-8");
            Reader templateFileReader = new InputStreamReader(is, "utf-8");
            Template template = createTemplate(DEFAULT_TEMPLATE_EXPRESSION, templateFileReader);
            template.process(param, resultFileWriter);
            logger.info(".............freemark文件解析完成,生成word成功,文件路徑:" + targetFile + "!..........");
            return resultFilePath;
        } catch (Exception e) {
            logger.error("freemark解析異常", e);
            return null;
        }
    }

創建文件方法:

 /**
     * @Description 創建新文件,有目錄則先生成目錄
     * @author HeLiu
     * @date 2018/12/27 17:17
     */
    public static File createNewFile(String pathFileName) throws IOException {
        File outFile = new File(pathFileName);
        File parentFile = outFile.getParentFile();
        if (parentFile != null && !parentFile.exists()) {
            boolean ret = parentFile.mkdirs();//不存在則創建父目錄
            logger.info("......創建 {},目錄結果:{}", parentFile.getAbsolutePath(), ret);
        }
        if (!outFile.exists()) {
            outFile.createNewFile();
        }
        return outFile;
    }

 xml文件修改思路:

這裏用到了freemarker插值的方法—${title},

freemarker循環list使用方法—<#list studentList as bean> 

                                                          ${bean.object}

                                                </#list>

具體freemarker標籤使用方法可以自己詳細查詢一下

重複的版塊可以用循環生成,在處理的時候要把多餘的標籤內容刪除掉

下面是修改的地方部分代碼:

//修改標題
<w:t>${title}</w:t>


//修改表格生成內容
<#list studentList as bean>
                        <w:tr w:rsidR="00E5798D" w:rsidTr="00E5798D">
                            <w:trPr>
                                <w:trHeight w:val="652"/>
                            </w:trPr>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="1746" w:type="dxa"/>
                                    <w:vAlign w:val="center"/>
                                </w:tcPr>
                                <w:p w:rsidR="00E5798D" w:rsidRPr="00E5798D" w:rsidRDefault="0045179D"
                                     w:rsidP="00E5798D">
                                    <w:pPr>
                                        <w:jc w:val="center"/>
                                        <w:rPr>
                                            <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia"
                                                      w:hAnsiTheme="minorEastAsia"/>
                                            <w:sz w:val="24"/>
                                        </w:rPr>
                                    </w:pPr>
                                    <w:r>
                                        <w:rPr>
                                            <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia"
                                                      w:hAnsiTheme="minorEastAsia" w:hint="eastAsia"/>
                                            <w:sz w:val="24"/>
                                        </w:rPr>
                                        <w:t>${bean.name}</w:t>
                                    </w:r>
                                </w:p>
                            </w:tc>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="1746" w:type="dxa"/>
                                    <w:vAlign w:val="center"/>
                                </w:tcPr>
                                <w:p w:rsidR="00E5798D" w:rsidRPr="00E5798D" w:rsidRDefault="0045179D"
                                     w:rsidP="00E5798D">
                                    <w:pPr>
                                        <w:jc w:val="center"/>
                                        <w:rPr>
                                            <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia"
                                                      w:hAnsiTheme="minorEastAsia"/>
                                            <w:sz w:val="24"/>
                                        </w:rPr>
                                    </w:pPr>
                                    <w:r>
                                        <w:rPr>
                                            <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia"
                                                      w:hAnsiTheme="minorEastAsia" w:hint="eastAsia"/>
                                            <w:sz w:val="24"/>
                                        </w:rPr>
                                        <w:t>${bean.sex}</w:t>
                                    </w:r>
                                </w:p>
                            </w:tc>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="1746" w:type="dxa"/>
                                    <w:vAlign w:val="center"/>
                                </w:tcPr>
                                <w:p w:rsidR="00E5798D" w:rsidRPr="00E5798D" w:rsidRDefault="0045179D"
                                     w:rsidP="00E5798D">
                                    <w:pPr>
                                        <w:jc w:val="center"/>
                                        <w:rPr>
                                            <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia"
                                                      w:hAnsiTheme="minorEastAsia"/>
                                            <w:sz w:val="24"/>
                                        </w:rPr>
                                    </w:pPr>
                                    <w:r>
                                        <w:rPr>
                                            <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia"
                                                      w:hAnsiTheme="minorEastAsia" w:hint="eastAsia"/>
                                            <w:sz w:val="24"/>
                                        </w:rPr>
                                        <w:t>${bean.age}</w:t>
                                    </w:r>
                                </w:p>
                            </w:tc>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="1747" w:type="dxa"/>
                                    <w:vAlign w:val="center"/>
                                </w:tcPr>
                                <w:p w:rsidR="00E5798D" w:rsidRPr="00E5798D" w:rsidRDefault="0045179D"
                                     w:rsidP="00E5798D">
                                    <w:pPr>
                                        <w:jc w:val="center"/>
                                        <w:rPr>
                                            <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia"
                                                      w:hAnsiTheme="minorEastAsia"/>
                                            <w:sz w:val="24"/>
                                        </w:rPr>
                                    </w:pPr>
                                    <w:r>
                                        <w:rPr>
                                            <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia"
                                                      w:hAnsiTheme="minorEastAsia" w:hint="eastAsia"/>
                                            <w:sz w:val="24"/>
                                        </w:rPr>
                                        <w:t>${bean.phone}</w:t>
                                    </w:r>
                                </w:p>
                            </w:tc>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="1747" w:type="dxa"/>
                                    <w:vAlign w:val="center"/>
                                </w:tcPr>
                                <w:p w:rsidR="00E5798D" w:rsidRPr="00E5798D" w:rsidRDefault="0045179D"
                                     w:rsidP="00E5798D">
                                    <w:pPr>
                                        <w:jc w:val="center"/>
                                        <w:rPr>
                                            <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia"
                                                      w:hAnsiTheme="minorEastAsia"/>
                                            <w:sz w:val="24"/>
                                        </w:rPr>
                                    </w:pPr>
                                    <w:r>
                                        <w:rPr>
                                            <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia"
                                                      w:hAnsiTheme="minorEastAsia" w:hint="eastAsia"/>
                                            <w:sz w:val="24"/>
                                        </w:rPr>
                                        <w:t>${bean.address}</w:t>
                                    </w:r>
                                </w:p>
                            </w:tc>
                        </w:tr>
                    </#list>


pom依賴:

<dependency>
			<groupId>org.freemarker</groupId>
			<artifactId>freemarker</artifactId>
			<version>2.3.28</version>
		</dependency>

		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.5</version>
		</dependency>

 

 運行結果:在定義的路徑下有個新生成的word文件

總結:利用freemarker標籤修改xml文件的時候要細心,不能寫錯,不能刪錯標籤,不然都會導致word文件生成失敗。文件一定要修改爲ftl格式。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章