Apache POI 折线图(Line Chart)Java 实现

Last Modified: 2023/11/11

概述

本文介绍如何使用 Apache POI 在 word 文档中生成柱状图(Line Chart),文档格式要求为 docx,对应于 Apache POI 中的 XWPFDocument。

Line Chart 成品图展示

由于 Apache POI 生成折线图的套路和柱状图的套路几乎相同,因此本篇文章就不分片段讲解,本文会直接贴出代码,并给出注释,如果觉得不好理解可以先看Apache POI 柱状图(Bar Chart)Java 实现

Java 使用 POI XWPF API 生成折线图

完整代码可移步 Github

package net.verytools.prac;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xddf.usermodel.chart.*;
import org.apache.poi.xwpf.usermodel.XWPFChart;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

import java.io.FileOutputStream;
import java.io.IOException;

public class LineChartRenderer {

  public void render(XWPFDocument doc) throws IOException, InvalidFormatException {
    // 创建图
    XWPFChart chart = doc.createChart(14 * Units.EMU_PER_CENTIMETER, 10 * Units.EMU_PER_CENTIMETER);
    // 标题
    chart.setTitleText("专业课选修人数");
    chart.setTitleOverlay(false);
    // 图例位置
    XDDFChartLegend legend = chart.getOrAddLegend();
    legend.setPosition(LegendPosition.TOP);
    // X轴标题位置
    XDDFCategoryAxis xAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
    xAxis.setTitle("专业名称");
    // y轴标题位置
    XDDFValueAxis yAxis = chart.createValueAxis(AxisPosition.LEFT);
    yAxis.setTitle("数量");
    
    // 创建分类数据源和值数据源
    XDDFCategoryDataSource categoryDS = XDDFDataSourcesFactory.fromArray(new String[]{"英语", "数学", "计算机", "财经"});
    XDDFNumericalDataSource<Integer> valueDs = XDDFDataSourcesFactory.fromArray(new Integer[]{100, 200, 800, 50});
    XDDFLineChartData data = (XDDFLineChartData) chart.createData(ChartTypes.LINE, xAxis, yAxis);
    // 将数据源绑定到图表中,可以创建多个 serie,这样便可以有条折线
    XDDFLineChartData.Series series1 = (XDDFLineChartData.Series) data.addSeries(categoryDS, valueDs);
    
    // 折线图例标题
    series1.setTitle("选修人数", null);
    // 直线
    series1.setSmooth(false);
    // 设置标记大小
    series1.setMarkerSize((short) 6);
    // 设置标记样式,星星
    series1.setMarkerStyle(MarkerStyle.STAR);
    chart.plot(data);
    // Write the output to a file
    try (FileOutputStream fo = new FileOutputStream("D:\\line.docx")) {
        doc.write(fo);
    }
  }
  
  public static void main(String[] args) throws IOException, InvalidFormatException {
    new LineChartRenderer().render(new XWPFDocument());
  }

}

对照上面的图,相信看懂这个代码还是没什么压力的,最后要说明的是本文使用的 Apache POI 5.2.3 版本,不同版本所需要的依赖是不同,需要特别注意。要使用 POI 作图最重要的表示理解图例、系列、分类和数据源这些概念,这些已经在 Apache POI 柱状图(Bar Chart)Java 实现 专门讲解,因此不再赘述。

Maven 依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-full</artifactId>
    <version>5.2.3</version>
</dependency>

总结

这个小系列依次讲解了如何在 Word 文章中动态生成图表:饼图、柱状图和折线图。不论是那种图绘制方式都差不太多,可谓套路满满。使用 apache poi 绘制的图表在 LibreOffice 中显示可能不正常,需要专门的处理,这点在柱状图中有过一个例子。

有问题吗?点此反馈!

温馨提示:反馈需要登录