解析极大Excel 2007文件的最佳语言

时间:2010-08-24 20:54:14

标签: java excel scripting excel-2007 apache-poi

我的老板习惯在我们的数据库上执行查询,返回数万行并将其保存到excel文件中。作为实习生,我经常不得不编写与这些文件中的信息一起使用的脚本。到目前为止,我已经尝试过VBScript和Powershell来满足我的脚本需求。即使是最简单的任务,这两个任务都可能需要几分钟才能完成,这意味着完成后的脚本大部分时间都是8小时。

我现在的解决方法就是编写一个PowerShell脚本,从xlsx文件中删除所有逗号和换行符,将.xlsx文件保存到.csv,然后让Java程序处理数据收集和输出,完成后让我的脚本清理.csv文件。对于我目前的项目,这只需要几秒钟就可以运行,但我不禁想知道下一个项目是否有更优雅的选择。有什么建议吗?

10 个答案:

答案 0 :(得分:5)

  

使用.xlsx文件时,我一直遇到各种奇怪的错误。

以下是使用Apache POI遍历.xlsx文件的简单示例。另请参阅Upgrading to POI 3.5, including converting existing HSSF Usermodel code to SS Usermodel (for XSSF and HSSF)

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class XlsxReader {

    public static void main(String[] args) throws IOException {
        InputStream myxls = new FileInputStream("test.xlsx");
        Workbook book = new XSSFWorkbook(myxls);
        FormulaEvaluator eval =
            book.getCreationHelper().createFormulaEvaluator();
        Sheet sheet = book.getSheetAt(0);
        for (Row row : sheet) {
            for (Cell cell : row) {
                printCell(cell, eval);
                System.out.print("; ");
            }
            System.out.println();
        }
        myxls.close();
    }

    private static void printCell(Cell cell, FormulaEvaluator eval) {
        switch (cell.getCellType()) {
            case Cell.CELL_TYPE_BLANK:
                System.out.print("EMPTY");
                break;
            case Cell.CELL_TYPE_STRING:
                System.out.print(cell.getStringCellValue());
                break;
            case Cell.CELL_TYPE_NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    System.out.print(cell.getDateCellValue());
                } else {
                    System.out.print(cell.getNumericCellValue());
                }
                break;
            case Cell.CELL_TYPE_BOOLEAN:
                System.out.print(cell.getBooleanCellValue());
                break;
            case Cell.CELL_TYPE_FORMULA:
                System.out.print(cell.getCellFormula());
                break;
            default:
                System.out.print("DEFAULT");
        }
    }
}

答案 1 :(得分:3)

您的目标是对Excel文件执行“数据转换”。

要解决这个问题,我会使用专用的ETL工具(Extract Transform Load),例如Talend Open Studio

您只需要放置“Excel输入”组件,“数据转换”组件和“CSV输出组件”。 Talend ETL会将您的问题的功能描述转换为Java代码。最后,你只需要执行这个程序......

答案 2 :(得分:2)

我个人会为此使用Python。我发现它运行得足够快,不会成为明显的问题。

如果您不想担心新语言,为什么不直接使用Java呢?删除逗号和换行在Java中非常简单,它可以为您节省一步。

答案 3 :(得分:2)

您应该始终考虑代码的未来......

将来谁会维护您的脚本? 贵公司是否有其他熟悉PowerShell / VBScript的开发人员?

我不得不说你应该坚持一种适合你(和你公司)需要的语言。正如Nathan所说,Python将是创建快速脚本的绝佳选择。

还有一件事 - 如果你可以控制你的老板所做的SQL语句,你可以让他创建输出,这将简化你的解析器的开发并使它们变得更加简单。

祝你好运!

塔尔。

答案 4 :(得分:2)

除了trashgod的回答,对于大文件,我建议使用POI SXSSF(自POI 3.8 beta3以来)。 (http://poi.apache.org/spreadsheet/) 使用SXSSF,您可以处理流中的大型文件,这有助于避免内存错误。

添加指向SXSSF详细信息的链接:http://poi.apache.org/spreadsheet/how-to.html#sxssf

答案 5 :(得分:1)

您可以使用Java POI直接访问.xlsx。

答案 6 :(得分:1)

如果您将文件另存为CSV,则可以使用要解析的任何语言。

答案 7 :(得分:0)

您可以将数据导入嵌入式数据库 - 例如,apache derby(或http://hsqldb.org/)。根据查询的性质,它可以更快一点。当然,如果您的老板经常要求新功能,它将节省大量时间。您只需在SQL中编写大部分新功能。

答案 8 :(得分:0)

如果您需要ADVANCE分析 - 除了分组,加入,过滤之外 - 只需使用免费的挖掘工具,例如Wekka *,Rapid矿工(基于Wekka但更好的GUI)或knime。这些工具具有非常好的接口,并为操作员提供读取cvs文件的功能。您还可以在java程序中运行rapidminer和wekka库。如果没有,请按照我之前的建议去寻找嵌入式数据库。

使用Apache POI并不是一个坏主意,但我 - 个人 - 更喜欢在将其上传到例如数据库之前将其用于读取excel。

关于语言。我为adhoc任务找到的最好的语言是groovy。它是Java顶部的脚本语言,因此您可以使用所有Java库(POI,jdbcs,......一个非常宽松的列表),并将groovy类与Java类混合使用。

答案 9 :(得分:0)

我有两种解析excel(.xlsx或xls)文件的选项。   1 - 您可以使用apache POI api从中提取数据。现在Apache poi已经改进并且速度很快。

2-转换excel打开xml然后写一个xslt文件。我认为它应该适用于长文件excel文件。