【问题标题】:Preserve images in Excel headers using Apache POI使用 Apache POI 在 Excel 标题中保留图像
【发布时间】:2010-01-06 11:08:12
【问题描述】:

我正在尝试使用 Apache POI 3.6(最新)生成 Excel 报告。

由于 POI 对页眉和页脚生成的支持有限(仅限文本),我决定从已准备好页眉的空白 Excel 文件开始,并使用 POI 填充 Excel 单元格(参见问题 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
        }
      }
    }
  }
}

【问题讨论】:

    标签: java excel apache-poi


    【解决方案1】:
    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);       
    

    【讨论】:

    • 这适用于在空白工作表中创建新标题,但我想做的是保留从文件加载的现有工作表的标题。不过感谢您的指点!
    【解决方案2】:

    只要 Excel 97-2003 支持这些标头,就会保留 Excel 文件的标头。例如,支持图像(我刚刚尝试过),但不支持彩色文本。

    其中棘手的部分是您的 Excel 模板文件“dump.xls”必须是 Excel 97-2003 格式。请注意:这不是文件扩展名,而是文件的实际内容。最新的 Excel 很乐意将最新的格式保存在 POI 无法读取的 .xls 文件中。

    要对此进行测试,请将您的 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); 
      }
    }
    

    【讨论】:

    • 我现在没有正确的设置来测试这个,但感谢您过来澄清问题。当时,我正在尝试集成某种自定义标题(考虑特定于客户的布局),但我没有找到生成它们的可靠方法。因此产生了从预先装饰的电子表格开始并使用 POI 动态生成内容的想法。
    • 您能否将您的示例重新格式化为“idomatic”Java?您的 try/catch 语句看起来不像它应该的那样。我认为这不会编译...
    • @dimdm - 在 Java 7 下编译和运行。它被称为“资源尝试声明” - docs.oracle.com/javase/tutorial/essential/exceptions/… 由于 Java 6 不再公开更新,现在是继续前进的好时机Java 7 :) oracle.com/technetwork/java/eol-135779.html 。我同意你的看法......我能够获得图像和颜色页眉/页脚的唯一方法是使用模板。这是正确的做法。
    • @hamlet-darcy 这就是我今年没有练习任何 Java 的结果 :) 感谢您指出!当我回到 Java 时,我终于能够摆脱这些令人费解的 finally 语句了:非常好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多