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 の一部の設定を変更して、大量のデータのエクスポートを有効にする必要がありますか?
迅速なご対応ありがとうございます
――シャラブ・グプタ