Мне удалось создать текстовый документ, используя приведенный ниже код, но я не могу открыть созданный текстовый документ. Я новичок в Apache poi, java и веб-разработке, и любая помощь будет оценена по достоинству.
import java.io.FileOutputStream;
import org.apache.poi.util.Units;
import org.apache.poi.xddf.usermodel.chart.*;
import org.apache.poi.xwpf.usermodel.*;
public class BarChart {
public static void main(String[] args) throws Exception {
XWPFDocument doc = new XWPFDocument();
// Create a paragraph
XWPFParagraph paragraph = doc.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText("Bar Chart Example:");
// Create a severitychart
XWPFChart categoryChart = doc.createChart(10 * Units.EMU_PER_CENTIMETER, 5 *
Units.EMU_PER_CENTIMETER);
// Create chart data source
String[] categories = new String[]{"Critical", "High", "Medium","Low","Best Practice"};
Double[] values = new Double[]{(double) 1,(double) 2,(double) 3,(double) 4,(double) 5};
XDDFDataSource<String> categoryDataSource =
XDDFDataSourcesFactory.fromArray(categories);
XDDFNumericalDataSource<Double> valueDataSource =
XDDFDataSourcesFactory.fromArray(values);
// Create the category axis
XDDFCategoryAxis categoryAxis = categoryChart.createCategoryAxis(AxisPosition.BOTTOM);
XDDFValueAxis valueAxis = categoryChart.createValueAxis(AxisPosition.TOP);
XDDFChartData data = categoryChart.createData(ChartTypes.BAR, categoryAxis, valueAxis);
//categoryChart.setTitleText("Evoke");
XDDFChartData.Series series = data.addSeries(categoryDataSource, valueDataSource);
//series.setTitle("Fruit Sales", null);
// Plot the chart
categoryChart.plot(data);
// Save the document
FileOutputStream out = new FileOutputStream("bar_chart_document.docx");
doc.write(out);
out.close();
doc.close();
System.out.println("chart created successfully!");
}
}
Привет @ g00se, я пытаюсь открыть файл в MS Word. Я получил следующую ошибку Word столкнулся с ошибкой при попытке открыть файл. * Проверьте права доступа к файлу для документа или файла. *Убедитесь, что имеется достаточно места в памяти и на диске. * Откройте файл с помощью редактора восстановления текста. Спасибо за ваш комментарий.
И спасибо за ваш комментарий g00se, я смог открыть файл в свободном офисе, но я не могу увидеть графики для предоставленных данных, любая помощь или идеи для моего кода будут оценены. Еще раз спасибо.




Основная проблема заключается в том, что название серии графиков не является обязательным. Каждой серии нужен заголовок, чтобы подготовить легенды.
Итак, если вы раскомментируете:
...
//series.setTitle("Fruit Sales", null);
...
будет установлен заголовок серии, и вы сможете открыть файл в Microsoft Word.
Но еще несколько советов:
Установите, как ось пересекается, например, в нулевой точке оси значений: valueAxis.setCrosses(AxisCrosses.AUTO_ZERO).
Установите AxisCrossBetween, чтобы ось значений пересекала ось категорий между категориями. В противном случае первая и последняя категории находятся точно в точках пересечения, а полосы видны только наполовину: valueAxis.setCrossBetween(AxisCrossBetween.BETWEEN).
Установите направление полосы на BarDirection.BAR или BarDirection.COL.
Установить цвет заливки серии — необходимо для LibreOffice, так как при этом не будут использоваться цвета по умолчанию.
Минимальный полный пример гистограммы в Word:
import java.io.FileOutputStream;
import org.apache.poi.util.Units;
import org.apache.poi.xddf.usermodel.*;
import org.apache.poi.xddf.usermodel.chart.*;
import org.apache.poi.xwpf.usermodel.*;
public class BarChartWordMinimal {
public static void main(String[] args) throws Exception {
XWPFDocument doc = new XWPFDocument();
// Create some normal XWPF content
XWPFParagraph paragraph = doc.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText("Bar Chart Example:");
// Create the chart
XWPFChart categoryChart = doc.createChart(10 * Units.EMU_PER_CENTIMETER, 5 * Units.EMU_PER_CENTIMETER);
// Create chart data sources
String[] categories = new String[]{"Critical", "High", "Medium","Low","Best Practice"};
Double[] values = new Double[]{(double) 1,(double) 2,(double) 3,(double) 4,(double) 5};
XDDFDataSource<String> categoryDataSource = XDDFDataSourcesFactory.fromArray(categories);
XDDFNumericalDataSource<Double> valueDataSource = XDDFDataSourcesFactory.fromArray(values);
// Create the category axis
XDDFCategoryAxis categoryAxis = categoryChart.createCategoryAxis(AxisPosition.BOTTOM);
// Create the value axis - axis position top is illogical for value axis but will not lead to error
//XDDFValueAxis valueAxis = categoryChart.createValueAxis(AxisPosition.TOP);
XDDFValueAxis valueAxis = categoryChart.createValueAxis(AxisPosition.LEFT);
// Set how the axis cross - for example at zero point of value axis
valueAxis.setCrosses(AxisCrosses.AUTO_ZERO);
// Set AxisCrossBetween, so the value axis crosses the category axis between the categories.
// Else first and last category is exactly on cross points and the bars are only half visible.
valueAxis.setCrossBetween(AxisCrossBetween.BETWEEN);
XDDFChartData data = categoryChart.createData(ChartTypes.BAR, categoryAxis, valueAxis);
// Set bar direction
//((XDDFBarChartData)data).setBarDirection(BarDirection.BAR);
((XDDFBarChartData)data).setBarDirection(BarDirection.COL);
// Set chart title - optinal
categoryChart.setTitleText("Evoke");
// Add series
XDDFChartData.Series series = data.addSeries(categoryDataSource, valueDataSource);
// Set series title - not optional
series.setTitle("Fruit Sales", null);
// Set series fill color - necessary for LibreOffice as this will not use default colors
solidFillSeries(series, PresetColor.BLUE);
// Plot the chart
categoryChart.plot(data);
// Save the document
FileOutputStream out = new FileOutputStream("bar_chart_document.docx");
doc.write(out);
out.close();
doc.close();
System.out.println("chart created successfully!");
}
private static void solidFillSeries(XDDFChartData.Series series, PresetColor color) {
XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(color));
XDDFShapeProperties properties = series.getShapeProperties();
if (properties == null) {
properties = new XDDFShapeProperties();
}
properties.setFillProperties(fill);
series.setShapeProperties(properties);
}
}
Привет, Аксель Рихтер. Большое спасибо за предложения, помимо решения вопроса. Это сработало!!!
Не удается открыть Как? Результат отлично открывается для меня в LibreOffice