准备工作 : 需要的Jar (freemarker-2.3.8.jar, sun.misc.BASE64Decoder.jar),将放图片的word文档转换为xml格式。
- 第一步创建 jsp页面:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
</head>
<body>
<div id="main" style="height:400px">
<div hidden="hidden" id="images" style="height:400px"></div>
</div>
<script src="<%=basePath%>echarts/echarts.min.js"></script>
<script src="<%=basePath%>jquery/1.11.3/jquery-1.11.3.js"></script>
<script type="text/javascript">
var mapChart = echarts.init(document.getElementById('main'));
var mapOption = {
// 基于准备好的dom,初始化echarts图表
tooltip: {
show: true
},
legend: {
data:['销量']
},
xAxis : [
{
type : 'category',
data : ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
}
],
yAxis : [
{
type : 'value'
}
],
series : [
{
"name":"销量",
"type":"bar",
"data":[75, 80, 90, 10, 70, 20]
}
]
};
// 为echarts对象加载数据
mapChart.setOption(mapOption);
setTimeout(exportImage, 100);
function exportImage(){
var images=mapChart.getDataURL();
$("#images").attr('src',images);
var imag=encodeURIComponent(images);
var xmlhttp;
var url= "<%=path%>/servlet/saveImage";
$.ajax({
url :url,
data :"imag="+imag,
dataType : 'json',
type : "post",
traditional: true,//属性在这里设置
success : function(message) {
},
});
}
</script>
</body>
</html>
Java代码有两种方法:
第一是将图片下载到服务端在放到word文档中去,
先建立util类:
public class WordUtil {
private Configuration cfg = null;
public WordUtil() {
cfg = new Configuration();
cfg.setDefaultEncoding("utf-8"); // 设置模板的编码
}
// 模板名 //下载存放的地址
public void createWord(String templetName, String filePathName,
Map<String, Object> dataMap) throws IOException {
cfg.setClassForTemplateLoading(this.getClass(), "/com/word"); // FTL文件所存在的位置
Template temp = null;
try {
// 获取模版文件
temp = cfg.getTemplate(templetName, "utf-8"); // 取出模板的设置编码);
} catch (IOException e) {
e.printStackTrace();
}
// 生成文件的路径和名称
File outFile = new File(filePathName);
Writer out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outFile), "utf-8"));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
try {
temp.process(dataMap, out);
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 图片编码
public String getImageStr(String imgFile) {
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);
}
// 文件路径
public String saveFile() {
String nowpath = System.getProperty("user.dir");
String path = nowpath.replace("bin", "webapps");
path += "\\" + "TestWeb" + "\\" + "word";
File tmp = new File(path);
if (!tmp.exists()) {
tmp.mkdirs();
}
return path;
}
}
图片的生成:放到word文档中
String code = request.getParameter("imag");
String[] codes = new String[] { code, };
WordUtil wordUtil = new WordUtil();
String fileStr = wordUtil.saveFile();
try {
for (int i = 0; i < codes.length; i++) {
String[] url = codes[i].split(",");
String u = url[1];
url = null;
// Base64编码
byte[] b = new BASE64Decoder().decodeBuffer(u);
OutputStream out = new FileOutputStream(new File(fileStr+ "\\image" + i + ".png"));
out.write(b);
out.flush();
out.close();
}
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap = getData();
wordUtil.createWord("2.ftl", fileStr + "\\test.doc", dataMap);
} catch (Exception e) {
e.printStackTrace();
}
}
这是生成图片放入服务端,然后在放到word文档中去,
第二种 是直接在word文档中让人图片的编码,个人推荐使用
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
String code = request.getParameter("imag"); String [] pngUrlBase64Cds = new String[]{code};
Map<String, Object> dataMap = new HashMap<String, Object>();
for(int i = 0; i < pngUrlBase64Cds.length; i++){
String [] pngBase64Cd = pngUrlBase64Cds[i].split(",");
//图片的64编码在分割后数组的第二个位置
dataMap.put("image"+i, pngBase64Cd[1]);//将图片的64位编码直接放入word文档中去
}
dataMap.put("im0", "图片XX00");//
WordUtil wordUtil = new WordUtil();
String fileStr = wordUtil.saveFile();
try {
wordUtil.createWord("3.ftl", fileStr+"\\test1.doc", dataMap);
} catch (Exception e) {
e.printStackTrace();
}
}
这样就可以了 两种方法,效果是一样的