- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
正在尝试使用 apache POI 3.17 在应用程序上实现 excel 导出功能。
在我的本地 tomcat 服务器和 Windows 开发环境中,一切都运行良好。但是,SXSSFWorkbook workbook.createSheet() 方法在 linux tomcat 服务器上失败而没有抛出任何类型的有意义的错误(它只是挂起)。
奇怪的是,XSSFWorkbook createSheet 类上的相同方法工作正常。以下是代码片段。有没有人遇到过类似的问题?
final SXSSFWorkbook workbook = new SXSSFWorkbook();
workbook.setCompressTempFiles(true);
SXSSFSheet sheet = workbook.createSheet("Sheet 1"); //this method fails
final XSSFWorkbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet 1"); // this works fine
编辑
我创建了一个自定义 TempFileCreationStrategy以确保 tomcat 将文件写入它具有完全访问权限的目录。我可以看到文件已创建,但它在尝试向文件写入任何数据时挂起。
我想不通这个。
编辑2
我已经启用了 POI 日志记录,但我仍然没有得到任何我可以调查的有意义的东西。在我的本地服务器上,POI 日志在开始写入文件时吐出以下内容:
[20:13:05,005]DEBUG (?:?) - Save core properties part
[20:13:05,005]DEBUG (?:?) - Save package relationships
[20:13:05,005]DEBUG (?:?) - Save content types part
[20:13:05,005]DEBUG (?:?) - Save part 'docProps/app.xml'
[20:13:05,005]DEBUG (?:?) - Save part 'docProps/core.xml'
[20:13:05,005]DEBUG (?:?) - Save part 'xl/sharedStrings.xml'
[20:13:05,005]DEBUG (?:?) - Save part 'xl/styles.xml'
[20:13:05,005]DEBUG (?:?) - Save part 'xl/workbook.xml'
[20:13:05,005]DEBUG (?:?) - Save part 'xl/worksheets/sheet1.xml'
在 Linux 机器上,它甚至没有达到第一个日志输出的程度。需要找到一种方法来获取有关故障的更多详细信息!
编辑3
除了我在下面启用的默认日志记录之外,是否可以获得更详细的日志记录?
System.setProperty("org.apache.poi.util.POILogger", "org.apache.poi.util.SystemOutLogger" );
String tmpDir = System.getProperty("java.io.tmpdir")+File.separator+"excelfiles";
ExcelFileCreationStrategy tfcs = new ExcelFileCreationStrategy();
try {
tfcs.createTempDirectory(tmpDir);
} catch (IOException e) {
e.printStackTrace();
LOG.error(e);
}
TempFile.setTempFileCreationStrategy(tfcs);
final SXSSFWorkbook workbook = new SXSSFWorkbook();
workbook.setCompressTempFiles(true);
LOG.debug("creating work sheet - next line fails");
Sheet sheet = workbook.createSheet(); //hangs here
LOG.debug("It's worked!!!!");
最佳答案
我已经用 strace 检查了引擎盖下发生的事情,相关输出是:
11924 openat(AT_FDCWD, "/tmp/out.bin", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 48
11924 openat(AT_FDCWD, "/tmp/poifiles/poi-sxssf-template2618545805950425148.xlsx", O_RDWR|O_CREAT|O_EXCL, 0666) = 49
11924 openat(AT_FDCWD, "/tmp/poifiles/poi-sxssf-template2618545805950425148.xlsx", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 49
11924 openat(AT_FDCWD, "/tmp/poifiles/poi-sxssf-template2618545805950425148.xlsx", O_RDONLY) = 49
11924 openat(AT_FDCWD, "/tmp/poifiles/poi-sxssf-sheet-xml261863645047955641.gz", O_RDONLY) = 21
我想您需要确保 /tmp/poifiles
可由您的用户写入。但是在我的例子中,当我将其设置为不可写时,应用程序不会挂起,而是抛出 IOException
。
或者,如果您的 java.io.tmpdir
不是 /tmp
,我想您需要确保 poifiles
子目录在 java.io.tmpdir
是可写的。
关于java - SXSSF 工作簿 createSheet() 在 Linux 环境中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48989348/
根据SXSSF (Streaming Usermodel API) documentation : SXSSF (package: org.apache.poi.xssf.streaming) is
我有一个 .xlsx 文件,其中包含包含不同数据的多个工作表。在所有的Sheet中,一张需要容纳近10万行数据,而且数据需要用Java和poi编写。 这对于 SXSSFWorkbook 来说似乎非常快
我正在尝试在流式工作簿 (SXSSFWorkbook) 中创建 Excel 表。 API 不直接支持它,但我通过访问底层 XSSFWorkbook (workbook.getXSSFWorkbook)
我正在尝试使用 SXSSF 读取 xls 文件。我读过 SXSSF,但不明白如何使用它。所以我遇到了一些问题。 任何人都可以帮助我读取大型 xls 文件(大约 100,000 行和 7-8 页)的 j
问题 在 SXSSF 工作簿中: 如何设置字体? 如何将细胞类型设置为日期? 上下文 我需要编写一个包含大量行和列(400.000 行,每行 50 个字段)的 excel .xlsx 文件,所以我使用
我正在使用 SXSSF 编写 100 万条(最坏情况)记录。 以下是我编码的方式。 我必须将记录写入已经存在的 Excel 模板。这个 模板是 在类路径中可用。我将把这个模板复制到一个普通的 地点。使
在我的项目中,我使用 SXSSFWorkbook (Apache-POI 3.9) 类来管理大型电子表格。现在我需要评估某些单元格的公式,所以我尝试使用像这样的 FormulaEvaluator ..
我的表中有 500 行。当我使用 setRandomAccessWindowSize(1000) 时,它工作正常。数据已从结果集中成功导出到 Excel 文件中,但是当我使用 setRandomAcc
我正在使用 Apache POI 库将大量数据导入 Excel 文件。我不能使用 HSSF 模型,因为它需要太多内存并且 Java 会抛出内存堆异常。我发现的方法是 SXSSF 工作簿模型,它将每 N
我有一个问题。我是对的,如果我有一个通过 xssf 构造函数创建的工作簿,那么将构造函数更改为 sxssf 工作簿就足够了(使用 xssf wb 作为参数传递)以使其在 流模式 下工作?非常感谢您的回
我正在尝试编写一个巨大的 excel 文件,我的要求允许我写下行然后忘记,所以我正在使用 SXSSF这只允许在内存中保留少数行,其余的都写入文档。这有助于克服大文件的内存不足异常。 但我还需要使用 s
我需要读取大型 excel 文件并将其数据导入我的应用程序。 由于 POI 占用大量堆工作,经常抛出 OutOfMemory 错误,我发现有一个 Streaming API 用于串行处理 excel
我想将 SXSSF 转换器与 JXLS 一起使用。我试图以这样一种方式编写我的模板,即我不会得到“试图在已经写入磁盘的范围内写入一行”异常。该模板捕获已知列(例如“HEADER 0”)和未知列(以“_
使用 POI 时 XSSFWorkbook ,单元格(通过生成的 xlsx 文件内的 sharedStrings.xml)会自动保留空白,即 sharedStrings.xml 中的条目看起来像
我有一个包含宏 (.xlsm) 的 Excel 模板,我想读入它,向其中添加一百万行并将其写出。 我知道使用包含宏的 POI 读取和重写文件将保留宏。我需要使用 SXSSF(内存限制)写出 Excel
我能够使用 XSSF 读取现有的 xlsm,并使用 SXSSF 将数据写入工作表。最后使用 Outputstream 将其输出为另一个 xlsm。 SXSSF在文档中提到用于编写xlsx 读取和写入大
我正在使用 POI () 的流式工作表编写一个大型 Excel 工作表(超过一百万条记录),但出现 java.lang.OutOfMemoryError: Java heap space。这是我的代码
正在尝试使用 apache POI 3.17 在应用程序上实现 excel 导出功能。 在我的本地 tomcat 服务器和 Windows 开发环境中,一切都运行良好。但是,SXSSFWorkbook
我在使用 SXSSF poi api 生成有效的 xlsx 文件时遇到问题。如果我使用以下代码,则会生成正确的 Excel 文件:工作簿 wb = new XSSFWorkbook();但如果我使用失
我有一个包含 400,000 行的大型 .xlsx Excel 工作表。我想在这个现有的工作簿中阅读和写作。 当我尝试使用 Apache poi 在 java 中读取它时,代码如下: FileInpu
我是一名优秀的程序员,十分优秀!