asp.Netエクスポートexcel問題およびサーバの導入dcomコンポーネント構成

13154 ワード

一、サーバーにofficeがインストールされていない
MSを使うなら、この問題はほとんど考えなくても、インストールしてこそ解決できるので、他に方法はありません.(牛人が出てきても、自分に迷惑をかけていると思います)
しかし、私はサーバーに2003の簡略版をインストールしただけで、私は2007を開発しました.
二、「80800005異常」
「80800005異常」は、COMコンポーネントに対するアプリケーションの操作権限が不足しているためです.次に、次の操作を行います.
1)コントロールパネル->管理ツール->コンポーネントサービス->コンピュータ->マイコンピュータ->DCOM->Microsoft Excelアプリケーション
2)[プロパティ]をクリックして、アプリケーションの[プロパティ]ダイアログボックスを開きます.
3)「ID」タブをクリックし、「インタラクティブユーザー」を選択します.
4)「デフォルトのセキュリティ」タブをクリックします.現在のサーバとASPを設定.NET関連ユーザーのアクセス権.
5)「≪起動権限|Start Privileges|emdw≫」の「≪デフォルトの編集|Edit Defaults|emdw≫」をクリックします.ASPを設定する.NET関連ユーザーのアクセス権.
6)主にnetworkサービスアカウント
三、COM類工場におけるCLSIDのコンポーネントの検索に失敗した80070005
前の方法と差が少ない具体的な構成方法は以下の通りです.
1:officeのExcelソフトウェアをサーバにインストールする.
2:「開始」->「実行」にdcomcnfgを入力.exe「コンポーネントサービス」の起動
3:「コンポーネントサービス」→「コンピュータ」→「マイコンピュータ」→「DCOM構成」の順にダブルクリック
4:「DCOM構成」で「Microsoft Excelアプリケーション」を見つけ、その上で右クリックして「プロパティ」をクリックし、「Microsoft Excelアプリケーションプロパティ」ダイアログ・ボックスをポップアップする
5:「ID」タブをクリックし、「インタラクティブユーザー」を選択
6:「セキュリティ」タブをクリックし、「起動とアクティブ化権限」で「カスタム」をクリックし、対応する「編集」ボタンをクリックし、ポップアップの「セキュリティ」ダイアログボックスに「NETWORK SERVICE」ユーザー(本コンピュータ名の選択に注意)を記入し、「ローカル起動」と「ローカルアクティブ化」の権限を与える.
7:依然として「セキュリティ」タブで、「アクセス権限」で「カスタム」をクリックし、「編集」をクリックし、ポップアップの「セキュリティ」ダイアログボックスに「NETWORK SERVICE」ユーザーを追加し、「ローカルアクセス」権限を付与.
  8.インタラクティブユーザ設定後にエラー8000401 aが発生した場合、インタラクティブユーザをキャンセルしてadministratrとして指定すると、この問題を一時的に解決できます.さらなる解決策はまだ検討されている. 
 
また、OFFICEを呼び出す操作は他のシステムリソースにかかわる可能性があり、依然として権限が足りないため問題になる可能性があります.EXCELアプリケーションを設定するだけで、800700005のエラーを報告する可能性があります.最も安全なのはdcomcnfgで私のパソコンを選択し、右ボタンのプロパティ->comを安全にし、中のアクセス権限を起動とアクティブ化の権限はすべてデフォルトを編集し、その中にnetwork service(iis 5.0の場合、asp.netユーザーを追加します)を加え、先にnetworkserviceに同じ権限を設定すると、基本的に問題が起こらないことが保証されます.
 
四、「異常はHRESULT:0 x 800 A 03 ECから」の原因
どちらの場合も、1、Excelの行列は1から始まります.もし私たちが習慣的にworksheetにあげたら.Cells[0,0]またはworksheet.Cells[1,0]またはworksheet.Cells[0,1]に値を付けると、この異常が発生します.
2、ここは間違いやすい
  “excel.ActiveWorkbook.SaveAs(FilePath + filename, Excel.XlFileFormat.xlExcel7, null, null, false, false, Excel.XlSaveAsAccessMode.xlNoChange, null, null, null, null, null);”
上のコードを保存する時、フォーマットはとても重要で、各バージョンの値はすべて異なっていて、最初私は2007の上で2003バージョンに保存して得たのは56(つまりxlExcel 8)で、しかし本当にコードの中で39(つまりxlExcel 7)です
キーコードのエクスポートとダウンロード!(WebExcel.ashx.cs)
private void NAR(object o)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                o = null;
            }
        }

        public void ExportExcel(HttpContext context, DataSet ds, string DownloadFilePath)
        {


            object objOpt = Missing.Value;
            Application excel = new Application();
            excel.Visible = false;
            excel.DisplayAlerts = false;            
            Workbook   wkb = excel.Workbooks.Add(objOpt);
            Worksheet wks = (Worksheet)wkb.ActiveSheet;

            wks.Visible = XlSheetVisibility.xlSheetVisible;
            

            int rowIndex = 1;
            int colIndex = 0;

            // DataTable table = ds.Tables[0];
            foreach (DataColumn col in ds.Tables[0].Columns)
            {
                colIndex++;
                excel.Cells[1, colIndex] = col.ColumnName;
            }

            foreach (DataRow row in ds.Tables[0].Rows)
            {
                rowIndex++;
                colIndex = 0;
                foreach (DataColumn col in ds.Tables[0].Columns)
                {
                    colIndex++;
                    excel.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();
                }
            }
            //excel.Sheets[0] = "sss";


            wkb.SaveAs(DownloadFilePath, Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel7, null, null, false, false, XlSaveAsAccessMode.xlNoChange, null, null, null, null, null);
            NAR(wks);
            wkb.Close(false, objOpt, objOpt);
            NAR(wkb);            
            excel.Quit();
            NAR(excel);
            

            if (File.Exists(DownloadFilePath))
            {

                
                using (FileStream fs = new FileStream(DownloadFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    const int size = 4096;
                    byte[] buffer = new byte[size];
                    int pos = 0;
                    long dataToRead = fs.Length;
                    long arrange = 0;
                    if (context.Request.Headers["Range"] != null)
                    {
                        context.Response.StatusCode = 206;
                        arrange = long.Parse(context.Request.Headers["Range"].Replace("bytes=", "").Replace("-", ""));
                    }
                    if (arrange != 0)
                    {
                        context.Response.AddHeader("Content-Range", "bytes " + arrange.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString());
                    }
                    context.Response.AddHeader("Content-Length", ((long)(dataToRead - arrange)).ToString());
                    //context.Response.ContentType = "application/octet-stream";
                    context.Response.ContentType = "application/ms-excel";
                    context.Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(System.Text.Encoding.GetEncoding(65001).GetBytes(Path.GetFileName(DownloadFilePath))));

                    fs.Position = arrange;
                    dataToRead = dataToRead - arrange;

                    while (dataToRead > 0)
                    {
                        if (context.Response.IsClientConnected)
                        {
                            pos = fs.Read(buffer, 0, size);

                            context.Response.OutputStream.Write(buffer, 0, pos);
                            context.Response.Flush();

                            dataToRead = dataToRead - pos;
                        }
                        else
                        {
                            dataToRead = -1;
                        }
                    }
                }
            }

        }