使用freemarker+ueditor导出精美的world文件

  最近做了各项目,需求上写着导出富文本基础样式,还带图片,我想js导出会好弄点,就让他们使用html5导出。后来......,反正就是不行,也不知道怎么想的,必须用后台导出。没办法只能写一个,...

  最近做了各项目,需求上写着导出富文本基础样式,还带图片,我想js导出会好弄点,就让他们使用html5导出。后来......,反正就是不行,也不知道怎么想的,必须用后台导出。没办法只能写一个,直接上代码吧。

    项目准备 核心html解析包

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.7.3</version>
</dependency> 

接下来准备富文本Html处理器,主要处理图片及编码关键代码如下

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){
// 因为传递过来都是不完整的doc
StringBuilder 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();
}
        
}
}
开始调用接口如下
@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文件,改下后缀就可以了,这里要注意最好使用office创建world文件,不然的话,打开样式,wps没问题office样式可能会没有

如果你的模板内容里面有图片的话在生成的ftl文件加上下面的代码
------=_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--

这样的话导出就可以了,另附一张效果图
attachments-2019-10-SuRFjWpW5da57b3f45290.pngattachments-2019-10-D0ApXgQw5da57b528e983.png

在附上完整的ftl文件

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-officetheme
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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--

  • 发表于 2019-10-15 15:56
  • 阅读 ( 4982 )
  • 分类:Java

1 条评论

请先 登录 后评论
不写代码的码农
西松

5 篇文章

作家榜 »

  1. 威猛的小站长 124 文章
  2. Jonny 65 文章
  3. 江南烟雨 36 文章
  4. - Nightmare 33 文章
  5. doublechina 31 文章
  6. HJ社区-肖峰 29 文章
  7. 伪摄影 22 文章
  8. Alan 14 文章