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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章