OleDbDataAdapter.Fill(DataTable)不能处理大的xls文件大小

我试图得到一个DataTable ,阅读一个.xls文件。 如果我使用大小为25kb的.xls文件运行下面的代码,它工作正常,但如果我加载一个更大的文件(7.52MB),它不起作用。

 string filenamePath = System.IO.Path.Combine(Server.MapPath("/Uploads"), FileUpload1.FileName); FileUpload1.SaveAs(filenamePath); string[] validFileTypes = { "xls", "xlsx"}; string ext = System.IO.Path.GetExtension(FileUpload1.PostedFile.FileName); bool isValidFile = false; string fileName = FileUpload1.FileName; for (int i = 0; i < validFileTypes.Length; i++) { if (ext == "." + validFileTypes[i]) { isValidFile = true; break; } } if (isValidFile) { DataTable dt = ConvertXLSTpXLM.convertXLSToDb(filenamePath, "ELEMENT", "ELEMENTS", true, fileName); } 

这是convertXLSToDb方法

 public static DataTable convertXLSToDb(string filePath, string firstElement, string secondElement, bool hasHeaders, string filename) { DataTable dtexcel = new DataTable(); string HDR = hasHeaders ? "Yes" : "No"; string strConn; if (filePath.Substring(filePath.LastIndexOf('.')).ToLower() == ".xls") strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;HDR=" + HDR + ";IMEX=0\""; else strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=\"Excel 8.0;HDR=" + HDR + ";IMEX=0\""; OleDbConnection conn = new OleDbConnection(strConn); conn.Open(); DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); DataRow schemaRow = schemaTable.Rows[0]; string sheet = schemaRow["TABLE_NAME"].ToString(); if (!sheet.EndsWith("_")) { string query = "SELECT * FROM [" + sheet + "]"; OleDbDataAdapter daexcel = new OleDbDataAdapter(query, conn); dtexcel.Locale = CultureInfo.CurrentCulture; daexcel.Fill(dtexcel); } conn.Close(); return dtexcel; } 

没有错误发生,但在“daexcel.Fill(dtexcel);” 该页面无限运行。

如果我使用大小为25kb的.xls文件运行下面的代码,它工作正常,但如果我加载一个更大的文件(7,52MB),它不起作用。

假如你不把大量的IDisposable资源放在一边,有可能文件的大小没有问题,而是文件的内容。 也就是说,你可能会有一行“好奇”的数据,如果你想把那些好奇的数据放到25kb的文件中,那也是行不通的。

微软明确指出, 在服务环境中使用ACE是一个坏主意 :

Access数据库引擎2010可再发行组件不适用于:

由系统服务或服务器端程序使用,代码将在系统帐户下运行,或者同时处理多个用户身份,或者高度可重入并且预期无状态行为。 例子包括当没有用户login时从任务调度程序运行的程序 ,或者从服务器端web应用程序(如ASP.NET)调用的程序或在COM +服务下运行的分布式组件。

类似的警告适用于JET,但它们没有被明确地logging。

要诊断问题出在哪里,请将代码从ASP .NET中取出,并将其放入交互式控制台应用程序并运行。

如果代码仍然存在问题,您可以考虑暂停使用debugging器的过程,并尝试检查代码“冻结”的位置。 暂停GetOleDbSchemaTable而不是Fill可能会照亮。

除此之外,考虑到在服务器环境中不推荐使用JET和ACE,您可能会考虑放弃.xsl支持,并使用类似EPPlus的内容来读取.xlsx文件。

file upload控件默认上传文件只能达到4MB。 请参阅下面的页面上的注意事项。

http://msdn.microsoft.com/en-us/library/ms227669(v=vs.90).aspx

您可以更改Webconfiguration中的httpRuntime maxRequestLength,如下所述。

如何以编程方式设置(使用GET SET属性)在ASP.NET中的“httpRuntime maxRequestLength”与C#作为代码的代码

希望这可以帮助!