Java实现Word画折线图(非图片)

引言

最近需要实现Java在Word中画折线图功能,不能简单的生成折线图再导入。实现方法就是利用Apache poi 工具。实现的效果如下,把鼠标放上去可以显示值。
在这里插入图片描述

比较简单,有一些坑,发出来记录一下。

模板

要实现上述效果需要一个Word模板,直接新建一个Word文件,插入Word内置的折线图图表即可。

在这里插入图片描述

插入完成就是这样子:

在这里插入图片描述
把这个模板保存为line-chart-template.docx

引入POI工具

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

完整代码

注意poi版本的问题,最好不低于4.1.0。4.0.1的版本有个坑,不能修改系列的标题。
这就是折线图的完整代码了:

public class GraphTest3 {
    public static void main(String[] args) throws Exception {
        String templatePath = "D:\\word\\line-chart-template.docx";

        InputStream is = new FileInputStream(new File(templatePath));
        XWPFDocument doc = new XWPFDocument(is);

        //模拟统计图数据
        //系列
        String[] seriesTitles = {"日处理能力(kg)", "湿垃圾(kg)", "干垃圾(kg)"};
        //x轴
        String[] categories = {"2020-02-20", "2020-02-21", "2020-02-22", "2020-02-23", "2020-02-24", "2020-02-25", "2020-02-26"};
        List<Number[]> values = new ArrayList<>();
         //日处理能力
        Number[] value1 = {1000, 1000, 1000, 1000, 1000, 1000, 1000};
        //湿垃圾
        Number[] value2 = {450.2, 622.1, 514, 384.7, 486.5, 688.9, 711.1};
        //干垃圾
        Number[] value3 = {200.2, 321.4, 266, 156.5, 232.2, 325.5, 319.5};

        values.add(value1);
        values.add(value2);
        values.add(value3);

        XWPFChart xChart = doc.getCharts().get(0);//获取第1个图表
        generateChart(xChart, seriesTitles, categories, values);

        try (FileOutputStream fos = new FileOutputStream("D:\\word\\test.docx")) {
            doc.write(fos);
        }

    }

    public static void generateChart(XWPFChart chart, String[] series, String[] categories, List<Number[]> values) {
        String chartTitle = "收运量统计图";
        final List<XDDFChartData> data = chart.getChartSeries();//不知道这个ChartSeries代表什么意思
        final XDDFLineChartData line = (XDDFLineChartData) data.get(0);//这里一般获取第一个,我们这里是折线图就是XDDFLineChartData

        final int numOfPoints = categories.length;

        final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));

        final XDDFDataSource<?> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, 0);
        for (int i = 0; i < values.size(); i++) {
            final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, i + 1, i + 1));
            Number[] value = values.get(i);
            final XDDFNumericalDataSource<? extends Number> valuesData = XDDFDataSourcesFactory.fromArray(value, valuesDataRange, i + 1);
            XDDFChartData.Series ser;//图表中的系列
            ser = line.getSeries().get(i);
            ser.replaceData(categoriesData, valuesData);
            CellReference cellReference = chart.setSheetTitle(series[i], 1);//修改系列标题
            ser.setTitle(series[i], cellReference);
        }

        chart.plot(line);
        chart.setTitleText(chartTitle);//折线图标题
        chart.setTitleOverlay(false);
    }
}

XWPFChart xChart = doc.getCharts().get(0);//获取第1个图表这段代码是获取图表的意思。

为了体现效果,我又加了个折线图,然后DEBUG可以看到charts里面是这样的。可以支持多图表的,虽然我这里只展示了一个图表。

在这里插入图片描述

效果

在这里插入图片描述

最终的效果如图,和在word中画折线图的效果一样,可以随意编辑模板折线图的样式。不需要代码处理,这里比如我把第一个系列“日处理能力”的线条样式改成虚线。

修改模板中的效果如下:
在这里插入图片描述

此时代码不需要任何修改,重新跑一遍。

在这里插入图片描述
效果如上,是不是很方便。有问题欢迎留言。

折线图是一种常见的数据可视化形式,可用于展示趋势分析和数据变化情况。若需要将折线图转为图片,则可采用以下两种方式: 一、使用截图工具截图保存 在打开的折线图文档中,通过屏幕截图软件截取需要保存的折线图区域。将截取的图像保存为常见图片格式,如PNG、JPEG等,即可将折线图转为图片。 二、使用Word VBA或Java程序读取图片并保存 1、Word VBA方式 a.打开Word软件,选择开发工具栏,点击Visual Basic按钮新建宏; b.在宏编辑窗口中输入代码,通过Selection对象调用折线图,再将选中区域保存为图片,示例代码如下: Sub SaveChartAsPicture() '选择折线图 ActiveDocument.InlineShapes(1).Select '保存选中区域为图片 Selection.CopyAsPicture Selection.Paste '另存为JPEG格式图片 Selection.InlineShapes(1).SaveAsPicture FileName:="C:\pic.jpg", _ Filter:=msoFilterJPEG End Sub c.通过单击“运行”按钮或按快捷键F5可执行保存操作。 2、Java方式 a.利用POI或JWord插件库读取Word文档,并使用XWPFChart类获取文档内的折线图; b.将折线图保存为ByteArrayOutputStream对象; c.将ByteArrayOutputStream对象转换为字节数组,再保存为图片文件。 示例代码如下: import java.io.FileOutputStream; import java.io.OutputStream; import org.apache.poi.xwpf.usermodel.XWPFChart; public class ChartToImage { public static void main(String[] args) throws Exception { String inputPath = "D:\\docx\\template.docx"; String outputPath = "D:\\images\\chart.png"; XWPFChart chart = ChartUtil.extractChart(inputPath, 1); byte[] chartBytes = ChartUtil.chartToBytes(chart, "png"); OutputStream os = new FileOutputStream(outputPath); os.write(chartBytes); os.flush(); os.close(); } } 无论采用哪种方式,折线图转为图片均需要考虑图片清晰度和格式的选择。PNG、JPEG等格式均比较常见,可根据实际需要选择适合的图片格式。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愤怒的可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值