JavaWeb項目中輸出*.doc文檔

JavaWeb項目中輸出文檔

一、輸出*.doc文檔(使用freemarker模板生成)

1.先建立一個 .docx文檔,動態內容用freemarker中的佔位符 ${} 進行佔位,然後將該文檔另存爲 .xml格式(若遇圖片,可以先在 .doc文檔中放入一張圖片,另存爲 .xml文件後,將 .xml文件中的圖片碼<圖片存儲格式爲Base64的編碼> 刪除,換爲freemarker的佔位符),最後將 .xml改爲 .ftl

例如

將如下word文檔
這裏寫圖片描述
另存爲 .xml文件,再將格式改爲 .ftl(注意看其中的佔位符)(截取了部分)

w:val="52"/></w:rPr><w:t>${title}</w:t></w:r></w:p><w:tbl><w:tblPr><w:tblStyle w:val="a3"/><w:tblW w:w="0" w:type="auto"/><w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/></w:tblPr><w:tblGrid><w:gridCol w:w="2355"/><w:gridCol w:w="2681"/><w:gridCol w:w="3486"/></w:tblGrid><w:tr w:rsidR="009E0A0F" w:rsidTr="00164788"><w:trPr><w:trHeight w:val="1464"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2823" w:type="dxa"/></w:tcPr><w:p w:rsidR="009E0A0F" w:rsidRDefault="009E0A0F"><w:r><w:rPr><w:rFonts w:hint="eastAsia"/></w:rPr><w:t>name</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="3069" w:type="dxa"/></w:tcPr><w:p w:rsidR="009E0A0F" w:rsidRDefault="009E0A0F"><w:r><w:rPr><w:rFonts w:hint="eastAsia"/></w:rPr><w:t>${name}</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2296" w:type="dxa"/><w:vMerge w:val="restart"/></w:tcPr><w:p w:rsidR="009E0A0F" w:rsidRDefault="00AD5078"><w:r><w:rPr><w:noProof/></w:rPr><w:drawing><wp:inline distT="0" distB="0" distL="0" distR="0"><wp:extent cx="2076629" cy="1382573"/><wp:effectExtent l="0" t="0" r="0" b="8255"/><wp:docPr id="1" name="圖片 1" descr="D:\BaiduNetdiskDownload\IU\20.jpg"/><wp:cNvGraphicFramePr><a:graphicFrameLocks noChangeAspect="1" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"/></wp:cNvGraphicFramePr><a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture"><pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture"><pic:nvPicPr><pic:cNvPr id="0" name="Picture 1" descr="D:\BaiduNetdiskDownload\IU\20.jpg"/><pic:cNvPicPr><a:picLocks noChangeAspect="1" noChangeArrowheads="1"/></pic:cNvPicPr></pic:nvPicPr><pic:blipFill><a:blip r:embed="rId5" cstate="print"><a:extLst><a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}"><a14:useLocalDpi val="0" xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main"/></a:ext></a:extLst></a:blip><a:srcRect/><a:stretch><a:fillRect/></a:stretch></pic:blipFill><pic:spPr bwMode="auto"><a:xfrm><a:off x="0" y="0"/><a:ext cx="2076601" cy="1382555"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:noFill/><a:ln><a:noFill/></a:ln></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r></w:p></w:tc></w:tr><w:tr w:rsidR="009E0A0F" w:rsidTr="009E0A0F"><w:trPr><w:trHeight w:val="979"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2823" w:type="dxa"/></w:tcPr><w:p w:rsidR="009E0A0F" w:rsidRDefault="009E0A0F"><w:r><w:rPr><w:rFonts w:hint="eastAsia"/></w:rPr><w:t>age</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="3069" w:type="dxa"/></w:tcPr><w:p w:rsidR="009E0A0F" w:rsidRDefault="009E0A0F"><w:r><w:rPr><w:rFonts w:hint="eastAsia"/></w:rPr><w:t>${age}</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2296" w:type="dxa"/><w:vMerge/></w:tcPr><w:p w:rsidR="009E0A0F" w:rsidRDefault="009E0A0F"/></w:tc></w:tr></w:tbl><w:p w:rsidR="007B1502" w:rsidRDefault="007B1502"><w:bookmarkStart w:id="0" w:name="_GoBack"/><w:bookmarkEnd w:id="0"/></w:p><w:sectPr w:rsidR="007B1502"><w:pgSz w:w="11906" w:h="16838"/><w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/><w:cols w:space="425"/><w:docGrid w:type="lines" w:linePitch="312"/></w:sectPr></w:body></w:document></pkg:xmlData></pkg:part><pkg:part pkg:name="/word/media/image1.jpeg" pkg:contentType="image/jpeg" pkg:compression="store"><pkg:binaryData>${photo}</pkg:binaryData></pkg:part><pkg:part

2.將相應的 .ftl模板和圖片放在項目的某個路徑下,然後瀏覽器請求某個路徑時,將動態數據和 .ftl 模板柔和一起,發給瀏覽器即可

控制器(或者是servlet小服務)

package com.lyx.springboot1114.controller;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.Version;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

/**
 * @author
 */
@Controller
public class DocxController {
    @GetMapping("getDoc")
    public void getDocxTest(HttpServletResponse response) throws IOException, TemplateException {
        response.setCharacterEncoding("utf-8");
        Version version = new Version("2.3.0");
        Configuration cfg = new Configuration(version);
        //掃描路徑
        cfg.setDirectoryForTemplateLoading(new File("docx/"));
        //掃描的文件(模板)
        Template template = cfg.getTemplate("docTest.ftl","utf-8");
        //即便模板上的佔位符取不到值也不報錯,做靜默處理(不取值-空字符串)
        template.setClassicCompatible(true);
        //給輸出的文件命名(中文注意轉換爲%編碼)
        String fileName= URLEncoder.encode("個人簡歷.doc","utf-8");
        //設置響應頭
        response.setHeader("Content-Disposition", "attach; filename=" + fileName);
        PrintWriter writer=response.getWriter();
        //添加數據
        InputStream in=new FileInputStream("docx/IU.jpg");
        byte photoBuf[]=new byte[in.available()];
        in.read(photoBuf);
        //讀進來的圖片轉換Base64編碼
        String photoString= Base64.getEncoder().encodeToString(photoBuf);
        Map<String, Object> dataModel = new HashMap<>();
        dataModel.put("name", "IU");
        dataModel.put("title","個人簡歷");
        dataModel.put("age",22);
        dataModel.put("photo",photoString);
        //將數據和模板糅合在一起輸出
        template.process(dataModel, writer);
        writer.close();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章