2

我正在尝试获取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);”上 页面无限运行。

4

2 回答 2

2

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

将您没有Dispose很多IDisposable资源的事实放在一边,文件的大小可能没有问题,而问题在于文件的内容。也就是说,您可能有一排包含“好奇”数据的行,如果您要将这些好奇的数据放入 25kb 文件中,它也不会起作用。

Microsoft 明确声明在服务环境中使用 ACE 是一个坏主意

Access 数据库引擎 2010 Redistributable 不适用于:

...

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

类似的警告适用于 JET,但它们并没有明确地记录在案。

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

如果代码仍然出现问题,您可以考虑使用调试器暂停进程并尝试检查代码“冻结”的位置。暂停GetOleDbSchemaTable而不是Fill可能很有启发性。

除此之外,鉴于在服务器环境中不建议使用 JET 和 ACE,您可能会考虑放弃.xsl支持并使用EPPlus 之类的工具来读取.xlsx文件。

于 2013-10-27T09:35:50.260 回答
1

默认情况下,文件上传控件最多只能上传 4MB 的文件。请参阅下面页面上的注释。

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

您可以更改 web 配置中的 httpRuntime maxRequestLength,如下所述。

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

希望这可以帮助!

于 2013-11-21T11:20:37.363 回答