我有一个 150MB 的单页 Excel 文件,使用以下方法在一台功能非常强大的机器上打开大约需要 7 分钟:
# using python
import xlrd
wb = xlrd.open_workbook(file)
sh = wb.sheet_by_index(0)
有什么方法可以更快地打开excel文件?我愿意接受甚至非常古怪的建议(例如 hadoop、spark、c、java 等)。理想情况下,如果这不是白日梦,我正在寻找一种在 30 秒内打开文件的方法。另外,上面的例子使用的是python,但不一定是python。
注意:这是来自客户端的 Excel 文件。在我们收到之前,它不能转换成任何其他格式。这不是我们的文件
更新:回答一个可在 30 秒内打开以下 200MB excel 文件的工作示例将获得赏金奖励:https://drive.google.com/file/d/0B_CXvCTOo7_2VW9id2VXRWZrbzQ/view?usp=sharing .此文件应包含字符串 (col 1)、日期 (col 9) 和数字 (col 11)。
最佳答案
大多数与 Office 产品一起使用的编程语言都有一些中间层,这通常是瓶颈所在,一个很好的例子是使用 PIA 的/Interop 或 Open XML SDK。
在较低级别(绕过中间层)获取数据的一种方法是使用驱动程序。
150MB one-sheet excel file that takes about 7 minutes.
我能做的最好的事情是在 135 秒内创建一个 130MB 的文件,大约快 3 倍:
Stopwatch sw = new Stopwatch();
sw.Start();
DataSet excelDataSet = new DataSet();
string filePath = @"c:\temp\BigBook.xlsx";
// For .XLSXs we use =Microsoft.ACE.OLEDB.12.0;, for .XLS we'd use Microsoft.Jet.OLEDB.4.0; with "';Extended Properties=\"Excel 8.0;HDR=YES;\"";
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + filePath + "';Extended Properties=\"Excel 12.0;HDR=YES;\"";
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
conn.Open();
OleDbDataAdapter objDA = new System.Data.OleDb.OleDbDataAdapter
("select * from [Sheet1$]", conn);
objDA.Fill(excelDataSet);
//dataGridView1.DataSource = excelDataSet.Tables[0];
}
sw.Stop();
Debug.Print("Load XLSX tool: " + sw.ElapsedMilliseconds + " millisecs. Records = " + excelDataSet.Tables[0].Rows.Count);
Win 7x64,英特尔 i5,2.3ghz,8GB 内存,SSD250GB。
如果我也可以推荐一个硬件解决方案,如果您使用的是标准 HDD,请尝试使用 SSD 解决它。
注意:我无法下载您的 Excel 电子表格示例,因为我位于公司防火墙后面。
PS。见 MSDN - Fastest Way to import xlsx files with 200 MB of Data ,共识是 OleDB 是最快的。
PS 2. 以下是使用 python 执行此操作的方法: http://code.activestate.com/recipes/440661-read-tabular-data-from-excel-spreadsheets-the-fast/
关于java - 如何有效地打开一个巨大的excel文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46373895/