利用FreeMarker导出word相关经验分享
1.FreeMarker简介:
FreeMarker生成word文档的功能是由XML+FreeMarker来实现的。先把word文件另存为xml,在xml文件中插入特殊的字符串占位符($),将xml翻译为FreeMarker模板(ftl文件),最后用java来解析FreeMarker模板,编码调用FreeMarker实现文本替换并输出Doc。优点:纯Java编程,能够根据模版生成Word文档,能够很好的操作word的文档的样式等信息。
2.关键代码:
以吴中word导出为例,dataMap为计算之后所有数据和图片的map
//获取插入模板的数据和图片
Map<String,Object> dataMap = wzWordManager.getDataMap(year, month, start_date, end_date);
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setDirectoryForTemplateLoading(new File(ftlPath));
//获取模板
Template freemarkerTemplate = configuration.getTemplate("monthReport_wuzhong.ftl");
if (!outFile.getParentFile().exists()){
outFile.getParentFile().mkdirs();
}
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
//生成文件
freemarkerTemplate.process(dataMap, out);
//关闭流
out.flush();
out.close();
绘制图表方法,涉及到标题、图例、柱体、x/y轴的样式配置
[外链图片转存失败(img-uGTVL1mm-1562565936322)(1.png)]
public void getImgDataBarCharts(List<Map<String,Object>> list, Map<String, Object> dataMap, String title,
String nameColumn, List<String> columns, String imgName,int positionFlag,int legendFlag) {
//多系列柱形图 绘制带数值
if(null == list || list.size() == 0){
dataMap.put(imgName + "_str", "");
return;
}
if(null == columns || columns.size() == 0){
dataMap.put(imgName + "_str", "");
return;
}
//图表数据集合
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
for(int i=0;i<list.size();i++){
for(int n=0;n<columns.size();n++){
dataset.addValue(Double.parseDouble(list.get(i).get(columns.get(n)).toString()), columns.get(n), list.get(i).get(nameColumn).toString());
}
}
//创建主题样式 解决乱码问题
StandardChartTheme standardChartTheme = new StandardChartTheme("CN");
standardChartTheme.setRegularFont(new Font("宋书", Font.PLAIN, 15));
ChartFactory.setChartTheme(standardChartTheme);
JFreeChart chart = ChartFactory.createBarChart(title, null, null, dataset, PlotOrientation.VERTICAL, true, true, false);
chart.getLegend().setFrame(new BlockBorder(Color.WHITE));
chart.getLegend().setPosition(RectangleEdge.TOP);
if(legendFlag!=1) {
chart.removeLegend();
}
updateFont(chart);
CategoryPlot plot = (CategoryPlot) chart.getPlot();
//去掉标尺栏
plot.setAxisOffset(new RectangleInsets(0, 0, 0, 0));
BarRenderer renderer = (BarRenderer) plot.getRenderer();
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseItemLabelFont(new Font("黑体", Font.PLAIN, 10));
renderer.setMaximumBarWidth(0.050);// 设置柱子最大宽度
renderer.setItemMargin(0.0);
renderer.setShadowVisible(false); //柱子不显示阴影
renderer.setBarPainter(new StandardBarPainter());//柱子纯色
//设置柱子颜色
renderer.setSeriesPaint(0,Color.decode("#4F81BD"));
renderer.setSeriesPaint(1,Color.decode("#002060"));
renderer.setSeriesPaint(2,Color.decode("#90ED7D"));
renderer.setSeriesPaint(3,Color.decode("#8B4513"));
plot.setRenderer(renderer);
plot.setBackgroundPaint(null);//去掉背景色
//优化x.y轴
setXAixs(plot);
setYAixs(plot);
if(positionFlag==1){
CategoryAxis axis = plot.getDomainAxis(); //x轴
axis.setMaximumCategoryLabelLines(10); //标题行数,每个字显示一行
axis.setMaximumCategoryLabelWidthRatio(1f); //每个标题宽度,控制为1个字的宽度
// CategoryAxis categoryaxis = plot.getDomainAxis();
// //x轴45度倾斜
// if(null != categoryaxis){ categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);}
}
chartToImgToBase64ToDataMap(chart, dataMap, imgName);
}
3.JFreeChart相关api
-
ChartFactory 类。提供了实用方法的集合,用于生成标准的图表。以下是几个主要方法:
- createPieChart()使用默认设置创建一个饼图。
- createPieChart3D()使用指定的数据集三维/3D饼图。
- createBarChart()创建一个条形图。
- createBarChart3D()创建一个柱形图具有3D效果。
- createLineChart()创建折线图。
- createLineChart3D()创建一个折线图与3D效果。
- createXYLineChart()使用默认设置创建基于XYDataset的折线图。
-
ChartUtilities 类。提供JFreeCharts包括将图表转换成图像文件格式,如PNG,JPEG和创建HTML图像映射方法的实用方法的集合。
- saveChartAsPNG()转换和保存图表为PNG格式指定的文件
- saveChartAsJPEG()转换并保存一个图表,以JPEG格式指定的文件。
-
StandardChartTheme类。JfreeChart主题样式有StandardChartTheme进行统一管理,包括字体,绘制颜色,线条类型,坐标轴样式等。
- new StandardChartTheme(“CN”)创建主题样式 解决乱码问题
- setRegularFont()设置字体样式
- setTitlePaint()设置标题字体颜色
- setLegendItemPaint()设置字体颜色
- setPlotBackgroundPaint()设置绘制区域背景色
-
BarRenderer类。柱状图渲染
- setBaseItemLabelFont()设置条目标签字体
- setBaseItemLabelGenerator()设置条目标签
- setBaseItemLabelsVisible()设置条目标签是否显示
- setMaximumBarWidth()设置柱子最大宽度
- setItemMargin()设置每个bar间距(0-1)
- setShadowVisible()不显示柱子阴影
- setBarPainter(new StandardBarPainter())设置柱状图基本渲染,不采用渐变
- setSeriesPaint()设置柱子颜色
-
Legend类。图例类
- setFrame()设置图例背景色
- setPosition()设置图例位置(上下左右)
- setItemFont()设置图例字体
- setItemPaint()设置图例字体颜色
- chart.removeLegend()不显示图例
-
x轴标题45度倾斜
CategoryAxis categoryaxis = plot.getDomainAxis();
if(null != categoryaxis){
categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
}
[外链图片转存失败(img-JBhpcrZF-1562565936323)(3.png)]
- x轴标题竖直显示
CategoryAxis axis = plot.getDomainAxis(); //x轴
axis.setMaximumCategoryLabelLines(10); //标题行数,每个字显示一行
axis.setMaximumCategoryLabelWidthRatio(1f); //每个标题宽度,控制为1个字的宽度
[外链图片转存失败(img-WtSUuic4-1562565936323)(2.png)]
参考资料:https://blog.csdn.net/fireofjava/article/details/44629025
https://www.yiibai.com/jfreechart/jfreechart_referenced_apis.html