Java指定名为巴新EDEVU水库数据处理表xlsx的文件里的P9工作表里的A12至A86和C12至C86区域里的数据和P10工作表里的A12至A139和C12至C139区域里的数据制作成一个折线图并新建一个名为温度的工作表将图保存温度工作表最后将折线图以png格式保存出来
以下是使用Java代码实现上述需求的示例:
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 格式保存在同一目录下。
原文地址: https://www.cveoy.top/t/topic/hDN4 著作权归作者所有。请勿转载和采集!