【发布时间】:2018-09-06 23:27:35
【问题描述】:
我在 Google 中进行了搜索,但找不到下面提到的问题的正确答案。如果这是一个重复的问题,请原谅我,但我找不到任何正确的答案。
所以,来回答这个问题。我必须在 Java 中读取多个 Excel 文件并从这些多个文件中生成最终的 Excel 报告文件。
有2个文件夹:
源文件夹:包含多个 Excel 文件(大概 10,000 个文件)
目标文件夹:从源文件夹中读取所有文件后,此文件夹将包含一个最终的 Master Excel 文件。
对于从 Source 文件夹中读取的每个 Excel 文件,Destination 文件夹中的主文件将各有 1 行。
我打算使用 Apache POI 在 Java 中读写 excel 文件。
我知道使用 POI 在 Java 中读取和写入文件很容易,但我的问题是,在这种情况下,有近 10,000 个文件要读取和写入到 1 个单个主文件中,最好的方法是什么? ,考虑到程序所花费的时间和使用的 CPU。一次读取 1 个文件将非常耗时。
所以,我计划使用线程一次处理 100 个文件的批次。谁能指点我一些资源或建议我如何处理此要求?
已编辑:
我已经编写了使用 POI 读写文件的程序。下面提到了相同的代码:
// Loop through the directory, fetching each file.
File sourceDir = new File("SourceFolder");
System.out.println("The current directory is = "+sourceDir);
if(sourceDir.exists()) {
if(sourceDir.isDirectory()){
String[] filesInsideThisDir = sourceDir.list();
numberOfFiles = filesInsideThisDir.length;
for(String filename : filesInsideThisDir){
System.out.println("(processFiles) The file name to read is = "+filename);
// Read each file
readExcelFile(filename);
// Write the data
writeMasterReport();
}
} else {
System.out.println("(processFiles) Source directory specified is not a directory.");
}
} else {
}
这里,SourceFolder 包含所有要读取的 Excel 文件。我正在遍历这个文件夹,一次获取 1 个文件,读取内容,然后写入 1 个 Master Excel 文件。
readExcelFile() 方法正在读取每个 excel 文件,并创建一个 List,其中包含要写入 Master excel 文件的每一行的数据。
writeMasterReport() 方法正在写入从每个 excel 文件中读取的数据。
程序运行良好。我的问题是,有什么方法可以通过使用 Threads 读取文件来优化此代码?我知道只有 1 个文件可以写入,并且不能并行完成。如果 sourceFolder 包含 10,000 个文件,那么这种方式的读写会花费很多时间来执行。
每个输入文件的大小约为几百 KB。
所以,我的问题是,我们可以使用线程批量读取文件,比如每个线程 100 或 500 个文件,然后为每个线程写入数据吗?我知道写入部分需要同步。这样至少可以最小化读写时间。请让我知道您对此的看法。
【问题讨论】:
-
如果您真的遇到性能问题,请先尝试并返回。不要过早优化。
-
“我打算使用线程来分批处理文件,比如一次 100 个文件。”然后从所有这些线程写入一个目标工作簿?不可能,请参阅FAQ 20. Can I access/modify workbooks/documents/slideshows in multiple threads?。
-
您需要多长时间处理这些文件?我猜你不需要“立即”完成它。有时只需一个接一个地浏览它们就足够了。
-
lexicore 是对的,多线程可能会使应用程序不必要地复杂化,并且处理时间的改进可能不值得。你应该首先尝试用一个线程解决这个问题,看看时间是否满足。然后您可以尝试转换您的代码以支持多个线程。这些excel文件有多大?如果它们大约只有几 mbs,那么它很可能不值得。
-
“对于从Source文件夹中读取的每个Excel文件,Destination文件夹中的主文件将各有1行。”:然后首先收集
POJOs的List中的行。这可以是多线程的。然后在一个线程中从List编写目标工作簿。
标签: java excel multithreading apache-poi