word中java导出图表若干问题

利用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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值