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 に適切に書き込みますが、ファイルが Web ページにバッファリングされると、巨大なレコードを含むデータシートは存在しません。

ファイルが Web ページにバッファリングされるコードは次のとおりです。

   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=はい;IMEX=0\""))

運がなければ。


この問題について教えてください。サーバー上の Excel 2007 の一部の設定を変更して、大量のデータのエクスポートを有効にする必要がありますか?

迅速なご対応ありがとうございます

――シャラブ・グプタ

4

2 に答える 2

2

重要: Interop (コードの最初のワークシートに使用) は、サーバー シナリオ (ASP.NET など) では MS によってサポートされていません

相互運用なしで 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 (XLSX だけでなく XLS など) の処理、レンダリング、PDF の作成、数式などが必要な場合は、ClosedXML (無料、XLSX のみ)、EPPlus (無料、XLSX のみ)などのさまざまな無料および商用ライブラリがあります。 、Aspose.CellsSpreadsheetGearLibXLFlexcelなど。

于 2012-04-20T08:53:20.160 に答える