0

我正在使用 Excel 2007 和 OLE-DB 提供程序来生成 .xlsx 文件。这些文件有 2 张,第 1 张包含图表,第 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-Interop 生成图表,然后关闭工作簿。随后将启动一个新的工作流程,该工作流程打开同一个 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=是;IMEX=0\""))

扩展属性=\"Excel 12.0 ;HDR=Yes;IMEX=0\""))

没有运气。


你能帮我解决这个问题吗?我是否需要更改服务器上 Excel 2007 的某些设置才能启用大数据导出。

感谢您的快速帮助

——沙拉布·古普塔

4

2 回答 2

2

重要提示MS 在服务器场景(如 ASP.NET 或类似)中不支持互操作(用于代码中的第一个工作表) 。

有许多选项可以在没有 Interop 的情况下读取/编辑/创建 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 , LibXLFlexcel等。

于 2012-04-20T08:53:20.160 回答
0

对于超过 6k 条记录,我面临同样的问题,

更改.xlsx.xls对我有用。

于 2017-11-24T06:34:31.593 回答