该代码示例展示了如何使用 Java 代码结合 JFreeChart 和 Apache POI 库来从 Excel 文件中读取数据并生成折线图。

代码首先使用 Apache POI 库读取 Excel 文件,并获取指定工作表中的数据。然后,使用 JFreeChart 库创建时间序列数据集,用来存储水平轴数据。接着,使用垂直轴数据集和次要垂直轴数据集存储垂直轴和次要垂直轴的数据。

接下来,代码创建水平轴、垂直轴和次要垂直轴,并将其添加到折线图的绘图区域中。最后,将折线图保存为 JPEG 图片。

代码示例:

import java.io.File;
import java.io.IOException;
import java.util.Date;

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.chart.axis.DateAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CombinedDomainXYPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.*;
import org.jfree.data.xy.DefaultXYDataset;

public class ExcelChartExample06 {
    public static void main(String[] args) {
        try {
            // 读取Excel文件
            Workbook workbook = WorkbookFactory.create(new File("input.xlsx"));
            Sheet sheet = workbook.getSheet("P1");

            // 创建时间序列数据集
            TimeSeriesCollection dataset = new TimeSeriesCollection();

            // 获取水平轴数据
            Row horizontalAxisRow = sheet.getRow(1);
            for (int i = 1; i <= 50; i++) {
                Cell cell = horizontalAxisRow.getCell(i);
                Date date = cell.getDateCellValue();
                TimeSeries series = new TimeSeries('Series ' + i);
                series.add(new Day(date), 0);
                dataset.addSeries(series);
            }

            // 创建垂直轴数据集
            DefaultXYDataset verticalAxisDataset = new DefaultXYDataset();
            DefaultXYDataset secondaryVerticalAxisDataset = new DefaultXYDataset();

            // 获取垂直轴和次要垂直轴数据
            for (int i = 1; i <= 50; i++) {
                Row row = sheet.getRow(i + 1);
                Cell verticalAxisCell = row.getCell(1);
                Cell secondaryVerticalAxisCell = row.getCell(2);

                double[][] verticalAxisData = {{i, verticalAxisCell.getNumericCellValue()}};
                double[][] secondaryVerticalAxisData = {{i, secondaryVerticalAxisCell.getNumericCellValue()}};

                verticalAxisDataset.addSeries('Series ' + i, verticalAxisData);
                secondaryVerticalAxisDataset.addSeries('Series ' + i, secondaryVerticalAxisData);
            }

            // 创建水平轴
            DateAxis horizontalAxis = new DateAxis("时间");

            // 创建垂直轴
            NumberAxis verticalAxis = new NumberAxis("垂直轴");
            verticalAxis.setAutoRangeIncludesZero(false);

            // 创建次要垂直轴
            NumberAxis secondaryVerticalAxis = new NumberAxis("次要垂直轴");
            secondaryVerticalAxis.setAutoRangeIncludesZero(false);

            // 创建折线图
            XYPlot plot = new XYPlot(verticalAxisDataset, horizontalAxis, verticalAxis, null);
            plot.setOrientation(PlotOrientation.VERTICAL);
            plot.setRangeAxis(1, secondaryVerticalAxis);

            // 添加次要垂直轴数据
            plot.setDataset(1, secondaryVerticalAxisDataset);
            plot.mapDatasetToRangeAxis(1, 1);

            // 创建组合图表
            CombinedDomainXYPlot combinedPlot = new CombinedDomainXYPlot(horizontalAxis);
            combinedPlot.add(plot);

            // 创建图表
            JFreeChart chart = new JFreeChart("折线图", JFreeChart.DEFAULT_TITLE_FONT, combinedPlot, true);

            // 保存图表为图片
            ChartUtilities.saveChartAsJPEG(new File("output.jpg"), chart, 800, 600);

            // 关闭工作簿
            workbook.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注意:

  • 该代码需要导入 JFreeChart 和 Apache POI 库。
  • Excel 文件 input.xlsx 应该位于代码所在的目录下。
  • 生成的图片文件 output.jpg 将保存在代码所在的目录下。

代码解释:

  1. 读取 Excel 文件并获取工作表数据。
  2. 创建时间序列数据集,存储水平轴数据。
  3. 创建垂直轴数据集和次要垂直轴数据集,存储垂直轴和次要垂直轴数据。
  4. 创建水平轴、垂直轴和次要垂直轴,并将其添加到折线图的绘图区域中。
  5. 创建组合图表,将折线图添加到图表中。
  6. 创建图表并保存为 JPEG 图片。

总结:

该代码示例展示了如何使用 Java 代码结合 JFreeChart 和 Apache POI 库来从 Excel 文件中读取数据并生成折线图。代码简洁易懂,易于修改和扩展。开发者可以根据自己的需求修改代码,以实现更复杂的图表功能。


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

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