Сохраняйте изображения в заголовках Excel, используя Apache POI - PullRequest
1 голос
/ 06 января 2010

Я пытаюсь сгенерировать отчеты Excel, используя Apache POI 3.6 (последняя версия).

Поскольку POI имеет ограниченную поддержку генерации верхнего и нижнего колонтитула (только текст), я решил начать с пустого файла Excel с уже подготовленным заголовком и заполнить ячейки Excel с помощью POI (см. Вопрос 714172 ).

К сожалению, при открытии книги с POI и немедленной записи на диск (без какой-либо манипуляции с ячейкой) заголовок, похоже, теряется.

Вот код, который я использовал для проверки этого поведения:

public final class ExcelWorkbookCreator {

  public static void main(String[] args) {
    FileOutputStream outputStream = null;
    try {
      outputStream = new FileOutputStream(new File("dump.xls"));
      InputStream inputStream = ExcelWorkbookCreator.class.getResourceAsStream("report_template.xls");
      HSSFWorkbook workbook = new HSSFWorkbook(inputStream, true);
      workbook.write(outputStream);
    } catch (Exception exception) {
      throw new RuntimeException(exception);
    } finally {
      if (outputStream != null) {
        try {
          outputStream.close();
        } catch (IOException exception) {
          // Nothing much to do
        }
      }
    }
  }
}

Ответы [ 2 ]

1 голос
/ 18 июня 2013

Заголовки файла Excel сохраняются до тех пор, пока эти заголовки поддерживаются в Excel 97-2003. Например, изображения поддерживаются (я только что попробовал), а цветной текст - нет.

Сложность в том, что ваш файл шаблона Excel "dump.xls" должен быть в формате Excel 97-2003. Обратите внимание: это не расширение файла, а фактическое содержимое файла. Новейший Excel с удовольствием сохранит новейшее форматирование в файле .xls, который POI не может прочитать.

Чтобы проверить это, сохраните файл Excel как файл .xls. Важно - Если вы получаете предупреждение о совместимости, вы должны нажать ссылку «Исправить» в диалоговом окне, чтобы исправить Excel. Простое нажатие кнопки «Приступить» делает файл Excel недействительным для POI.

Если у вас есть настоящий файл .xls (с совместимым содержимым), тогда ваш код работает. Я только что проверил это сам:

public static void main(String[] args) throws Exception {
  try (FileInputStream fis = new FileInputStream("./report_template.xls"); 
      FileOutputStream fos = new FileOutputStream("./dump.xls")) {
    HSSFWorkbook wb = new HSSFWorkbook(fis);
    wb.write(fos); 
  }
}
1 голос
/ 21 апреля 2010
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet    sheet    = new HSSFSheet();

Header header = sheet.getHeader() //get header from workbook's sheet
header.setCenter(HSSFHeader.font("COURIER", "Normal")+ HSSFHeader.fontSize((short) 15) + "Hello world" +new Date()); // set header with desire font style 

FileOutputStream fileOut = new FileOutputStream("C:\\book.xls");
workbook.write(fileOut);       
...