以下是使用 Java 代码实现从 Excel 文件读取数据并生成折线图的示例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

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

public class ExcelLineChart {
    public static void main(String[] args) {
        String inputFile = '巴新EDEVU水库数据处理表.xlsx';
        String outputFile = '温度折线图.xlsx';

        try (Workbook workbook = WorkbookFactory.create(ExcelLineChart.class.getClassLoader().getResourceAsStream(inputFile))) {
            Sheet sheetP9 = workbook.getSheet('P9');
            Sheet sheetP10 = workbook.getSheet('P10');

            // 获取数据区域的单元格范围
            CellRangeAddress rangeP9 = CellRangeAddress.valueOf('A12:A86,C12:C86');
            CellRangeAddress rangeP10 = CellRangeAddress.valueOf('A12:A139,C12:C139');

            // 创建折线图工作表
            Sheet chartSheet = workbook.createSheet('温度');

            // 复制P9数据到折线图工作表
            copyDataToSheet(sheetP9, rangeP9, chartSheet, 0);

            // 复制P10数据到折线图工作表
            copyDataToSheet(sheetP10, rangeP10, chartSheet, 2);

            // 创建折线图
            Drawing<?> drawing = chartSheet.createDrawingPatriarch();
            ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 4, 0, 15, 15);
            Chart chart = drawing.createChart(anchor);
            ChartLegend legend = chart.getOrCreateLegend();
            legend.setPosition(LegendPosition.BOTTOM);
            LineChartData data = chart.getChartDataFactory().createLineChartData();

            // 添加数据系列
            addDataSeries(data, chartSheet, 0, 1, rangeP9.getLastRow() - rangeP9.getFirstRow() + 1, 'P9');
            addDataSeries(data, chartSheet, 2, 3, rangeP10.getLastRow() - rangeP10.getFirstRow() + 1, 'P10');

            // 设置图表标题和数据
            chart.setTitleText('温度折线图');
            chart.setTitleOverlay(false);
            chart.plot(data);

            // 保存折线图工作表
            try (FileOutputStream outputStream = new FileOutputStream(outputFile)) {
                workbook.write(outputStream);
                System.out.println('折线图保存成功!');
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void copyDataToSheet(Sheet sourceSheet, CellRangeAddress sourceRange, Sheet targetSheet, int targetColumnOffset) {
        for (int i = sourceRange.getFirstRow(); i <= sourceRange.getLastRow(); i++) {
            Row sourceRow = sourceSheet.getRow(i);
            Row targetRow = targetSheet.getRow(i - sourceRange.getFirstRow());
            if (targetRow == null) {
                targetRow = targetSheet.createRow(i - sourceRange.getFirstRow());
            }
            for (int j = sourceRange.getFirstColumn(); j <= sourceRange.getLastColumn(); j++) {
                Cell sourceCell = sourceRow.getCell(j);
                Cell targetCell = targetRow.createCell(j - sourceRange.getFirstColumn() + targetColumnOffset, sourceCell.getCellType());
                switch (sourceCell.getCellType()) {
                    case STRING:
                        targetCell.setCellValue(sourceCell.getStringCellValue());
                        break;
                    case NUMERIC:
                        targetCell.setCellValue(sourceCell.getNumericCellValue());
                        break;
                    case BOOLEAN:
                        targetCell.setCellValue(sourceCell.getBooleanCellValue());
                        break;
                    case FORMULA:
                        targetCell.setCellFormula(sourceCell.getCellFormula());
                        break;
                    default:
                        break;
                }
            }
        }
    }

    private static void addDataSeries(LineChartData data, Sheet sheet, int xColumnIndex, int yColumnIndex, int rowCount, String seriesName) {
        DataProvider dataProvider = DataSources.fromNumericCellRange(sheet,
                new CellRangeAddress(0, rowCount - 1, xColumnIndex, yColumnIndex));
        LineChartSeries series = data.addSeries(dataProvider, DataLabels.None());
        series.setTitle(seriesName);
    }
}

请确保你已经将 Apache POI 库添加到项目的依赖中。运行上述代码后,将会生成一个名为“温度折线图.xlsx”的文件,其中包含了折线图,并且折线图也会以 png 格式保存在同一目录下。

Java 使用 Apache POI 生成 Excel 折线图

原文地址: http://www.cveoy.top/t/topic/f4mR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录