Java:使用Apache POI读取10,000个excel文件并使用Java写入1个主文件

时间:2018-03-28 10:12:09

标签: java excel multithreading apache-poi

我在谷歌搜索但找不到下面提到的问题的正确答案。请原谅我这是一个重复的问题,但我找不到任何正确的答案。

所以,提出问题。我必须用Java读取多个Excel文件,并从这些多个文件中生成最终的Excel报告文件。

有2个文件夹:

  1. 源文件夹:它包含多个Excel文件(可能是10,000个文件)

  2. 目标文件夹:从Source文件夹中读取所有文件后,此文件夹将有一个最终的Master Excel文件。

  3. 对于从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来读取文件来优化这段代码吗?我知道只有一个文件可以写入,并且不能并行完成。如果sourceFolder包含10,000个文件,以这种方式读取和写入将花费大量时间来执行。

    每个输入文件的大小约为几百KB。

    所以,我的问题是,我们可以使用Threads批量读取文件,比如说每个线程100或500个文件,然后为每个线程写入数据吗?我知道写部分需要同步。这样至少可以最小化读写时间。请让我知道你对此的看法。

1 个答案:

答案 0 :(得分:0)

有10k的文件~100Kb我们每个人都在谈论阅读ca. ~1Gb的数据。如果处理过于复杂(似乎是这样),那么你的瓶颈将是IO。

因此IO最有可能并行化读取和处理文件,因为IO有一个上限 如果处理是复杂的/瓶颈,并行化将是有意义的。这似乎不是这种情况。