Я пытаюсь создать гистограмму в текстовом документе, используя Apache POI. Я не могу открыть документ Word, хотя файл был успешно завершен

Мне удалось создать текстовый документ, используя приведенный ниже код, но я не могу открыть созданный текстовый документ. Я новичок в 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!");
}

}

Не удается открыть Как? Результат отлично открывается для меня в LibreOffice

g00se 12.05.2023 15:09

Привет @ g00se, я пытаюсь открыть файл в MS Word. Я получил следующую ошибку Word столкнулся с ошибкой при попытке открыть файл. * Проверьте права доступа к файлу для документа или файла. *Убедитесь, что имеется достаточно места в памяти и на диске. * Откройте файл с помощью редактора восстановления текста. Спасибо за ваш комментарий.

Bharath Naidu Yenumula 12.05.2023 15:18

И спасибо за ваш комментарий g00se, я смог открыть файл в свободном офисе, но я не могу увидеть графики для предоставленных данных, любая помощь или идеи для моего кода будут оценены. Еще раз спасибо.

Bharath Naidu Yenumula 12.05.2023 15:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная проблема заключается в том, что название серии графиков не является обязательным. Каждой серии нужен заголовок, чтобы подготовить легенды.

Итак, если вы раскомментируете:

...
//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);
 }
}

Привет, Аксель Рихтер. Большое спасибо за предложения, помимо решения вопроса. Это сработало!!!

Bharath Naidu Yenumula 12.05.2023 16:37

Другие вопросы по теме