java利用POI在word中绘制折线图

1.poi的简介

Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式档案读和写的功能。

官方主页: http://poi.apache.org/index.html
API文档: http://poi.apache.org/apidocs/index.html

2.导包

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

此处导包推荐4.1.2及以上,由于项目中还使用了easyword,easyexcel,spire.doc等在poi上扩展的包,他们中都含有poi的包。因此我把这个包放在了最前面可以防止报错与冲突。可以看到下图除4.1.2版本外,还有其他各种版本,如果将此版本放在后面,会出错无法成功显示(但不会报错,这种错误极其难排查)。
在这里插入图片描述

3.核心代码与操作

3.1绘制折线图的核心方法

此方法不需要改,只需要输入参数即可。第一个参数是图表,第二个参数是线的名称,第三个是x轴,第四个是y轴,最后一个是图表的名称

//折线图的生成
    public static void drawLineChart(XWPFChart chart, String[] series, String[] categories,
                                     List<Number[]> values, String chartTitle){
        final List<XDDFChartData> data = chart.getChartSeries();

        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);
    }

3.2 模板的设置

需要在word中打开设置模板。插入选择图表。选择图表。
在这里插入图片描述
图表中选择折线图
在这里插入图片描述
本处测试2条折线图
在这里插入图片描述

public class main {
    @Test
    public void printChart(){
        String templatePath = "src/main/resources/static/test.docx";
        XWPFDocument doc=null;
        try{
            InputStream is = new FileInputStream(new File(templatePath));
            doc = new XWPFDocument(is);
        }
        catch (Exception e){
            System.out.println(e);
        }
        String[] series1 = {"测试折线1","测试折线2","测试折线3"};//每条线的名称
        String[] series2 = {"测试折线"};//

        String title1="测试折线图1";
        String title2="测试折线图2";

        //y轴
        List<Number[]> value1 = new ArrayList<>();//每一条折现图,第一个表3条,需要和图中条数一样
        List<Number[]> value2 = new ArrayList<>();//每一条折现图,第二个表1条
        //第一张图的y轴
        Number[] n1={1,2,3,5};
        Number[] n2={4,2,1,4};
        Number[] n3={5.8,6.2,1,0.2};
        value1.add(n1);
        value1.add(n2);
        value1.add(n3);
        //第二张图的y轴
        Number[] n={0.3,-5.4,2.0,-1.2};
        value2.add(n);
        //x轴
        String[] x1={"1","2","3","4"};
        String[] x2={"a","b","c","d"};

        XWPFChart xChart1 = doc.getCharts().get(0);//获取第1个图表
        XWPFChart xChart2 = doc.getCharts().get(1);//获取第2个图表

        drawLineChart(xChart1,series1,x1,value1,title1);
        drawLineChart(xChart2,series2,x2,value2,title2);


        try (FileOutputStream fos = new FileOutputStream(templatePath)) {
            doc.write(fos);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

}

3.效果图

在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 要使用POI获取Word文档表格的数据,可以按照以下步骤进行: 1. 首先,使用POI库打开Word文档。例如,使用XWPFDocument类打开.docx文件。 ```java FileInputStream fis = new FileInputStream("example.docx"); XWPFDocument doc = new XWPFDocument(fis); ``` 2. 然后,使用getTables()方法获取文档的所有表格,该方法返回一个XWPFTable的List。 ```java List<XWPFTable> tables = doc.getTables(); ``` 3. 对于每个表格,使用getRows()方法获取表格的所有行,该方法返回一个XWPFTableRow的List。 ```java for(XWPFTable table : tables) { List<XWPFTableRow> rows = table.getRows(); for(XWPFTableRow row : rows) { // 处理行数据 } } ``` 4. 对于每一行,使用getTableCells()方法获取该行的所有单元格,该方法返回一个XWPFTableCell的List。 ```java for(XWPFTable table : tables) { List<XWPFTableRow> rows = table.getRows(); for(XWPFTableRow row : rows) { List<XWPFTableCell> cells = row.getTableCells(); for(XWPFTableCell cell : cells) { // 处理单元格数据 } } } ``` 5. 对于每个单元格,使用getText()方法获取单元格的文本内容。 ```java for(XWPFTable table : tables) { List<XWPFTableRow> rows = table.getRows(); for(XWPFTableRow row : rows) { List<XWPFTableCell> cells = row.getTableCells(); for(XWPFTableCell cell : cells) { String text = cell.getText(); // 处理单元格的文本内容 } } } ``` 这样就可以获取Word文档所有表格的所有行和单元格的数据了。 ### 回答2: 使用Java利用POI获取Word文档表格的数据,可以通过以下步骤实现: 1. 导入POI库:首先需要在Java项目导入POI库,并将库文件添加到项目的classpath。 2. 加载Word文档使用POI的XWPFDocument类加载Word文档,代码如下: ```java InputStream in = new FileInputStream("path/to/word/document.docx"); XWPFDocument doc = new XWPFDocument(in); ``` 3. 获取所有表格:通过getTables()方法获取Word文档的所有表格,代码如下: ```java List<XWPFTable> tables = doc.getTables(); ``` 4. 遍历表格:可以使用循环遍历所有表格,根据需要进行操作,例如获取表格的数据等。 ```java for (XWPFTable table : tables) { // 获取表格的行 List<XWPFTableRow> rows = table.getRows(); // 遍历行 for (XWPFTableRow row : rows) { // 获取行的单元格 List<XWPFTableCell> cells = row.getTableCells(); // 遍历单元格 for (XWPFTableCell cell : cells) { // 获取单元格的内容 String content = cell.getText(); // 处理单元格数据,例如打印或保存到其他地方 System.out.println(content); } } } ``` 通过以上步骤,可以使用Java利用POI获取Word文档表格的数据。根据实际需求,可以对获取到的数据进行处理,例如保存到数据库或生成其他格式的文档。 ### 回答3: Java利用POI可以很方便地获取Word文档表格的数据。下面是实现的步骤: 1. 导入POI库:首先需要在Java工程导入POI的相关库文件,可以使用Maven或手动下载并导入。 2. 创建Word文档对象:使用XWPFDocument类创建一个Word文档对象,打开需要解析的Word文档。 3. 获取文档的表格:使用getTables()方法获取文档所有的表格,返回一个List对象。 4. 遍历表格:使用for循环遍历表格列表,可以通过getTable()方法获取每个表格。 5. 获取表格的行并遍历:使用getRows()方法获取表格所有的行,返回一个List对象。然后使用for循环遍历行列表,可以通过getRow()方法获取每一行。 6. 获取行的单元格并遍历:使用getTableCells()方法获取行所有的单元格,返回一个List对象。然后使用for循环遍历单元格列表,可以通过getTableCell()方法获取每个单元格。 7. 获取单元格的文本:使用getText()方法获取单元格的文本内容。 完整的示例代码如下: ```java import org.apache.poi.xwpf.usermodel.*; import java.io.FileInputStream; import java.io.IOException; import java.util.List; public class ReadTableData { public static void main(String[] args) { try { // 创建Word文档对象 XWPFDocument document = new XWPFDocument(new FileInputStream("example.docx")); // 获取文档的所有表格 List<XWPFTable> tables = document.getTables(); // 遍历表格 for (XWPFTable table : tables) { // 获取表格的所有行 List<XWPFTableRow> rows = table.getRows(); // 遍历行 for (XWPFTableRow row : rows) { // 获取行的所有单元格 List<XWPFTableCell> cells = row.getTableCells(); // 遍历单元格 for (XWPFTableCell cell : cells) { // 获取单元格的文本内容 String text = cell.getText(); System.out.println(text); } } } // 关闭文档 document.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 以上就是使用POI库获取Word文档表格数据的基本步骤和示例代码。通过POI的各种API可以更加灵活地处理表格的数据,比如可以合并、拆分单元格,修改样式等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

有趣的野鸭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值