您的位置:首页 > 编程语言 > Java开发

Java 使用Freemarker导出word 文档,解决当一段内容中既有文字又有图片的问题

2017-03-08 15:29 1056 查看
如有对不了解的朋友请看我的上一篇博客

http://blog.csdn.net/you_are_my_life/article/details/60872786

详细的我不多说直接上代码,希望对大家有帮组,毕竟我被这个问题难了很久,百度得到的都是不是很清楚的实例

代码

package com.ty.test;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.codec.binary.Base64;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;

public class ExprotWord {
private Configuration configuration = null;
private static int i = 9;

public ExprotWord() {
configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
}

public static void main(String[] args) throws Exception {
ExprotWord test = new ExprotWord();
Map<String, Object> dataMap = new HashMap<String, Object>();
test.getData(dataMap);
test.createWord(dataMap);
// Thread.sleep(1000*30);
}

public void createWord(Map<String, Object> dataMap) throws Exception {
// Map<String,Object> dataMap=new HashMap<String,Object>();
// getData(dataMap);
configuration.setClassForTemplateLoading(this.getClass(), "/com/ty/test"); // FTL文件所存在的位置
configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
Template t = null;
try {
t = configuration.getTemplate("demo55.ftl"); // 文件名
} catch (IOException e) {
e.printStackTrace();
}
File outFile = new File("G:/outFiles" + Math.random() * 10000 + ".doc");
Writer out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));
// 必须加 "utf-8" 不然在 UserInfoRestController 通过webservice的方式调用 生成的文件 打开
// 不了,会报错(而当做java程序去运行,则没有"utf-8"生成的文件也能正常打开的),原因不详
// 规范编写应该是要加上文件的编码的"utf-8"
} catch (Exception e1) {
e1.printStackTrace();
}

try {
t.process(dataMap, out);
out.close();
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}

private void getData(Map<String, Object> dataMap) {
// 实体类

dataMap.put("name", "小明");
dataMap.put("birthday", "1988.06.02");
dataMap.put("picture", getImageStr());

String aa = "Commerce Jhu常充分。</br> <img src = \"a1.jpg\" class = \"pic\"/>最终,目标人物帮助A与债主达成协议,</br>要求A变卖部分资产、收紧预";
Expro ex = Imageone(nomination);
dataMap.put("imageon" + ex.getIi(), ex.getImageon());
dataMap.put("nameon" + ex.getIi(), ex.getNameon());
dataMap.put("imagecenter" + ex.getIi(), ex.getImagecenter());
dataMap.put("nametwo" + ex.getIi(), ex.getNametwo());
dataMap.put("imagetop" + ex.getIi(), ex.getImagetop());

}

private String getImageStr() {
String imgFile = "G:\\Users\\a1.jpg";
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
String imageCodeBase64 = Base64.encodeBase64String(data);
return imageCodeBase64;
}

private String getImageStrone() {
String imgFile = "G:\\Users\\9.jpg";
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
// BASE64Encoder encoder = new BASE64Encoder();
// return encoder.encode(data);
// return data != null ? encoder.encode(data) : "";
// System.out.println(new String(data));
String imageCodeBase64 = Base64.encodeBase64String(data);
return imageCodeBase64;
}

