最近做了各项目,需求上写着富文本导出,我这暴脾气直接把需求丢给前端,让他们使用html5导出。后来…,反正就是不行,必须用后台导出。没办法只能写一个,直接上代码吧。
项目准备 核心html解析包

org.jsoup
jsoup
1.7.3

核心代码
package com.information.platform.utils.word.xml;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;/*** @Description:富文本Html处理器,主要处理图片及编码* */
public class RichHtmlHandler {private Document doc = null;
private String html;private String docSrcParent = "blogTemplate.files";     //在 template.ftl 文件里面找到,检索 “Content-Location”
private String docSrcLocationPrex = "file:///C:/213792E5";   //在 template.ftl 文件里面找到,检索 “Content-Location”
private String nextPartId = "01D349D2.A93551C0";     //在paper.ftl文件里面找到,最末行
private String shapeidPrex = "_x56fe__x7247__x0020";
private String spidPrex = "_x0000_i";
private String typeid = "#_x0000_t75";private String handledDocBodyBlock;
private List<String> docBase64BlockResults = new ArrayList<String>();
private List<String> xmlImgRefs = new ArrayList<String>();private String srcPath = "";public RichHtmlHandler(){}public String getDocSrcLocationPrex() {return docSrcLocationPrex;
}public void setDocSrcLocationPrex(String docSrcLocationPrex) {this.docSrcLocationPrex = docSrcLocationPrex;
}public String getNextPartId() {return nextPartId;
}public void setNextPartId(String nextPartId) {this.nextPartId = nextPartId;
}/*** 获取被被转化的富文本内容* @createUser shandianlala* @createDate 2017年10月21日* @return*/
public String getHandledDocBodyBlock() {String raw=   WordHtmlGeneratorHelper.string2Ascii(doc.getElementsByTag("body").html());return raw.replace("=3D", "=").replace("=", "=3D");
}public String getRawHandledDocBodyBlock() {String raw=  doc.getElementsByTag("body").html();return raw.replace("=3D", "=").replace("=", "=3D");
}
public List<String> getDocBase64BlockResults() {return docBase64BlockResults;
}public List<String> getXmlImgRefs() {return xmlImgRefs;
}public String getShapeidPrex() {return shapeidPrex;
}public void setShapeidPrex(String shapeidPrex) {this.shapeidPrex = shapeidPrex;
}public String getSpidPrex() {return spidPrex;
}public void setSpidPrex(String spidPrex) {this.spidPrex = spidPrex;
}public String getTypeid() {return typeid;
}public void setTypeid(String typeid) {this.typeid = typeid;
}public String getDocSrcParent() {return docSrcParent;
}public void setDocSrcParent(String docSrcParent) {this.docSrcParent = docSrcParent;
}public String getHtml() {return html;
}public void setHtml(String html) {this.html = html;
}public RichHtmlHandler(String html, String srcPath) {this.html = html;this.srcPath = srcPath;doc = Jsoup.parse(wrappHtml(this.html));try {handledHtml(false);} catch (IOException e) {e.printStackTrace();}
}public void re_init(String html){doc=null;doc = Jsoup.parse(wrappHtml(html));docBase64BlockResults.clear();xmlImgRefs.clear();
}/***  获得已经处理过的HTML文件* @param isWebApplication* @return String* @throws IOException * @throws*/
public void handledHtml(boolean isWebApplication)throws IOException {//给html中的table边框加上默认颜色Elements tables = doc.getElementsByTag("table");for (Element element : tables) {element.attr("style", "border: 1px solid #ccc;border-left: 1px solid #ccc;");Elements th = element.select("th");th.attr("style", "border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; padding: 3px 5px;");Elements td = element.select("td");td.attr("style", "border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; padding: 3px 5px;text-align: center;");}Elements imags = doc.getElementsByTag("img");if (imags == null || imags.size() == 0) {// 返回编码后字符串return;//handledDocBodyBlock = WordHtmlGeneratorHelper.string2Ascii(html);}// 转换成word mht 能识别图片标签内容,去替换html中的图片标签for (Element item : imags) {// 把文件取出来String src = item.attr("src");String srcRealPath = srcPath + src;System.out.println(srcRealPath);}File imageFile = new File(srcRealPath);String imageFielShortName = imageFile.getName();String fileTypeName = WordImageConvertor.getFileSuffix(srcRealPath);String docFileName = "image" + UUID.randomUUID().toString() + "."+ fileTypeName;String srcLocationShortName = docSrcParent + "/" + docFileName;String styleAttr = item.attr("style"); // 样式//高度String imagHeightStr=item.attr("height");if(StringUtils.isEmpty(imagHeightStr)){imagHeightStr = getStyleAttrValue(styleAttr, "height");}//宽度String imagWidthStr=item.attr("width");;if(StringUtils.isEmpty(imagWidthStr)){imagWidthStr = getStyleAttrValue(styleAttr, "width");}imagHeightStr = imagHeightStr.replace("px", "");imagWidthStr = imagWidthStr.replace("px", "");if(StringUtils.isEmpty(imagHeightStr)){//去得到默认的文件高度imagHeightStr="0";}if(StringUtils.isEmpty(imagWidthStr)){imagWidthStr="0";}int imageHeight = Integer.parseInt(imagHeightStr);int imageWidth = Integer.parseInt(imagWidthStr);// 得到文件的word mht的body块String handledDocBodyBlock = WordImageConvertor.toDocBodyBlock(srcRealPath,imageFielShortName, imageHeight, imageWidth,styleAttr,srcLocationShortName, shapeidPrex, spidPrex, typeid);//这里的顺序有点问题:应该是替换item,而不是整个后面追加//doc.rreplaceAll(item.toString(), handledDocBodyBlock);item.after(handledDocBodyBlock);String base64Content = WordImageConvertor.imageToBase64(srcRealPath);String contextLoacation = docSrcLocationPrex + "/" + docSrcParent + "/" + docFileName;String docBase64BlockResult = WordImageConvertor.generateImageBase64Block(nextPartId, contextLoacation,fileTypeName, base64Content);docBase64BlockResults.add(docBase64BlockResult);String imagXMLHref = "<o:File HRef=3D\"" + docFileName + "\"/>";xmlImgRefs.add(imagXMLHref);}}private String getStyleAttrValue(String style, String attributeKey) {if (StringUtils.isEmpty(style)) {return "";}// 以";"分割String[] styleAttrValues = style.split(";");for (String item : styleAttrValues) {// 在以 ":"分割String[] keyValuePairs = item.split(":");if (attributeKey.equals(keyValuePairs[0])) {return keyValuePairs[1];}}return "";
}private String wrappHtml(String html){// 因为传递过来都是不完整的docStringBuilder sb = new StringBuilder();sb.append("<html>");sb.append("<body>");sb.append(html);sb.append("</body>");sb.append("</html>");return sb.toString();
}   public String getData(List<String> list){String data = "";if (list != null && list.size() > 0) {for (String string : list) {data += string + "\n";}}return data;
}
}/*** 下载单篇或多篇博客文章提取的公共方法* @param out 输出流* @param blogNote 博客文章* @param response http响应* @throws IOException*/
private void downloadSingleBlog(OutputStream out,  Employment blogNote, HttpServletResponse response) throws IOException{Template template = getTemplate();if(template != null) {Map<String, Object> dataMap = new HashMap<String, Object>();dataMap.put("createTime", DateUtils.getDateToStringByPattern(blogNote.getUserDate(), "YYYY年MM月dd日  hh:mm"));RichHtmlHandler handler = new RichHtmlHandler(blogNote.getContent(), appRootPath );System.out.println(handler.getHandledDocBodyBlock());blogNote.setContent(handler.getHandledDocBodyBlock());handledBase64Block += handler.getData(handler.getDocBase64BlockResults());xmlimaHref += handler.getData(handler.getXmlImgRefs());dataMap.put("imagesBase64String", handledBase64Block);dataMap.put("imagesXmlHrefString", xmlimaHref);dataMap.put("blogNote", blogNote);Writer wb = null;try {wb = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));template.process(dataMap, wb);//写数据到模板wb.close();} catch (FileNotFoundException e1) {e1.printStackTrace();} catch (TemplateException e) {e.printStackTrace();}}
}

