当前位置: 首页 > 知识库问答 >
问题:

当任务运行两次时,Apache POI将数据附加到xlsx文件

房时铭
2023-03-14

我有一个template.xls文件,我正在从一些数据库查询中添加数据。我添加数据并生成一个名为yyyyMMddHHmmss.xls的新文件。这很好。文件大小越来越大,所以我试图用xlsx文件做同样的事情。当我第一次生成文件时,它工作得很好。如果我再次运行这个过程(即使我重新启动我的java应用程序),它会以某种方式保留内存中的最后一个文件,并将数据附加到该文件中。在这两种情况下,它都从template.xls(x)中提取源文件,这是一个未修改的文件。

这两者之间的代码是相同的,只是我传递的是xlsx,而不是后一种情况下的xls

ClassLoader classLoader = getClass().getClassLoader();
File file = new File(Objects.requireNonNull(classLoader.getResource("template.xlsx")).getFile());
Workbook workbook = WorkbookFactory.create(file);
// write data
Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
String currentDate = formatter.format(date);
FileOutputStream fileOutputStream = new FileOutputStream(currentDate + ".xlsx");
workbook.write(fileOutputStream);
fileOutputStream.close();
workbook.close();

我正在使用Java8u201org.apache.poi: poi: 4.1.0(也尝试过4.0.1

共有1个答案

夏侯华彩
2023-03-14

正如Apache POI-FileInputStream works中所述,文件对象已经失败(NullPointerException),从文件创建XSSFWorkbook有一个缺点,即当XSSFWorkbook时,在该工作簿中所做的所有更改都将存储到该文件中。写。即使写入写入另一个文件,这也是正确的。但是,显式地写入同一个文件甚至是不可能的,因为创建工作簿后,文件保持打开状态,因此写入同一个文件会导致异常。

因此,使用

Workbook workbook = WorkbookFactory.create(file);

file*. xlsx文件时,这不是一个好主意。相反,需要使用FileInputstream创建Workbook

Workbook workbook = WorkbookFactory.create(new FileInputStream(file));

虽然链接的SO Q/A来自2017年,但使用ApachePOI4.1.0的今天,同样的问题也不会发生。

 类似资料:
  • 问题内容: 我正在尝试创建一个将条目添加到json文件的函数。最终,我想要一个看起来像 等。这就是我所拥有的: 这确实会创建一个条目,例如。但是,如果我再次使用此函数(使用不同的名称和网址),第一个函数将被覆盖。我需要怎么做才能将第二个(第三个…)条目附加到第一个? 编辑 :对此问题的第一个答案和评论已经指出了我在写块中未使用的明显事实。不过,我看不出该怎么做。例如,以下内容显然不会起作用: 问题

  • 我有一个Java的计时器任务来生成每日报告。当我通过linux终端调用Java类(调度定时器任务),而不是在给定时间调度第一次运行时,它会在命令执行后立即运行。有人能建议为什么会这样吗... 我使用的计划它。 忘了补充一下,我使用的是java 1.5,这里是def方法 代码片段:

  • 问题内容: 我有这个.json文件: 这是我的PHP代码: 问题是,我不确定如何实现它。每次提交表单时,我都会在上面调用此代码,因此我需要ID递增,并且还要使用和保持有效的JSON结构,这可能吗? 问题答案:

  • 我有3个维度为(a*2、b*2、c*2)的数据帧,而a、b、c是不同的数字。我想把它们添加到一个csv文件中,但每次都写不出来。我使用了csv的熊猫数据帧输出端 但做不到。 我的代码- 但是,我得到的最终输出是最后一个数据帧,而不是所有其他数据帧。

  • 问题内容: 如我所见,java mongo驱动程序不提供从现有gridFS文件获取的功能 我必须直接创建或使用方法。 是否缺少Java驱动程序或gridfs的限制? 除了创建新文件/删除旧文件之外,您能否建议其他解决方法? 谢谢 问题答案: GridFS不是MongoDB的核心功能,而是存储带有随附元数据的二进制数据的约定。您应该能够以通常的方式修改集合中的任何文档,同时保持相应文档的完整性。主要

  • 失败:构建失败,但有一个异常。 错误:任务“:ofbiz--加载数据”的执行失败 处理“命令”C:\Program Files\Java\jdk-17.0.2\bin\Java。exe“”已完成,退出值为非零1 尝试: 使用--info或--debug选项运行以获得更多日志输出。运行--扫描以获得完整的见解。 例外情况是:组织。格拉德尔。应用程序编程接口。任务。TaskExecutionExcep