导出到Excel电子表格(XLSX)失败。

3
使用ASP.NET网页,我正在将一些数据导出到Excel电子表格(XLSX)。当我在Visual Studio中运行它时,代码可以正常运行(导出包含正确数据的XLSX文件),但是当部署到测试服务器上时,相同的代码会失败。
它没有抛出任何错误,只是导出一个空白的XLSX文件。
注意:在测试服务器上进行调试时,我发现数据被获取并且临时文件也被正确创建,但是数据没有被写入到临时文件中(奇怪的是它没有抛出任何错误)。
后来添加:
经过更多的研究,我发现小记录集(比如1000、2000条)没有问题。但是当尝试使用大约20K条记录时,我得到了一个空文件。
我已经为此苦恼了2天,希望有人能帮助我 :) ...
代码
string templateFile = @"C:\Templates\ExportFile.xlsx";
string tempFileName = Path.Combine(@"C:\Temp\", Path.GetRandomFileName());
tempFileName = Path.ChangeExtension(tempFileName, ".xlsx");
File.Copy(templateFile, tempFileName);

List<Customer> customerList = FetchCustomers();

DataTable dataTableObj = new DataTable("Customers$");
dataTableObj.Columns.Add(new DataColumn("CustomerID"));
dataTableObj.Columns.Add(new DataColumn("FirstName"));
dataTableObj.Columns.Add(new DataColumn("LastName"));
dataTableObj.Columns.Add(new DataColumn("CreatedDate"));

foreach (Customer customerObj in customerList)
{
    DataRow dataRowObj = dataTableObj.NewRow();
    dataRowObj["CustomerID"] = customerObj.CustomerID;
    dataRowObj["FirstName"] = customerObj.FirstName;
    dataRowObj["LastName"] = customerObj.LastName;
    dataRowObj["CreatedDate"] = customerObj.CreatedDate;
    dataTableObj.Rows.Add(dataRowObj);
}

using (OleDbConnection oleDbConnectionObj = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + tempFileName + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES;\""))
{
    OleDbCommand insertCommand = new OleDbCommand();
    insertCommand.Connection = oleDbConnectionObj;
    insertCommand.CommandText = @"INSERT INTO [Customers$] ([CustomerID], [FirstName], [LastName], [CreatedDate]) VALUES (?, ?, ?, ?)";
    insertCommand.Parameters.Add("CustomerID", OleDbType.Numeric, 0, "CustomerID");
    insertCommand.Parameters.Add("FirstName", OleDbType.VarChar, 0, "FirstName");
    insertCommand.Parameters.Add("LastName", OleDbType.VarChar, 0, "LastName");
    insertCommand.Parameters.Add("CreatedDate", OleDbType.Date, 0, "CreatedDate");

    DataSet dataSetObj = new DataSet();
    dataSetObj.Tables.Add(dataTableObj);

    OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
    dataAdapter.InsertCommand = insertCommand;
    dataAdapter.Update(dataSetObj, "Customers$");
}

Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.Charset = "";
Response.AddHeader("Content-Disposition", "attachment; filename=Customers.xlsx");
Response.WriteFile(tempFileName);
Response.Flush();
Response.End();

1
当你说“正在获取数据”时,你确定获取的不是一个空数据集吗? - abiessu
你在服务器上检查过IIS中的MIME类型配置了吗? - Donal
1
我想进一步支持@abiessu的评论,并对文件进行简单操作,例如添加一些文本以确保您实际上处于正确的输出文件中。 - Bmo
@abiessu - 是的,数据集中大约有20K条记录。 - addy2601
你使用什么流程来验证测试服务器是否正在检索约20K条记录?我没有看到任何打印或调试语句来显示这些信息... - abiessu
显示剩余3条评论
1个回答

5
最终问题解决了!!!
创建大型XLSX文件(大于~1MB)时,OLEDB提供程序会尝试在Local Settings\Temporary Internet Files\Content.MSO\路径下为APP POOL帐户创建临时文件。如果该文件夹不存在或APP POOL帐户没有适当的权限,则它会失败而不会抛出错误(不知道为什么不会抛出错误)。
在我的情况下,C:\Documents and Settings\Default User\Local Settings\Temporary Internet Files路径下缺少Content.MSO文件夹。
我创建了这个文件夹并给NETWORK SERVICES赋予修改权限.....然后 "Voila!" - 一切都开始工作了。
感谢以下两个链接,它们节省了我好几天的时间...:) Microsoft ACE OLEDB连接在有166,110行时创建空Excel http://www.rapidsnail.com/developer/topic/2011/109/2/65194/excel-writes-secret-use-oledb-write-data-to-excel-more-than-13571-line-file-for-blank.aspx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接