У меня есть одна книга, в которой есть некоторые данные. Я беру эту книгу и создаю другую книгу с линейной диаграммой, основанной на данных в другой книге. Код работает нормально, но всякий раз, когда я открываю файл графика, я получаю предупреждение We can't update some of the links in your workbook right now
. Если я нажму кнопку Edit Links...
в меню предупреждения, это покажет, что книга данных не найдена. Если я нажму на Change Source...
и выберите нужную книгу, она будет работать нормально. Почему это? Может ли POI не сохранять связь между двумя файлами?
Мой код:
Чтобы создать книгу данных:
public static XSSFWorkbook createDataSpreadsheet(String name, long[] data) {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet(name);
int rowNumber = 0;
for(int i = 1; i < data.length + 1; i++) {
Row row = sheet.createRow(rowNumber++);
int columnNumber = 0;
row.createCell(columnNumber++).setCellValue(i);
row.createCell(columnNumber++).setCellValue(data[i - 1]);
}
return workbook;
}
Чтобы создать книгу графа:
public static XSSFWorkbook createLineChart(String name, XSSFWorkbook data) {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet(name);
XSSFDrawing drawing = sheet.createDrawingPatriarch();
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 0, 15, 15);
XSSFChart lineChart = drawing.createChart(anchor);
XSSFChartLegend legend = lineChart.getOrCreateLegend();
legend.setPosition(LegendPosition.BOTTOM);
LineChartData chartData = lineChart.getChartDataFactory().createLineChartData();
ChartAxis bottomAxis = lineChart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM);
ValueAxis leftAxis = lineChart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT);
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
XSSFSheet dataSheet = data.getSheetAt(0);
ChartDataSource<Number> xData = DataSources.fromNumericCellRange(dataSheet, new CellRangeAddress(0, dataSheet.getLastRowNum(), 0, 0));
ChartDataSource<Number> yData = DataSources.fromNumericCellRange(dataSheet, new CellRangeAddress(0, dataSheet.getLastRowNum(), 1, 1));
LineChartSeries chartSeries = chartData.addSeries(xData, yData);
chartSeries.setTitle("A title");
lineChart.plot(chartData, new ChartAxis[] { bottomAxis, leftAxis });
return workbook;
}