Не совсем понятно, где код, который вы показываете, делает что-то не так.Действительно трудно проследить разбиение на несколько методов.
Но вот полный пример, который, возможно, показывает самый простой способ сделать то, что вы хотите.
Код:
import java.io.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.xddf.usermodel.*;
import org.apache.poi.xddf.usermodel.chart.*;
public class CreateExcelTwoLineCharts {
public static void main(String[] args) throws IOException {
try (XSSFWorkbook wb = new XSSFWorkbook()) {
// create the data
XSSFSheet sheet = wb.createSheet("Sheet1");
Row row;
Cell cell;
row = sheet.createRow(0);
row.createCell(0).setCellValue("Months");
row.createCell(1).setCellValue("Mountain View");
row.createCell(2).setCellValue("New York");
row.createCell(3).setCellValue("Washington");
row.createCell(4).setCellValue("England");
row.createCell(5).setCellValue("New Zeland");
row.createCell(6).setCellValue("Australia");
for (int r = 1; r < 13; r++) {
row = sheet.createRow(r);
for (int c = 0; c < 7; c++) {
cell = row.createCell(c);
if (c == 0) cell.setCellValue(r);
else cell.setCellFormula("RANDBETWEEN(50, 99)");
}
}
// create data sources
XDDFDataSource<Double> months = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 12, 0, 0));
int c = 1;
XDDFNumericalDataSource<Double> mView = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 12, c, c++));
XDDFNumericalDataSource<Double> nYork = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 12, c, c++));
XDDFNumericalDataSource<Double> washingt = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 12, c, c++));
XDDFNumericalDataSource<Double> engl = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 12, c, c++));
XDDFNumericalDataSource<Double> nZeal = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 12, c, c++));
XDDFNumericalDataSource<Double> austral = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 12, c, c++));
// create sheets drawing
XSSFDrawing drawing = sheet.createDrawingPatriarch();
// needed objeccts for the charts
XSSFClientAnchor anchor;
XSSFChart chart;
XDDFChartLegend legend;
XDDFCategoryAxis bottomAxis;
XDDFValueAxis leftAxis;
XDDFChartData data;
XDDFChartData.Series series;
//======first line chart============================================================
// create anchor
anchor = drawing.createAnchor(0, 0, 0, 0, 8, 0, 14, 12); // anchor col8,row0 to col14,row12
// create chart
chart = drawing.createChart(anchor);
legend = chart.getOrAddLegend();
legend.setPosition(LegendPosition.BOTTOM);
// create the axes
bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
leftAxis = chart.createValueAxis(AxisPosition.LEFT);
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
// create chart data
data = chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);
// create series
series = data.addSeries(months, mView);
series.setTitle("Mountain View", new CellReference(sheet.getSheetName(), 0, 1, true, true));
series = data.addSeries(months, nYork);
series.setTitle("New York", new CellReference(sheet.getSheetName(), 0, 2, true, true));
series = data.addSeries(months, washingt);
series.setTitle("Washington", new CellReference(sheet.getSheetName(), 0, 3, true, true));
chart.plot(data);
solidLineSeries(data, 0, PresetColor.BLUE);
solidLineSeries(data, 1, PresetColor.RED);
solidLineSeries(data, 2, PresetColor.GREEN);
//======second line chart============================================================
// create anchor
anchor = drawing.createAnchor(0, 0, 0, 0, 8, 13, 14, 25); // anchor col8,row13 to col14,row25
// create chart
chart = drawing.createChart(anchor);
legend = chart.getOrAddLegend();
legend.setPosition(LegendPosition.BOTTOM);
// create the axes
bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
leftAxis = chart.createValueAxis(AxisPosition.LEFT);
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
// create chart data
data = chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);
// create series
series = data.addSeries(months, engl);
series.setTitle("England", new CellReference(sheet.getSheetName(), 0, 4, true, true));
series = data.addSeries(months, nZeal);
series.setTitle("New Zeland", new CellReference(sheet.getSheetName(), 0, 5, true, true));
series = data.addSeries(months, austral);
series.setTitle("Australia", new CellReference(sheet.getSheetName(), 0, 6, true, true));
chart.plot(data);
solidLineSeries(data, 0, PresetColor.BLUE);
solidLineSeries(data, 1, PresetColor.RED);
solidLineSeries(data, 2, PresetColor.GREEN);
// write the output to a file
try (FileOutputStream fileOut = new FileOutputStream("CreateExcelTwoLineCharts.xlsx")) {
wb.write(fileOut);
}
}
}
private static void solidLineSeries(XDDFChartData data, int index, PresetColor color) {
XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(color));
XDDFLineProperties line = new XDDFLineProperties();
line.setFillProperties(fill);
XDDFChartData.Series series = data.getSeries().get(index);
XDDFShapeProperties properties = series.getShapeProperties();
if (properties == null) {
properties = new XDDFShapeProperties();
}
properties.setLineProperties(line);
series.setShapeProperties(properties);
}
}
Результат:
![enter image description here](https://i.stack.imgur.com/LGGtL.png)