2015-08-18 4 views
0

Моя проблема

мне нужно точно копия клетки XSSFWorkbook с и HSSFWorkbook с до нового XSSFWorkbook. Таким образом, мои клетки могут быть двух типов: XSSFCell и HSSFCell.скопировать XSSF/HSSF-клеток в новый XSSFWorkbook

По точно, я имею в виду, что мне также нужно скопировать CellStyle включая CellBorder и CellFill свойствами, а также DefaultRowHeight и DefaultColumnWidth самой книги. Также необходимо скопировать высоту и ширину для каждой строки и столбца. (Копирование CellStyle иногда приводит к странному поведению, как я уже спросил here).

Мой вопрос

Какой самый лучший способ сделать это? Я не хочу копировать каждую собственность вручную самостоятельно. Особенно, если я не знаю, являются ли мои входные ячейки типа XSSFCell или HSSFCell.

ответ

2

Мое решение

Я решил свою проблему с помощью разукрупнения требований. Теперь я сосредоточусь только на XSSFWorkbook с.

Точно копирование XSSFWorkbook действительно просто. Чтобы скопировать XSSFCellStyle в другую книгу просто используйте следующий код:

// Copy cell style from `sourceCell` to `targetCell` 
XSSFCellStyle sourceCellStyle = sourceCell.getCellStyle(); 
XSSFCellStyle clonedCellStyle = newWorkbook.createCellStyle(); 
clonedCellStyle.cloneStyleFrom(sourceCellStyle); 
targetCell.setCellStyle(clonedCellStyle); 

Очень важно, что целевая книга имеет тот же источник стиля как источник книга. В противном случае стиль клонированных ячеек будет выглядеть по-другому.

final StylesTable sourceStylesSource = sourceWorkbook.getStylesSource(); 
final StylesTable tagetStylesSource = targetWorkbook.getStylesSource(); 

sourceStylesSource.getFonts().forEach(font -> targetStylesSource.putFont(font, true)); 
sourceStylesSource.getFills().forEach(fill -> targetStylesSource.putFill(new XSSFCellFill(fill.getCTFill()))); 
sourceStylesSource.getBorders().forEach(border -> targetStylesSource.putBorder(new XSSFCellBorder(border.getCTBorder()))); 

Надеюсь, это поможет кому-то!
С уважением, winklerrr


PS

Если кто-то не может уменьшить размер требований, то, возможно, это полезно разделить задачу на две более мелкие задачи:

  1. Преобразование HSSFWorkbook в a XSSFWorkbook и наоборот.
  2. Скопируйте XSSFWorkbook точно.
+0

Если вы хотите превратить это в автономный пример [чтобы перейти в раздел примеров POI Apache] (https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf), поместите его в [ошибку улучшения] (https://bz.apache.org/bugzilla/enter_bug.cgi?product=POI) или [запрос на извлечение GitHub] (https://github.com/apache/poi), и мы хотели бы добавить его! – Gagravarr