Apache POI: клонирование рабочих листов, содержащих диаграммы - PullRequest
3 голосов
/ 13 марта 2012

Согласно многочисленным источникам, например Раздел ограничений на официальной странице , вероятно, единственный хороший способ работы с диаграммами Excel из POI - это использовать файл Excel с существующим графиком в качестве шаблона и изменять исходные ячейки, используемые диаграмма. И это прекрасно работает.

Проблема в том, что нам нужно иметь не только одну, но и несколько (и мы не знаем, сколько во время компиляции) рабочих таблиц с одной и той же диаграммой, но с разными (динамически генерируемыми) данными. Использование cloneSheet (sheetNumber) - это способ дублирования рабочего листа шаблона. Но если работает нормально, пока диаграммы не будут клонированы на листе.

Когда я пытаюсь клонировать лист с диаграммой, я получаю:

Exception in thread "main" java.lang.RuntimeException: The class org.apache.poi.hssf.record.chart.ChartFRTInfoRecord needs to define a clone method
    at org.apache.poi.hssf.record.Record.clone(Record.java:71)
    at org.apache.poi.hssf.model.InternalSheet.cloneSheet(InternalSheet.java:388)
    at org.apache.poi.hssf.usermodel.HSSFSheet.cloneSheet(HSSFSheet.java:125)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.cloneSheet(HSSFWorkbook.java:652)

UPDATE:

Я переключился на XSSF, и теперь, по крайней мере, нет исключений времени выполнения. Данные листа клонируются, но не являются диаграммами (их нет в клонированном листе).

Удалось ли кому-нибудь клонировать рабочий лист с диаграммами? Или, может быть, у кого-то есть другая идея, как решить имеющуюся у нас проблему, то есть создать диаграммы Excel для динамического числа рабочих листов с POI?

1 Ответ

6 голосов
/ 16 марта 2012

У меня получился довольно сложный обходной путь:

  1. Я генерирую большое количество листов (например, 1000) с помощью шаблонной диаграммы с помощью макроса Excel
  2. Я ввожу данные на столько листовкак мне нужно с Apache POI (и манипулировать с именованными диапазонами, которые используются диаграммами)
  3. Я переименовываю столько листов, сколько мне нужно, с Apache POI на имена, которые мне нужны (и, следовательно, я ограничен HSSF,потому что XSSF не обновляет ссылки именованных диапазонов в Excel после переименования листа :-()
  4. Я удаляю остальные листы с помощью Apache POI

Это было серьезное усилие для реализации этогоконцептуально простой и распространенный вариант использования (т.е. экспорт в Excel с диаграммами), но, по крайней мере, это возможно, и он работает довольно хорошо.

...