我的老板习惯在我们的数据库上执行查询,返回数万行并将其保存到excel文件中。作为实习生,我经常不得不编写与这些文件中的信息一起使用的脚本。到目前为止,我已经尝试过VBScript和Powershell来满足我的脚本需求。即使是最简单的任务,这两个任务都可能需要几分钟才能完成,这意味着完成后的脚本大部分时间都是8小时。
我现在的解决方法就是编写一个PowerShell脚本,从xlsx文件中删除所有逗号和换行符,将.xlsx文件保存到.csv,然后让Java程序处理数据收集和输出,完成后让我的脚本清理.csv文件。对于我目前的项目,这只需要几秒钟就可以运行,但我不禁想知道下一个项目是否有更优雅的选择。有什么建议吗?
答案 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文件。