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();
}
}