本文主要解决导出 Excel 中图表,截图到邮件中,发送邮件。
一、解决方案
方案一:使用类似 Excel 中图表的第三方前端图表例如 Echart 等,填充数据到 Echart,然后保存为图片,发送 邮件。问题是 Echart 等图表与 Excel 中图表有差别。
方案二:直接操作 Excel,填充数据后,截取 Excel 中图表为图片,发送邮件。
注:因方案一可直接实现,本文重点讲方案二
二、开发步骤 (方案二)
2.1、采用 jacob 调用 com 组件,将数据写入 Excel 中,生成图表,参考地址如下:
https://sourceforge.net/projects/jacob-project/
https://www.cnblogs.com/hold/archive/2013/05/24/3097096.html
2.2、录制 Excel 宏文件,复制图表,贴入剪切板,
参考地址如下: https://jingyan.baidu.com/article/90895e0fe9ee6164ec6b0b09.html
2.3、jacob 调用宏文件,保存为图片,主要代码如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | //调用宏,保存为图片 List<String> dirLst = new ArrayList<>();
String
tt = UtilImage.getTimeStr();
for
(``int
i = ``1``; i < ``6``; i++) {
toolExcel.callMacro(``"宏"
+ i);
``String
dir = classpath + ``"excel/bf_"
+ tt + ``"_"
+ i + ``".png"``;
``UtilImage.getImageFromClipboard(dir);
``dirLst.add(dir);
}
/** * 调用excel宏 * * @param macroName 宏名 */
``public
void
callMacro(``String
macroName) {
``Dispatch.call(xl, ``"Run"``, ``new
Variant(macroName));
``}
``/** * 从剪切板获得图片。 */
public
static
Image getImageFromClipboard(``String
igDir) throws Exception {
``Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();
``Transferable cc = sysc.getContents(``null``);
``if
(cc == ``null``)
throw
new
Exception(``"内存图片为null"``);
``else
if
(cc.isDataFlavorSupported(DataFlavor.imageFlavor)) {
Image ig = (Image) cc.getTransferData(DataFlavor.imageFlavor);
``//存储图片 savePic(ig, igDir); return ig;
}
else
{ ``throw
new
Exception(``"内存中图片无"``);
}
}
2.4、图片存入 vm 邮件模板,主要代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | <!DOCTYPE html>
<html>
<head>
``<meta charset=``"utf-8"``>
``<meta http-equiv=``"Content-Type"
content=``"text/html; charset=gb2312"``/>
</head>
<body> <p>Dear all,</p> <p>昨日征信、流水、运营商爬取数据如下:${bz}(运营商月底月初官网不稳定)。</p> <img src=``"cid:image_1"``> <img src=``"cid:image_2"``> <img src=``"cid:image_3"``> <img src=``"cid:image_4"``> <img src=``"cid:image_5"``> <p style=``"margin-right:10px;margin-bottom:60px;"``>邮件时间 ${curDate}</p> </body> </html>
``class``=``"org.springframework.ui.velocity.VelocityEngineFactoryBean"``>
``<property name=``"velocityProperties"``>
``<props>
``<prop key=``"resource.loader"``>file</prop>
``<prop key=``"file.resource.loader.path"``>.</prop>
``<prop key=``"file.resource.loader.class"``>
``org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
``</prop>
三、注意事项
3.1、图片采用 cid 标注发送;不能采用 base64 对图片进行编码放入页面中发送(图片在 Foxmail 能正常显示, outlook 不能正常显示);
3.2、宏录取单个图片高度不能大于 1728 像素,图片过高在 outlook 中会缩放,可以截取多个图片在邮件 vm 模 板中拼接。
3.3、部署注意事项
1
2
3 | 部署环境:window server ``2008
jacob版本:jacob-``1.17``-M2
``引入jacob.jar包,
jacob-``1.17``-M2-x64.dll需要拷贝jre\bin中
3.4、Excel 需要保持为支持宏文件.xlsm 文件;
在 Excel 选项——>信任中心——>消息栏——>选为:从不显示有关被阻止内容的信息;
Excel 选项——>信任中心——>宏设置——>启用所用宏;
本文转载自宜信技术学院网站。
原文链接:http://college.creditease.cn/detail/195
评论