.XLSX 文件未与具有超过 8K 记录的工作表一起生成
本文关键字:工作 记录 一起 8K 文件 XLSX | 更新日期: 2023-09-27 18:31:49
我正在使用Excel 2007和OLE-DB提供程序生成.xlsx文件。该文件有 2 张纸,第一张包含图形的一张,第二张包含数据。
我使用以下连接字符串来生成 excel:
using (OleDbConnection conn = new OleDbConnection ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:''Test.xlsx;Extended Properties='"Excel 12.0 XML;HDR=Yes;IMEX=0'""))
使用 Excel 互操作生成图形,然后关闭工作簿。然后启动一个新的工作流,打开相同的 Excel 文件并插入数据。
守则是这样的。
using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strFilename + ";Extended Properties='"Excel 12.0 XML;HDR=Yes;IMEX=0'""))
{
clsCommon.LogMessages("Excel Connection opening");
conn.Open();
clsCommon.LogMessages("Connection opened.");
using (OleDbCommand cmd_createTable = new OleDbCommand("CREATE TABLE [" + SheetName + "](" + sb.ToString() + ")", conn))
{
cmd_createTable.ExecuteNonQuery();
//cmd_createTable.CommandTimeout = 14000;
}
clsCommon.LogMessages("Excel Sheet Created.");
//write the data
List<string> lstRowData = new List<string>();
string rowdata = string.Empty;
foreach (DataRow row in dt.Rows)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
if (row[i].ToString().Contains("'"))
{
rowdata = rowdata + "'" + row[i].ToString().Replace("'", "''") + "',";
}
else
{
rowdata = rowdata + "'" + row[i].ToString() + "',";
}
}
rowdata = rowdata.Remove(rowdata.Length - 1, 1);
lstRowData.Add(rowdata);
rowdata = string.Empty;
}
#region Creating Single Command to execute multiple statements.
using (OleDbCommand cmd_Insert = new OleDbCommand())
{
clsCommon.LogMessages("Data Rows for Sheet:" + SheetName + ", is: " + lstRowData.Count.ToString());
cmd_Insert.Connection = conn;
cmd_Insert.CommandTimeout = 14000;
foreach (string item in lstRowData)
{
cmd_Insert.CommandText = "Insert into [" + SheetName + "$] values(" + item + ")";
cmd_Insert.ExecuteNonQuery();
}
cmd_Insert.Dispose();
}
#endregion
conn.Close();
conn.Dispose();
}
问题是,excel在具有较少数据量的工作表中正确生成。
对于数据大于 8k(大约)的工作表,上述代码行将数据正确地写入 excel,但是当文件缓冲到网页时,不存在具有大量记录的数据表。
将文件缓冲到网页的代码如下所示:
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.BufferOutput = true;
Response.ContentType = "application/vnd.ms-excel";
Response.AppendHeader("Content-Disposition", string.Format("attachment; filename={0}", Path.GetFileName(newFilePath)));
Response.WriteFile(newFilePath);
if (Response.IsClientConnected)
{
Response.Flush();
}
try
{
Response.Close();
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
catch
{
// Eat Exception
}
奇怪的事实:
相同的代码在我的本地开发环境中运行良好,并且所有工作表都已正确填充。我的机器和服务器上也安装了Excel 2007。我已经使用 DCOM 配置管理器(在组件服务下)检查了服务器上的权限,它们看起来是正确的。
尝试的解决方法
- 1) 更改了连接字符串
从
扩展属性=''"Excel 12.0 XML;HDR=Yes;IMEX=0''"))
自
扩展属性=''"Excel 12.0 ;HDR=Yes;IMEX=0''"))
没有运气。
你能帮我解决这个问题吗?是否需要在服务器上更改 Excel 2007 的某些设置才能启用大型数据导出。
感谢您的快速帮助
--沙拉布·古普塔
重要说明:MS 不支持互操作(用于代码中的第一个工作表)在服务器方案(如 ASP.NET 或类似方案)中。
有许多选项可以在没有互操作的情况下读取/编辑/创建 Excel 文件:
MS 提供免费的 OpenXML SDK V 2.0 - 请参阅 http://msdn.microsoft.com/en-us/library/bb448854%28office.14%29.aspx(仅限 XLSX)
这可以读取+写入MS Office文件(包括Excel)。
另一个免费选项请参阅 http://www.codeproject.com/KB/office/OpenXML.aspx(仅限 XLSX)
如果你需要更多像处理旧的Excel版本(如XLS,不仅是XLSX),渲染,创建PDF,公式等,那么有不同的免费和商业库,如ClosedXML(免费,仅限XLSX),EPPlus(免费,仅限XLSX),Aspose.Cells,SpreadsheetGear,LibXL和Flexcel等。
我在超过 6k 条记录中遇到了同样的问题,
将.xlsx
更改为.xls
对我有用。