最好的语言来parsing极大的Excel 2007文件

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

我现在的解决方法是编写一个PowerShell脚本,它从xlsx文件中删除所有的逗号和换行符,将.xlsx文件保存为.csv,然后让一个Java程序处理数据收集和输出,脚本完成后清理.csv文件。 这对于我目前的项目来说只需几秒钟,但是我不禁要问,下一个项目是否还有一个更优雅的select。 有什么build议么?

使用.xlsx文件时,我不断收到各种奇怪的错误。

以下是使用Apache POI来遍历.xlsx文件的一个简单示例。 另请参阅升级到POI 3.5,包括将现有的HSSF Usermodel代码转换为SS Usermodel(对于XSSF和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"); } } } 

你的目标是对你的Excel文件进​​行“数据转换”。

为了解决这个问题,我会使用一个专门的ETL工具(Extract Transform Load),比如Talend Open Studio 。

您只需要放入一个“Excelinput”组件,一个“数据转换”组件和一个“CSV输出组件”。 Talend ETL将把你的问题的这个function描述转换成Java代码。 最后,你只需要执行这个程序…

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

如果你不想担心一种新的语言,为什么不使用Java的整个事情呢? 删除逗号和换行符在Java中是非常简单的,它会为您节省一个步骤。

你应该总是考虑你的代码的未来…

谁将在未来保持你的剧本? 贵公司是否有其他熟悉PowerShell / VBScript的开发人员?

我不得不说,你应该坚持一种适合你(和你的公司)需求的语言。 正如Nathan所build议的那样,Python将是创build快速脚本的绝佳select。

还有一件事 – 如果你可以控制你的老板所做的SQL语句,你可以让他创build输出,这将减轻你的parsing器的开发,并使它们变得更简单。

祝你好运!

塔尔。

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

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

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

如果您将该文件保存为CSV ,则可以使用任何您想要parsing的语言。

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

如果您需要进行ADVANCE分析 – 超越分组,join,过滤 – 只需使用免费的挖掘工具,例如Wekka *, Rapid矿工(基于Wekka但更好的GUI)或编织 。 这些工具有非常好的接口,并提供操作员读取CVS文件。 你也可以在你的java程序中运行rapidminer和wekka库。 如果没有,就像我之前提出的那样去找embedded式数据库。

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

关于语言。 我为特别任务find的最好的语言是groovy 。 它是Java顶部的脚本语言,所以你可以使用所有的Java库(POI,jdbcs,…一个非常looong的列表),并与Java类混合groovy类。

我有两个parsingexcel(.xlsx或xls)文件的选项。 1-你可以使用apache POI api从中提取数据。现在Apache poi已经改进和快速。

2-转换excel打开xml然后写一个xslt文件。 我认为它应该做一个长文件excel文件的工作。