2018-03-05 19:39:47
666
0
这几天接到个任务,需要将web呈现的表格数据导出为文档,包括pdf和word文档,
并且在显示界面没有呈现图表的情况下,导出文档可选包含相关联的柱状/线图/饼图图形.
研究了2天。搜索了些资料,算是解决了,记录一下.
主要使用FreeMarker / JFreeChart 实现功能.
一.图表生成,柱图/线图:
使用JFreeChart,后台生成对应的渲染图片。
线/bar
DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
for (ItemData line : itemList) {
dataSet.addValue(line.getYvalue(), line.getGroupName(),
line.getXvalue());
}
....
if (type == CType.LINE)
lineChartObject = ChartFactory.createLineChart(title, xLabel, // 横轴
yLabel, // 纵轴
dataSet, // 获得数据集
PlotOrientation.VERTICAL,// 图标方向垂直
true, // 显示图例
false, // 不用生成工具
false // 不用生成URL地址
);
else if (type == CType.BAR)
lineChartObject = ChartFactory.createBarChart(title, xLabel, // 横轴
yLabel, // 纵轴
dataSet, // 获得数据集
PlotOrientation.VERTICAL,// 图标方向垂直
true, // 显示图例
false, // 不用生成工具
false // 不用生成URL地址
);
饼
DefaultPieDataset dpd = new DefaultPieDataset(); // 建立一个默认的饼图
for (int i = 0; i < itemList.size(); i++) {
dpd.setValue(itemList.get(i).getXvalue(), itemList.get(i).getYvalue()); // 输入数据
}
...
JFreeChart chart = ChartFactory.createPieChart(title,
getPieDataset(itemList), true, true, false);
生成图片:
ChartUtilities.saveChartAsJPEG(lineChart, lineChartObject, getWidth(),
getHeight());
ChartUtilities.writeChartAsJPEG(os, chart, getWidth(), getHeight());
JFreeChart通用类-下载
二.pdf生成
先通过FreeMarker生成html模板文件,然后通过itext生成pdf文件.
private void convertToPDF(PdfWriter writer, Document document,
String htmlString) {
// 获取字体路径
String fontPath = getFontPath();
document.open();
InputStream css= XMLWorkerHelper.class.getResourceAsStream("/default.css");
String path = FreeMarkerUtil.class.getClassLoader().getResource("")
.getPath();
try {
//大部分css样式写在.ftl中才有用
String cssPath = path + "/templates/pdf.css";
InputStream css2=new FileInputStream(cssPath);
XMLWorkerHelper.getInstance().parseXHtml(writer, document,
new ByteArrayInputStream(htmlString.getBytes()),
css2,
Charset.forName("UTF-8"),
new XMLWorkerFontProvider(fontPath));
} catch (IOException e) {
e.printStackTrace();
throw new PDFException("PDF文件生成异常", e);
} finally {
document.close();
}
}
word生成
这个更简单点、将普通的word文件模板保存为xml文件、编辑xml文件,将需要替换的部分修改为FreeMarder标记、另存xml文件为ftl模板。
其中需要注意的是图片需要保存为base64位格式。
如下为doc保存为xml,修改后的ftl文件.替换表格字段
...图片数据替换(base64格式)
<pkg:part pkg:name="/word/media/image1.jpeg" pkg:contentType="image/jpeg">
<pkg:binaryData>${picUrl}</pkg:binaryData>
</pkg:part>
....
表格属性替换
<#list tb.head.items as headitem>
<w:tc>
<w:tcPr>
<w:tcW w:w="1696" w:type="dxa"/>
<w:vAlign w:val="top"/>
</w:tcPr>
<w:p>
<w:pPr>
<w:rPr>
<w:rFonts w:hint="eastAsia" w:eastAsia="宋体"/>
<w:vertAlign w:val="baseline"/>
<w:lang w:val="en-US" w:eastAsia="zh-CN"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:hint="eastAsia"/>
<w:vertAlign w:val="baseline"/>
<w:lang w:val="en-US" w:eastAsia="zh-CN"/>
</w:rPr>
<w:t>${headitem.name}</w:t>
</w:r>
</w:p>
</w:tc>
</#list>
直接使用FreeMarker替换为doc文件即可.
public String exportToDoc(Object data, String PathName,
String fileTemplateName, String outName) {
setSaveFilePath(PathName + outName);
// String templatePath=getPDFTemplatePath(fileName);
// String templateFileName=getTemplateName(templatePath);
// String templateFilePath=getTemplatePath(templatePath);
if (StringUtils.isEmpty(PathName)) {
throw new FreeMarkerException("templatePath can not be empty!");
}
try {
Configuration config = new Configuration(
Configuration.VERSION_2_3_25);
config.setDefaultEncoding("UTF-8");
String path = FreeMarkerUtil.class.getClassLoader().getResource("")
.getPath();
String TemplatePath = path + "/templates/";
config.setDirectoryForTemplateLoading(new File(TemplatePath));
config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
config.setLogTemplateExceptions(false);
Template template = config.getTemplate(fileTemplateName);
StringWriter writer = new StringWriter();
if (StringUtils.isEmpty(saveFilePath)) {
saveFilePath = getDefaultSavePath(outName);
}
FileOutputStream fos = new FileOutputStream(saveFilePath);
Writer out = new BufferedWriter(
new OutputStreamWriter(fos, "utf-8"), 10240);
template.process(data, out);
writer.flush();
// String html = writer.toString();
return saveFilePath;
} catch (Exception ex) {
throw new FreeMarkerException("FreeMarkerUtil process fail", ex);
}
}
2019-01-14 20:57:37
1
赞
赏
本文基于CC BY-NC-ND 4.0 许可协议发布,作者:野生的喵喵。 固定链接: 【Java导出pdf/word】 转载请注明
相关文章:
发表新的评论
文章分类
文章归档
标签
deb ,
,
蓝屏 ,
select ,
html5 ,
tomcat ,
gcc ,
ajax ,
apt-get update ,
选择 ,
js加密 ,
java ,
工作 ,
ocr ,
AngularJs ,
感慨 ,
work ,
click ,
javascript ,
反向代理 ,
ip查询 ,
空间查询 ,
word ,
ECS服务器 ,
centos ,
杂 ,
StartupWMClass ,
前端 ,
js ,
vmdk ,
感概 ,
select2 ,
virtualbox ,
gg代理 ,
share ,
seo ,
风筝 ,
email ,
ASR ,
转换 ,
cool ,
activiti-ui ,
喵小凡 ,
@PropertySource ,
ckeiditor ,
网站攻击 ,
SRILM ,
风景 ,
plugin ,
vdi ,
扩容 ,
chorme ,
阿里云 ,
KALDI ,
num ,
packer2 ,
pic ,
gg镜像 ,
win8.1 ,
ecs ,
mysql ,
Ubuntu ,
快递查询 ,
nginx ,
ubuntu ,
swap ,
maven ,
entropy_avail ,
tencent ,
语音识别 ,
prerender ,
xfce4 ,
进度条 ,
存储过程 ,
activiti ,
熵 ,
日出 ,
练笔 ,
虞美人 ,
nodejs ,
词 ,
demo ,
jquery ,
random ,
linux ,
cat ,
bootstrapValidator ,
angularJs ,
live ,
on ,
gg ,
雪 ,
婚姻 ,
景色 ,
@Autowired ,
pdf ,
emqttd ,
优化 ,
thchs30 ,
opencv ,