import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.usermodel.charts.*;
import org.apache.poi.xddf.usermodel.chart.*;
public class ChartUtils {
public static void createLine(XSSFSheet sheet, ChartPosition chartPosition, LineChart lineChart) {
// 1. 获取数据
List<Object> xAxisList = lineChart.getXAxisList();
List<String> chartTitleList = lineChart.getTitleList();
List<List<Double>> chartDataList = lineChart.getDataList();
String chartTitle = lineChart.getChartTitle();
// 2. 创建绘图对象和图表锚点
XSSFDrawing drawing = sheet.createDrawingPatriarch();
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0,
chartPosition.getCol1(), chartPosition.getRow1(),
chartPosition.getCol2(), chartPosition.getRow2());
// 3. 创建图表并设置标题
XSSFChart chart = drawing.createChart(anchor);
chart.setTitleText(chartTitle);
chart.setTitleOverlay(false);
// 4. 设置图例位置
XDDFChartLegend legend = chart.getOrAddLegend();
legend.setPosition(LegendPosition.TOP);
// 5. 创建坐标轴
XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
// 6. 准备数据源
// 6.1 X轴数据(类别)
XDDFCategoryDataSource countries = XDDFDataSourcesFactory.fromArray(
Arrays.copyOf(xAxisList.toArray(), xAxisList.size(), String[].class));
// 6.2 创建折线图数据对象
XDDFLineChartData data = (XDDFLineChartData) chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);
// 7. 为每个数据系列创建折线
for (int i = 0; i < chartDataList.size(); i++) {
List<Double> values = chartDataList.get(i);
// 创建Y轴数据源
XDDFNumericalDataSource<Double> dataSource = XDDFDataSourcesFactory.fromArray(
values.toArray(new Double[0]));
// 将数据系列添加到图表
XDDFLineChartData.Series series = (XDDFLineChartData.Series) data.addSeries(countries, dataSource);
series.setTitle(chartTitleList.get(i), null);
series.setSmooth(false); // 设置为折线,非平滑曲线
series.setMarkerSize((short) 2); // 设置数据点标记的大小
// (可选)特殊样式处理,例如为"警戒值"设置虚线
if ("警戒值".equals(chartTitleList.get(i))) {
XDDFLineProperties lineProps = new XDDFLineProperties();
lineProps.setPresetDash(new XDDFPresetLineDash(PresetLineDash.DOT));
series.setLineProperties(lineProps);
}
}
// 8. 绘制图表
chart.plot(data);
}
}
|