要实现这个需求,可以使用 Apache POI 库来读取和写入 Excel 文件,以及使用 JFreeChart 库来生成折线图。

首先,需要添加以下依赖项到你的项目中:

<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>
<dependency>
    <groupId>org.jfree</groupId>
    <artifactId>jfreechart</artifactId>
    <version>1.5.3</version>
</dependency>

接下来,可以使用以下代码来实现需求:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.data.category.DefaultCategoryDataset;

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

public class ExcelChartExample {
    public static void main(String[] args) {
        String filePath = '巴新EDEVU水库数据处理表.xlsx';
        String sheetName1 = 'P9';
        String sheetName2 = 'P10';
        String outputChartPath = '折线图.png';
        String outputFilePath = '温度.xlsx';

        try (Workbook workbook = WorkbookFactory.create(new FileInputStream(filePath))) {
            Sheet sheet1 = workbook.getSheet(sheetName1);
            Sheet sheet2 = workbook.getSheet(sheetName2);

            // 获取P9工作表的A12至A86和C12至C86区域的数据
            DefaultCategoryDataset dataset1 = getDataFromSheet(sheet1, 'A12:A86', 'C12:C86');
            // 获取P10工作表的A12至A139和C12至C139区域的数据
            DefaultCategoryDataset dataset2 = getDataFromSheet(sheet2, 'A12:A139', 'C12:C139');

            // 创建折线图
            JFreeChart chart = ChartFactory.createLineChart('温度趋势图', '时间', '温度', dataset1);
            chart.getCategoryPlot().setDataset(1, dataset2);

            // 保存折线图
            ChartUtilities.saveChartAsPNG(new File(outputChartPath), chart, 800, 600);

            // 创建新的工作表
            Sheet temperatureSheet = workbook.createSheet('温度');

            // 将折线图插入到新工作表
            Drawing<?> drawing = temperatureSheet.createDrawingPatriarch();
            ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 1, 10, 20);
            Picture picture = drawing.createPicture(anchor, workbook.addPicture(
                    FileUtils.readFileToByteArray(new File(outputChartPath)), Workbook.PICTURE_TYPE_PNG));
            picture.resize();

            // 保存Excel文件
            try (FileOutputStream outputStream = new FileOutputStream(outputFilePath)) {
                workbook.write(outputStream);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static DefaultCategoryDataset getDataFromSheet(Sheet sheet, String column1, String column2) {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        FormulaEvaluator evaluator = sheet.getWorkbook().getCreationHelper().createFormulaEvaluator();

        for (Row row : sheet) {
            Cell cell1 = row.getCell(CellReference.convertColStringToIndex(column1));
            Cell cell2 = row.getCell(CellReference.convertColStringToIndex(column2));

            if (cell1 != null && cell1.getCellType() == CellType.NUMERIC
                    && cell2 != null && cell2.getCellType() == CellType.NUMERIC) {
                double value1 = cell1.getNumericCellValue();
                double value2 = cell2.getNumericCellValue();
                String category = String.valueOf(row.getRowNum() + 1);
                dataset.addValue(value1, 'P9', category);
                dataset.addValue(value2, 'P10', category);
            }
        }

        return dataset;
    }
}

请确保将文件路径和工作表名称更改为实际的文件和工作表名称。运行此代码后,将生成一个名为“温度.xlsx”的新Excel文件,其中包含一个名为“温度”的工作表,以及一个名为“折线图.png”的折线图文件。

Java 使用 Apache POI 和 JFreeChart 从 Excel 生成折线图

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

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