JFreeChart库实现Excel数据折线图:使用时间格式水平轴和双垂直轴
以下是使用JFreeChart库实现的完整代码示例,该代码将读取名为'input.xlsx'的Excel文件中的数据,并根据以下要求生成一个折线图:
- 将工作表'P1'中A2-A50单元格的数据作为水平轴,并将其格式化为时间格式。
- 将工作表'P1'中B2-B50单元格的数据作为主垂直轴,数据格式为数值型。
- 将工作表'P1'中C2-C50单元格的数据作为次要垂直轴,数据格式为数值型。
- 将生成的图表保存为名为'output.jpg'的图片文件。
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 ExcelChartExample {
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库添加到项目的依赖中。此代码将生成一个名为“output.jpg”的折线图文件,显示了水平轴为时间格式的数据和垂直轴、次要垂直轴为数据格式的数据。
原文地址: https://www.cveoy.top/t/topic/fSYM 著作权归作者所有。请勿转载和采集!