Java 使用 Apache POI 生成 Excel 折线图
以下是使用 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 格式保存在同一目录下。
原文地址: http://www.cveoy.top/t/topic/f4mR 著作权归作者所有。请勿转载和采集!