我正在尝试获取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);”上页面无限运行。
答案 0 :(得分:2)
如果我用大小为25kb的.xls文件运行下面的代码,它工作正常,但是如果我加载一个更大的文件(7,52MB),它就不起作用。
事实上你没有Dispose
很多IDisposable
资源到一边,文件大小可能没有问题,而问题是文件的内容文件。也就是说,你可能会有一个“好奇”的数据行,如果你把这些好奇的数据放到25kb的文件中,它也行不通。
Microsoft明确声明using ACE in a service environment is a bad idea:
Access数据库引擎2010可再发行组件无意:
...
由系统服务或服务器端程序使用,其中代码将在系统帐户下运行,或者将同时处理多个用户身份,或者是高度可重入的并且期望无状态行为。示例包括在没有用户登录时从任务调度程序运行的程序,或从服务器端Web应用程序(如ASP.NET )调用的程序,或在COM +服务下运行的分布式组件。
类似的警告适用于JET,但它们没有明确记录。
要诊断出问题所在,请从ASP .NET中获取代码并将其放入交互式控制台应用程序中并运行它。
如果代码仍然存在问题,您可以考虑将该过程与调试器暂停,并尝试检查代码已“冻结”的位置。暂停GetOleDbSchemaTable
代替Fill
可能会有所启发。
除此之外,鉴于在服务器环境中不建议使用JET和ACE,您可以考虑放弃.xsl
支持并使用EPPlus之类的内容来阅读.xlsx
文件。
答案 1 :(得分:1)
文件上传控件默认情况下只能上传4MB的文件。请参阅下面的注释。
http://msdn.microsoft.com/en-us/library/ms227669(v=vs.90).aspx
您可以在Web配置中更改httpRuntime maxRequestLength,如下所述。
希望这有帮助!