Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Apache POI在Excel标题中保留图像_Java_Excel_Apache Poi - Fatal编程技术网

Java 使用Apache POI在Excel标题中保留图像

Java 使用Apache POI在Excel标题中保留图像,java,excel,apache-poi,Java,Excel,Apache Poi,我正在尝试使用ApachePOI3.6(最新版本)生成Excel报告 由于POI对页眉和页脚生成(仅文本)的支持有限,我决定从一个空白的excel文件开始,页眉已经准备好,并使用POI填充excel单元格(参见问题) 不幸的是,当使用POI打开工作簿并立即将其写入磁盘(无需任何单元格操作)时,标题似乎丢失了 以下是我用来测试此行为的代码: public final class ExcelWorkbookCreator { public static void main(String[] a

我正在尝试使用ApachePOI3.6(最新版本)生成Excel报告

由于POI对页眉和页脚生成(仅文本)的支持有限,我决定从一个空白的excel文件开始,页眉已经准备好,并使用POI填充excel单元格(参见问题)

不幸的是,当使用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
        }
      }
    }
  }
}

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

棘手的是,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); 
  }
}

这适用于在空白工作表中创建新的页眉,但我试图做的是保留从文件加载的现有工作表的页眉。谢谢你的指点!我现在没有正确的设置来测试这个问题,但是感谢您的来访并澄清了这个问题。当时,我正在尝试集成某种自定义标题(想想特定于客户的布局),但我没有找到一种可靠的方法来生成它们。因此,我们从一个预先修饰过的电子表格开始,用POI动态生成内容。您能将您的示例重新格式化为“idomatic”Java吗?您的try/catch语句读起来不像应该读的那样。我不认为这会编译…@dimdm-它在Java7下编译和运行。它被称为“try with resources语句”——因为Java6不再公开更新,所以现在是转向Java7:)的好时机。我同意你的看法。。。我获得图像和彩色页眉/页脚的唯一方法是使用模板。这是正确的方法。@hamlet darcy这就是我今年没有练习Java的原因:)谢谢你指出这一点!当我回到Java时,我终于能够摆脱这些复杂的finally语句:非常好。
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); 
  }
}