java - 如何有效地打开一个巨大的excel文件

标签 java c# python c++ excel

我有一个 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);

enter image description here

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/

相关文章:

java - 检查 id 是否在字符串中,如果是则获取值

C# Marshal/Pinvoke CBitmap?

python - 如何在 sklearn 中使用 BERT 和 Elmo 嵌入

python - 当术语在 bash 中显示时终止终端应用程序

python - 使用 Python Scipy Minimize 优化运输成本流

Java 的 Math.Pow() 函数返回令人困惑的结果

使用while循环的Java程序将其更改为使用方法

java - 编译 : android. STORY FROM MY_TABLE 时由 : no such column: TITLE (code 1): , database.sqlite.SQLiteException : SELECT TITLE, 引起

c# - ASP.NET MVC : How to close browser window instead of returning a view?

c# - Nhibernate 数据库连接时空引用异常