2

この質問は何度も聞かれましたが、まだ適切な解決策を見つけることができません。2 つの質問があります。

私はExcelファイルを作成し、それにデータを書き込んでから、ダウンロード用にユーザーにレンダリングしています。同じために microsoft.interop を使用しました。

最初の問題は次のとおりです。ユーザーがExcelをダウンロードした後、メッセージボックス(javascript)を使用してExcelファイルに生成された行数を表示しようとしています。このメッセージボックスは表示されませんが、コードは実行されます。どうすればこれを達成できますか?

次に、Excel が作成された後、参照を手動でクリーンアップした後でも、タスク マネージャーで Excel.exe プロセスが実行され続けます。

この警告ボックスは、ファイルがレンダリングされた後は表示されません。

flag = WriteDatasetToExcel(ds);
            if (flag)
            {

                ClientScript.RegisterClientScriptBlock(GetType(), "Javascript", "<script>alert('Number of rows generated : " + ds.Tables[0].Rows.Count + "')</script>");
            }

関連するコードが与えられます

excelApp = new Excel.Application();
        excelwrkbook = excelApp.Workbooks.Add(1);
        excelwrksheet = (Excel.Worksheet)excelwrkbook.Sheets[1];
        excelwrksheet.Name = "Application Data";

データの書き込み後、保存とレンダリングは次のように行われます。

excelwrkbook.SaveAs(filepath, Excel.XlFileFormat.xlWorkbookNormal, Missing.Value, Missing.Value, false, true, Excel.XlSaveAsAccessMode.xlNoChange, Excel.XlSaveConflictResolution.xlLocalSessionChanges, false, Missing.Value, Missing.Value, true);
        excelwrkbook.Close(0, 0, 0);
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.Buffer = true;
        HttpContext.Current.Response.Charset = "";
        HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + filename);
        HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
        HttpContext.Current.Response.WriteFile(filepath);
        excelApp.Quit();
        flag = true;

そして最後にクリーンアップコード:

ReleaseObjects(excelrange);
        ReleaseObjects(excelwrksheet);
        ReleaseObjects(excelwrkbook);
        ReleaseObjects(excelApp);

releaseobjects 関数は次のとおりです。

private void ReleaseObjects(Object obj)
{
    if (obj != null && Marshal.IsComObject(obj))
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) != 0) { }

    }
}
4

1 に答える 1

1

まず最初に、Microsoft Excel の相互運用性を備えた Web ベースの環境での作業はあまり効率的ではないことをお伝えします。

私は通常、このニーズに対して openXML アプローチを使用します。ここ

最初の質問: 応答のコンテンツ タイプは application/vnd.ms-excel であるため、ブラウザーはこのコンテンツから Java スクリプトを実行しません。Excel がダウンロードされたことを確認するか、事前に呼び出して行を取得し、結果を Java スクリプトまたはその他の許容可能なコンテンツ タイプで返す必要があります。

2 番目の質問については、設計されていない Web 環境には使用しないでください。

于 2012-10-22T07:28:58.903 に答える