Java 使用 Apache POI 和 JFreeChart 从 Excel 生成折线图
要实现这个需求,可以使用 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”的折线图文件。
原文地址: http://www.cveoy.top/t/topic/f4mN 著作权归作者所有。请勿转载和采集!