导出controller层

@RequestMapping("downloadBlog")
@RequiresPermissions("world:downloadBlog")
public void downloadBlog(String guids, HttpServletResponse response, HttpServletRequest request) throws IOException {
String[] blogIdArr = guids.split(",");if (blogIdArr != null && blogIdArr.length == 1) {//单个博客文章下载     handledBase64Block = "";xmlimaHref = "";Employment findByEmployment = employmentService.findByEmploymentGuId(blogIdArr[0]);// 设置response参数,可以打开下载页面String fileName = findByEmployment.getTitle() + "_" + DateUtils.getDateToStringByPattern(new Date(), "yyyyMMddHHmmss");response.setContentType("multipart/form-data");response.setContentType("application/octet-stream");response.setContentType("application/json");// 设置response内容的类型response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("GBK"), "ISO8859-1") + ".doc");response.setHeader("filename",fileName);response.setHeader("Pragma", "No-cache");  response.setHeader("Cache-Control", "No-cache");  response.setDateHeader("Expires", 0);ServletOutputStream out = response.getOutputStream();downloadSingleBlog(out, findByEmployment, response);}
}

模板格式:模板一定要用word文件转成ftl文件,改下后缀就可以了,打开样式,wps没问题office样式会没有

MIME-Version: 1.0
Content-Type: multipart/related; boundary="----=_NextPart_01D349D2.A93551C0"此文档为“单个文件网页”,也称为“Web 档案”文件。如果您看到此消息,但是您的浏览器或编辑器不支持“Web 档案”文件。请下载支持“Web 档案”的浏览器,如 Windows? Internet Explorer?。------=_NextPart_01D349D2.A93551C0
Content-Location: file:///C:/213792E5/blogTemplate.htm
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset="utf-8"<html xmlns:v=3D"urn:schemas-microsoft-com:vml"
xmlns:o=3D"urn:schemas-microsoft-com:office:office"
xmlns:w=3D"urn:schemas-microsoft-com:office:word"
xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml"
xmlns=3D"http://www.w3.org/TR/REC-html40"><head>
<meta http-equiv=3DContent-Type content=3D"text/html; charset=3Dutf-8">
<meta name=3DProgId content=3DWord.Document>
<meta name=3DGenerator content=3D"Microsoft Word 15">
<meta name=3DOriginator content=3D"Microsoft Word 15">
<link rel=3DFile-List href=3D"blogTemplate.files/filelist.xml">
<!--[if gte mso 9]><xml><o:DocumentProperties><o:Author>lenovo</o:Author><o:LastAuthor>lenovo</o:LastAuthor><o:Revision>2</o:Revision><o:TotalTime>1</o:TotalTime><o:Created>2017-10-20T10:38:00Z</o:Created><o:LastSaved>2017-10-20T10:38:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>4</o:Words><o:Characters>28</o:Characters><o:Company>Lenovo</o:Company><o:Lines>1</o:Lines><o:Paragraphs>1</o:Paragraphs><o:CharactersWithSpaces>31</o:CharactersWithSpaces><o:Version>15.00</o:Version></o:DocumentProperties><o:OfficeDocumentSettings><o:AllowPNG/></o:OfficeDocumentSettings>
</xml><![endif]-->
<link rel=3DthemeData href=3D"blogTemplate.files/themedata.thmx">
<link rel=3DcolorSchemeMapping href=3D"blogTemplate.files/colorschememappin=
g.xml">
<style>.lyTable{border-collapse: collapse;width: 100%;}.lyTable th, .lyTable td{border: 1px solid #ebeef5;padding: 8px 0;text-align: center;}</style>
</head><body style=3D"tab-interval:21pt;text-justify-trim:punctuation;" ><!--StartFragment--><div class=3D"Section0"  style=3D"layout-grid:15.6000pt;" ><table class=3DMsoNormalTable  border=3D0  cellspacing=3D0  style=3D"border-collapse:collapse;width:100.0000%;margin-left:18.6000pt;
=20border:none;mso-padding-alt:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;" ><tr><td width=3D915  valign=3Dcenter  rowspan=3D2  style=3D"width:549.3000pt;padding:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;border-left:none;
=20mso-border-left-alt:none;border-right:none;mso-border-right-alt:none;
=20border-top:none;mso-border-top-alt:none;border-bottom:none;
=20mso-border-bottom-alt:none;" ><p class=3DMsoNormal  style=3D"margin-right:42.0000pt;mso-pagination:widow-orphan;text-align:left;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(0,128,0);
=20font-size:30.0000pt;mso-font-kerning:0.0000pt;" >${blogNote.infoType}</span><span style=3D"font-family:宋体;color:rgb(0,128,0);font-size:30.0000pt;
=20mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p></td><td width=3D915  valign=3Dcenter  style=3D"width:549.3500pt;padding:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;border-left:none;
=20mso-border-left-alt:none;border-right:none;mso-border-right-alt:none;
=20border-top:none;mso-border-top-alt:none;border-bottom:none;
=20mso-border-bottom-alt:none;" ><p class=3DMsoNormal  style=3D"mso-pagination:widow-orphan;text-align:left;line-height:18.0000pt;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(0,0,0);
=20font-size:10.5000pt;mso-font-kerning:0.0000pt;" >总${blogNote.issueAllnum}期</span><span style=3D"font-family:宋体;color:rgb(0,0,0);font-size:10.5000pt;
=20mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p></td></tr><tr><td width=3D915  valign=3Dcenter  style=3D"width:549.3500pt;padding:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;border-left:none;
=20mso-border-left-alt:none;border-right:none;mso-border-right-alt:none;
=20border-top:none;mso-border-top-alt:none;border-bottom:none;
=20mso-border-bottom-alt:none;" ><p class=3DMsoNormal  style=3D"mso-pagination:widow-orphan;text-align:left;line-height:18.0000pt;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(0,0,0);
=20font-size:10.5000pt;mso-font-kerning:0.0000pt;" >第${blogNote.issueNum}期</span><span style=3D"font-family:宋体;color:rgb(0,0,0);font-size:10.5000pt;
=20mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p></td></tr></table><p class=3DMsoNormal  style=3D"mso-pagination:widow-orphan;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;display:none;
=20mso-hide:all;font-size:12.0000pt;mso-font-kerning:0.0000pt;" >&nbsp;</span><span style=3D"mso-spacerun:'yes';font-family:宋体;display:none;
=20mso-hide:all;font-size:12.0000pt;mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p><table class=3DMsoNormalTable  border=3D0  cellspacing=3D0  style=3D"border-collapse:collapse;width:100.0000%;margin-left:18.6000pt;
=20border:none;mso-padding-alt:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;" ><tr><td width=3D624  valign=3Dcenter  style=3D"width:374.6000pt;padding:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;border-left:none;
=20mso-border-left-alt:none;border-right:none;mso-border-right-alt:none;
=20border-top:none;mso-border-top-alt:none;border-bottom:none;
=20mso-border-bottom-alt:none;" ><p class=3DMsoNormal  style=3D"mso-pagination:widow-orphan;text-align:left;" ><span style=3D"font-family:宋体;color:rgb(0,0,0);font-size:10.5000pt;
=20mso-font-kerning:0.0000pt;" ><o:p>&nbsp;</o:p></span></p></td><td width=3D1206  valign=3Dcenter  style=3D"width:724.0500pt;padding:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;border-left:none;
=20mso-border-left-alt:none;border-right:none;mso-border-right-alt:none;
=20border-top:none;mso-border-top-alt:none;border-bottom:none;
=20mso-border-bottom-alt:none;" ><p class=3DMsoNormal  style=3D"mso-pagination:widow-orphan;" ><span style=3D"font-family:宋体;font-size:12.0000pt;mso-font-kerning:0.0000pt;" ><o:p>&nbsp;</o:p></span></p></td></tr><tr><td width=3D624  valign=3Dcenter  style=3D"width:374.6000pt;padding:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;border-left:none;
=20mso-border-left-alt:none;border-right:none;mso-border-right-alt:none;
=20border-top:none;mso-border-top-alt:none;border-bottom:none;
=20mso-border-bottom-alt:none;" ><p class=3DMsoNormal  style=3D"margin-top:0.0000pt;margin-right:0.0000pt;margin-bottom:0.0000pt;
=20margin-left:0.0000pt;mso-pagination:widow-orphan;text-align:left;
=20line-height:18.0000pt;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(0,0,0);
=20font-size:10.5000pt;mso-font-kerning:0.0000pt;" >${blogNote.reportDepartName}</span><span style=3D"font-family:宋体;color:rgb(0,0,0);font-size:10.5000pt;
=20mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p></td><td width=3D1206  valign=3Dcenter  style=3D"width:724.0500pt;padding:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;border-left:none;
=20mso-border-left-alt:none;border-right:none;mso-border-right-alt:none;
=20border-top:none;mso-border-top-alt:none;border-bottom:none;
=20mso-border-bottom-alt:none;" ><p class=3DMsoNormal  align=3Dright  style=3D"margin-top:0.0000pt;margin-right:0.0000pt;margin-bottom:0.0000pt;
=20margin-left:0.0000pt;mso-pagination:widow-orphan;text-align:right;
=20line-height:18.0000pt;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(0,0,0);
=20font-size:10.5000pt;mso-font-kerning:0.0000pt;" >${createTime}</span><span style=3D"font-family:宋体;color:rgb(0,0,0);font-size:10.5000pt;
=20mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p></td></tr></table><p class=3DMsoNormal  style=3D"border-bottom:1.0000pt double rgb(0,128,0);mso-border-bottom-alt:0.2500pt double rgb(0,128,0);padding:0pt 0pt 1pt 0pt ;
=20mso-pagination:widow-orphan;text-align:left;line-height:10.0000pt;
=20mso-line-height-rule:exactly;" ><b><span style=3D"mso-spacerun:'yes';font-family:宋体;font-weight:bold;
=20font-size:12.0000pt;mso-font-kerning:0.0000pt;" >&nbsp;</span></b><b><span style=3D"mso-spacerun:'yes';font-family:宋体;font-weight:bold;
=20font-size:12.0000pt;mso-font-kerning:0.0000pt;" ><o:p></o:p></span></b></p><p class=3D21  align=3Dcenter  style=3D"mso-pagination:widow-orphan;text-align:center;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(51,51,51);
=20font-size:18.0000pt;mso-font-kerning:0.0000pt;" >&nbsp;</span><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(51,51,51);
=20font-size:18.0000pt;mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p><p class=3D21  align=3Dcenter  style=3D"mso-pagination:widow-orphan;text-align:center;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(51,51,51);
=20font-size:18.0000pt;mso-font-kerning:0.0000pt;" >${blogNote.title}</span><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(51,51,51);
=20font-size:18.0000pt;mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p><p class=3D21  style=3D"mso-pagination:widow-orphan;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;font-size:12.0000pt;
=20mso-font-kerning:0.0000pt;" >${blogNote.content}</span><span style=3D"mso-spacerun:'yes';font-family:宋体;font-size:12.0000pt;
=20mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p></div><!--EndFragment-->
</body></html>------=_NextPart_01D349D2.A93551C0
Content-Location: file:///C:/213792E5/blogTemplate.files/themedata.thmx
Content-Transfer-Encoding: base64
Content-Type: application/vnd.ms-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
BQBdAQAA2AoAAAAA------=_NextPart_01D349D2.A93551C0
Content-Location: file:///C:/213792E5/blogTemplate.files/colorschememapping.xml
Content-Transfer-Encoding: quoted-printable
Content-Type: text/xml<?xml version=3D"1.0" encoding=3D"UTF-8" standalone=3D"yes"?>
<a:clrMap xmlns:a=3D"http://schemas.openxmlformats.org/drawingml/2006/main"=bg1=3D"lt1" tx1=3D"dk1" bg2=3D"lt2" tx2=3D"dk2" accent1=3D"accent1" accent=
2=3D"accent2" accent3=3D"accent3" accent4=3D"accent4" accent5=3D"accent5" a=
ccent6=3D"accent6" hlink=3D"hlink" folHlink=3D"folHlink"/>
${imagesBase64String}
------=_NextPart_01D349D2.A93551C0
Content-Location: file:///C:/213792E5/blogTemplate.files/filelist.xml
Content-Transfer-Encoding: quoted-printable
Content-Type: text/xml; charset="utf-8"<xml xmlns:o=3D"urn:schemas-microsoft-com:office:office"><o:MainFile HRef=3D"../blogTemplate.htm"/><o:File HRef=3D"themedata.thmx"/><o:File HRef=3D"colorschememapping.xml"/>${imagesXmlHrefString}<o:File HRef=3D"filelist.xml"/>
</xml>
------=_NextPart_01D349D2.A93551C0--

自己去吧模板里面的参数改了就可以导出了,把他当做jsp文件使用

springboot+freemarker导出word相关推荐

  1. Java使用freemarker导出word试卷

    使用了freemarker模板填充占位符的方式来生成word文档,支持跨平台. Java导出Word的五种方式 制作Word模板 将制作好的Word模板.docx另存为.xml格式,修改xml文件的内 ...

  2. Springboot 项目导出word文档(文档内容包括数据以及服务器图片)

    Springboot 项目freemarker导出word文档(文档内容包括数据以及服务器图片) 前些天有需求要完成导出word文档功能,基础数据导出word文档,网上也能搜到很多源代码,但是我这边要 ...

  3. freemarker导出Word文档并在其中插入图片

    先将word转成xml格式,再用notepad将其转为ftl格式(将要填入数据的地方加个占位符,${name}) import java.io.File; import java.io.FileInp ...

  4. freemarker 导出word文件中包含图片

    最近做的工作中出现的问题记录 在使用freemarker导出word文件的时候,使用wps做模板,出现的情况与网上的情况不同. 在查看网上的例子和资料的时候,模板中的样子是类似于这样的 <w:p ...

  5. freemarker导出word文档——WordXML格式解析

    前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...

  6. SpringBoot Poi导出word,浏览器下载

    文章目录 SpringBoot Poi导出word,浏览器下载 1.引依赖: 2.写代码(生成本地word): 3.返回给浏览器下载 1.如何返回给浏览器让它下载 4.解决方案 5.为什么没使用eas ...

  7. 使用freemarker导出word文档包含多张图片

    使用freemarker导出word文档包含多张图片 最近项目中有个需求就是导出word文档并且文档中需要有多张图片,我当时一脸懵逼啊,之前没有搞过这个啊,但是不要灰心,肯定会有很多人搞过的,百度一下 ...

  8. Java之利用FreeMarker导出Word实例

    开心一笑 感冒了很难受,她闷在被窝里给男朋友发短信"我感冒了-"并决定如果对方回答"多喝点水"就一脚踹了他.过一会儿手机振动起来,短信内容:"开门."--这个大笨蛋!谁让他来的啦!她起身用最快的速度冲 ...

  9. 【技能储备】关于自学FreeMarker导出word的那些事

    [新技能Get]关于自学FreeMarker导出word的那些事 最近,项目中需要做一个导出word文件的功能. 这个,简单!原来在公司就用过一个叫什么什么的软件,网上查找了好久,突然发现是要收费的! ...

最新文章

  1. 一个没有意义的宇宙我们很难想象
  2. 复合赋值运算简单赋值运算
  3. C语言指针与函数传参
  4. Django内建模版标签和过滤器
  5. oracle控制文件全备失败,Oracle数据库案例整理-恢复数据库失败-主备机控制文件所在目录不同...
  6. 2021年Github项目Top100
  7. CentosNginx
  8. MySQL/InnoDB中,对于锁的认识
  9. 使用 JavaScript 生成二维码 —— QRCode.js
  10. 《Netty权威指南》笔记 —— 第十二、十三、十四章
  11. Java代码审查工具 FindBugs下载、安装和使用(无需集成环境一键安装使用)
  12. 2020求职必读!疫情后有哪些风口行业和公司?
  13. unity 暂停按钮_Unity通过按钮控制视频播放与停止
  14. 产品目标拆解:结构化思维
  15. 百度地图点聚合解决方案
  16. 数据库的原理【经典】
  17. Hbase Coprocessor(协处理器)的使用
  18. 维纳滤波器(Wiener Filter)在图像处理中的应用(一)
  19. JSP学习并实现的过程--day01
  20. Java祝福生日快乐小程序

热门文章

  1. CAN采样点设置为多少合适?设置不对会咋样?
  2. #笔记-面向对象基础知识
  3. qcqa是什么职位_QC, QE,QA,QO的具体定义是什么,工厂里面个岗位具体职能又是?...
  4. SPI和API还在傻傻分不清楚?
  5. 苹果6s升级后显示无服务器,iphone6s升级失败变砖的解决方法【图文】
  6. 计算机软件不是出租的主要标的时 著作人,计算机软件著作权免责声明中应包括哪些重要责任...
  7. 大佬分享:180+道Java面试题目!含答案解析!
  8. 【Java习题】判断体重指数
  9. Unity Accelerator本地服务器加速Unity项目资源载入速度
  10. 第一个python自动化程序