Asp.net でローカル Excel テーブルを作成し、サーバーから展開するのは簡単ですが、埋め込まれた Excel.exe プロセスを削除するのは困難です。したがって、Excel.exe プロセスに関連するものがまだメモリ内にあるかどうかを確認するためにタスク マネージャーを開かないでください。ここでは 2 つの方法を提供する解決策を提供します。
「CreateExcelWorkbook」 (Excel ワークブックの作成方法を説明します) このメソッドはストアド プロシージャを実行し、DataReader を返し、DataReader に基づいて Excel ワークブックを生成し、それをファイル システムに保存し、「ダウンロード」接続を作成します。 Excel をダウンロードできます。テーブルはブラウザにインポートすることも、マシンに直接ダウンロードすることもできます。
2 番目のメソッド GenerateCSVReport は、ファイルを CSV 形式で保存する点を除いて、基本的に同じことを行います。 CSV コードは引き続き Excel にインポートされ、開発中の一般的な問題を解決できます。列に複数のゼロが入力されていますが、CSV コードはゼロが空でないことを確認できます。 (説明:Excelのテーブルに複数のゼロ値が保存できない問題です)
ダウンロード可能なソリューションには、ストアド プロシージャを実行して DataReader を返す有効なクラス「SPGen」と、特定の時間値より古いファイルを削除する削除メソッドが含まれています。以下に表示される主なメソッドは CreateExcelWorkbook です
注: このページを実行するときは、WebSever サーバーのファイル システムに Excel および Csv ファイルを書き込むために管理者権限が必要になる場合があることに注意してください。この問題に対処する最も簡単な方法は、ページを独自のフォルダーで実行し、独自の構成ファイルを含めることです。そして、次の要素 <identity impersonate ="true" ... を構成ファイルに追加します。ページを実行する ID に書き込みアクセス権を与えるためにのみ、物理フォルダーのアクセス制御リスト (ACL) への書き込みアクセス権が必要です。最後に、Excel 9.0 または Excel 10 タイプ ライブラリへの COM 接続を設定する必要があります。 、VS.NET アセンブリが生成されます。 Microsoft の Office Web サイトには、Microsoft の初期アセンブリをダウンロードするためのリンクがあると思います。 (正確ではないかもしれませんが、.net 用のアセンブリであると理解しています)
<identity impersonate="true" userName="管理者ユーザー" パスワード="管理者パス" />
Excel オブジェクトをクリアする次のコード ブロックに特に注意してください。
// すべての参照をクリーンアップして消去するには、次のすべてのコードが必要です。
oWB.Close(null,null,null);
oXL.Workbooks.Close();
oXL.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oSheet=null;
oWB=null;
oXL = null;
GC.Collect(); // 最終クリーンアップを強制します!
oSheet"、"oWb"、'oRng"、およびその他のオブジェクトも COM のインスタンスであるため、これが必要です。
それらを .NETprivate void CreateExcelWorkbook(string spName, SqlParameter[] parms)
から削除するには、Marshal クラスの ReleaseComObject メソッドが
必要です。)
{
文字列 strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // 古いファイルをクリーンアップするユーティリティ メソッド
Excel.アプリケーション oXL;
Excel._ワークブック oWB;
Excel._Worksheet oSheet;
Excel.Range を
試してください
。
{
GC.Collect();// うろうろしている他の Excel 野郎を一掃します...
oXL = 新しい Excel.Application();
oXL.Visible = false;
// 新しいワークブックを取得します。
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
// データ
文字列を取得します strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = 新しい SPGen(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// ヘッダーとシートを作成...
int iRow =2;
for(int j=0;j<myReader.FieldCount;j++)
{
oSheet.Cells[1, j+1] = myReader.GetName(j).ToString();
}
// シートのコンテンツを構築します
while (myReader.Read())
{
for(int k=0;k < myReader.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
}
iRow++;
}//途中で終了
myReader.Close();
myReader=null;
// A1:Z1 を太字、垂直方向の配置 = 中央にフォーマットします。
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//列 A:Z を自動調整します。
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Visible = false;
oXL.UserControl = false;
string strFile ="レポート" + System.DateTime.Now.Ticks.ToString() +".xls";
oWB.SaveAs( strCurrentDir + strFile,Excel.XlFileFormat.xlWorkbookNormal,
null,null,false,false,Excel.XlSaveAsAccessMode.xlShared,false,false,null,null,null);
// すべての参照をクリーンアップして消去するには、次のすべてのコードが必要です。
oWB.Close(null,null,null);
oXL.Workbooks.Close();
oXL.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oSheet=null;
oWB=null;
oXL = null;
GC.Collect(); // 最終クリーンアップを強制します!
string strMachineName = Request.ServerVariables["SERVER_NAME"];
errLabel.Text="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">レポートのダウンロード</a>"
}
catch(例外 theException)
{
文字列エラーメッセージ;
errorMessage = "エラー: ";
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Line: " );
errorMessage = String.Concat( errorMessage, theException.Source );
errLabel.Text= エラーメッセージ;
}
}
以下は元の記事ですCreate
Dynamic ASP.NET Excel Workbooks In C#
by Peter A. Bromberg, Ph.D.
プリンター対応バージョン
ダウンロード可能なソリューションには、保存された実行を処理するユーティリティ クラス「SPGen」もあります
。ASP.NET では、Web サーバーからネイティブ Excel スプレッドシートを生成することはそれほど難しくありません。難しいのは、Excel.exe のインスタンスを削除することです。 TaskMgr を開くと、EXCEL.EXE の 123 個のインスタンスがまだメモリ内に残っていることがわかります。ここでは、DataReader を返し、ネイティブ Excel ワークブックを組み立てるストアド プロシージャを実行する「CreateExcelWorkbook」という 2 つのメソッドを備えたソリューションを提供します。これをファイル システムに保存し、「ダウンロード」リンクを作成して、ユーザーがブラウザの Excel にレポートをロードするか、XLS ファイルをダウンロードできるようにします。2 番目のメソッドである GenerateCSVReport は、基本的に同じことを行いますが、CSV を作成します。もちろん、このファイルは Excel にも読み込まれます。CSV コードは、先頭にゼロがある列がある場合にそれらが保持されるという開発者にとっての一般的な問題を正しく処理します。
プロシージャと返される DataReaders、および指定された分数より古い XLS または CSV ファイルをクリーンアップする RemoveFiles ユーティリティ メソッドは、以下に示す重要なメソッドです。
注: おそらくこれを実行する必要があることに注意してください。生成された Excel または CSV ファイルを Web サーバーのファイル システムに保存するには書き込み権限が必要なので、管理者権限を持つアカウントでページを作成する必要があります。これを処理する最も簡単な方法は、独自の web.config を含む独自のフォルダーにページを置くことです。 <identity impersonate ="true" ... 要素を挿入します。また、ページを実行する ID に書き込み権限を与えるために、物理フォルダーでも ACL 権限を有効にする必要がある場合があります。 COM は Excel 9.0 または Excel 10 タイプライブラリを参照し、VS.NET に相互運用アセンブリを生成させます。MS の Office サイトには、Office のプライマリ相互運用アセンブリをダウンロードできるリンクもあると思います。
<identity impersonate="true" userName="管理者ユーザー" パスワード="管理者パス" />
特に Excel オブジェクトの「クリーンアップ」を行うコード ブロックに注意してください。
// すべての参照をクリーンアップして消去するには、次のすべてのコードが必要です。
oWB.Close(null,null,null);
oXL.Workbooks.Close();
oXL.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oSheet=null;
oWB=null;
oXL = null;
GC.Collect(); // 最終クリーンアップを強制します!
これが必要なのは、これらの小さなオブジェクト「oSheet」、「oWb」、「oRng」などはすべて COM インスタンスであり、.NET でそれらを削除するには Marshal クラスの InteropServices ReleaseComObject メソッドを使用する必要があるためです
。 CreateExcelWorkbook(string spName, SqlParameter[] parms)
{
文字列 strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // 古いファイルをクリーンアップするユーティリティ メソッド
Excel.アプリケーション oXL;
Excel._ワークブック oWB;
Excel._Worksheet oSheet;
Excel.Range を
試してください
。
{
GC.Collect();// うろうろしている他の Excel 野郎を一掃します...
oXL = 新しい Excel.Application();
oXL.Visible = false;
// 新しいワークブックを取得します。
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
// データ
文字列を取得します strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = 新しい SPGen(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// ヘッダーとシートを作成...
int iRow =2;
for(int j=0;j<myReader.FieldCount;j++)
{
oSheet.Cells[1, j+1] = myReader.GetName(j).ToString();
}
// シートのコンテンツを構築します
while (myReader.Read())
{
for(int k=0;k < myReader.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
}
iRow++;
}//途中で終了
myReader.Close();
myReader=null;
// A1:Z1 を太字、垂直方向の配置 = 中央にフォーマットします。
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//列 A:Z を自動調整します。
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Visible = false;
oXL.UserControl = false;
string strFile ="レポート" + System.DateTime.Now.Ticks.ToString() +".xls";
oWB.SaveAs( strCurrentDir + strFile,Excel.XlFileFormat.xlWorkbookNormal,
null,null,false,false,Excel.XlSaveAsAccessMode.xlShared,false,false,null,null,null);
// すべての参照をクリーンアップして消去するには、次のすべてのコードが必要です。
oWB.Close(null,null,null);
oXL.Workbooks.Close();
oXL.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oSheet=null;
oWB=null;
oXL = null;
GC.Collect(); // 最終クリーンアップを強制します!
string strMachineName = Request.ServerVariables["SERVER_NAME"];
errLabel.Text="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">レポートのダウンロード</a>"
}
catch(例外 theException)
{
文字列エラーメッセージ;
errorMessage = "エラー: ";
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Line: " );
errorMessage = String.Concat( errorMessage, theException.Source );
errLabel.Text= エラーメッセージ;
}
}
-急いで翻訳したので、間違いがある場合はご容赦ください。アドバイスと議論を歓迎します---Xiao Xu
http://macroxu-1982.cnblogs.com/archive/2006/05/31/413879.html