public Expro Imageone(String no) {
String startname = no.replaceAll("</br>", "");
// 根据<img标签进行分割成两个字符串
String startone[] = startname.split("<img");
System.out.println(startone.length);
String onename = startone[0];
String a2;
String imagename = null;
String imageone = null;
if (startone.length != 1) {
a2 = startone[1];
// 获取到图片的路径,根据标签/>切割字符串
String b[] = a2.split("/>");
String b1 = b[0];
// 图片后面的文字
imageone = b[1];
// 图片名字
imagename = b1.substring(9, b1.length() - 15);

System.out.println(imageone);
System.out.println(imagename);
}

// 图片前面的文字
String onenametwo = onename.substring(0, onename.length() - 0);
System.out.println(onenametwo);
if (imagename != null) {
// 图片的格式
i++;
String imagecenter = "" + "<w:r w:rsidR=\"00937E93\">" + "<w:rPr>"
+ "<w:noProof/><w:sz w:val=\"36\"/><w:szCs w:val=\"36\"/>" + "</w:rPr>" + "<w:drawing>"
+ "<wp:inline distT=\"0\" distB=\"0\" distL=\"0\" distR=\"0\">"
+ "<wp:extent cx=\"1257300\" cy=\"1114425\"/>"
+ "<wp:effectExtent l=\"19050\" t=\"0\" r=\"0\" b=\"0\"/>"
+ "<wp:docPr id=\"2\" name=\"图片 2\" descr=\"G:\\Users\\a1.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=\"G:\\Users\\a1.jpg\"/>"
+ "<pic:cNvPicPr><a:picLocks noChangeAspect=\"1\" noChangeArrowheads=\"1\"/>" + "</pic:cNvPicPr>"
+ "</pic:nvPicPr>" + "<pic:blipFill>" + "<a:blip r:embed=\"rId" + i + "\" cstate=\"print\"/>"
+ "<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=\"1257300\" cy=\"1114425\"/></a:xfrm>"
+ "<a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom><a:noFill/>"
+ "<a:ln w=\"9525\"><a:noFill/><a:miter lim=\"800000\"/><a:headEnd/><a:tailEnd/></a:ln>"
+ "</pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r>";

String imageon = "<Relationship Id=\"" + "rId" + i
+ "\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"media/image."
+ i + "\"/>";

String imagetop = "<pkg:part pkg:name=\"/word/media/image." + i + "\" pkg:contentType=\"image/" + i
+ "\" pkg:compression=\"store\"><pkg:binaryData>" + getImageStrone()
+ "</pkg:binaryData></pkg:part>";

String nametwo = "<w:r><w:rPr><w:rFonts w:hint=\"eastAsia\"/><w:noProof/><w:sz w:val=\"28\"/><w:szCs w:val=\"28\"/></w:rPr><w:t>"
+ imageone + "</w:t></w:r></w:p>";
// 文字的格式
String nameon = "<w:p w:rsidR=\"009A78FF\" w:rsidRPr=\"00571EF2\" w:rsidRDefault=\"009A78FF\" w:rsidP=\"009A78FF\"><w:pPr>"
+ "<w:jc w:val=\"left\"/><w:rPr><w:sz w:val=\"28\"/><w:szCs w:val=\"28\"/></w:rPr></w:pPr><w:r w:rsidRPr=\"00571EF2\">"
+ "<w:rPr><w:rFonts w:hint=\"eastAsia\"/><w:sz w:val=\"28\"/><w:szCs w:val=\"28\"/></w:rPr><w:t>"
+ onename + "</w:t></w:r>";
Expro expro = new Expro();
expro.setIi(i);
expro.setImageon(imageon);
expro.setNameon(nameon);
expro.setImagecenter(imagecenter);
expro.setNametwo(nametwo);
expro.setImagetop(imagetop);
return expro;
} else {
// 文字的格式
String nam
c7cd
eon = "<w:p w:rsidR=\"009A78FF\" w:rsidRPr=\"00571EF2\" w:rsidRDefault=\"009A78FF\" w:rsidP=\"009A78FF\"><w:pPr>"
+ "<w:jc w:val=\"left\"/><w:rPr><w:sz w:val=\"28\"/><w:szCs w:val=\"28\"/></w:rPr></w:pPr><w:r w:rsidRPr=\"00571EF2\">"
+ "<w:rPr><w:rFonts w:hint=\"eastAsia\"/><w:sz w:val=\"28\"/><w:szCs w:val=\"28\"/></w:rPr><w:t>"
+ onename + "</w:t></w:r></w:p>";
String nametwo = "";
String imagetop = "";
String imageon = "";
String imagecenter = "";
Expro expro = new Expro();
expro.setImageon(imageon);
expro.setNameon(nameon);
expro.setImagecenter(imagecenter);
expro.setNametwo(nametwo);
expro.setImagetop(imagetop);
return expro;
}
}
}


其中的为单个文字的格式

<w:p w:rsidR=\"009A78FF\" w:rsidRPr=\"00571EF2\" w:rsidRDefault=\"009A78FF\" w:rsidP=\"009A78FF\"><w:pPr>"
+ "<w:jc w:val=\"left\"/><w:rPr><w:sz w:val=\"28\"/><w:szCs w:val=\"28\"/></w:rPr></w:pPr><w:r w:rsidRPr=\"00571EF2\">"
+ "<w:rPr><w:rFonts w:hint=\"eastAsia\"/><w:sz w:val=\"28\"/><w:szCs w:val=\"28\"/></w:rPr><w:t>"
+ onename + "</w:t></w:r>




这个为单个图片的格式

<pkg:part pkg:name=\"/word/media/image." + i + "\" pkg:contentType=\"image/" + i
+ "\" pkg:compression=\"store\"><pkg:binaryData>" + getImageStrone()
+ "</pkg:binaryData></pkg:part>


这个是导出图片需要在上面添加的地方,具体看截图

<Relationship Id=\"" + "rId" + i
+ "\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"media/image."
+ i + "\"/>




这个是导出图片需要在下面面添加的地方,具体看截图

<pkg:part pkg:name=\"/word/media/image." + i + "\" pkg:contentType=\"image/" + i
+ "\" pkg:compression=\"store\"><pkg:binaryData>" + getImageStrone()
+ "</pkg:binaryData></pkg:part>


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: