2

asp プロジェクト (C#) に問題があります。

次のエラーがあります: CLSID {00024500-0000-0000-C000-000000000046} を持つコンポーネントの COM クラス ファクトリを取得すると、次のエラーが原因で失敗しました:サーバーから Excel ファイルを生成しようとすると、80040154 がスローされます。私はすでにそれに関するいくつかの投稿を見てきましたが、それらが私に当てはまるかどうか、または私の問題を解決できるかどうかはわかりません. 私のコードを示して説明しましょう。

using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;

private Excel.Application oXL;
private Excel._Workbook oWB;
private ExcelFile f;

protected void bExcel_Click(object sender, EventArgs e)
{
    if (Session["mode"] == null)
    Response.Redirect(accueil);

    // Set the values
    oXL = new Excel.Application();
    oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value));
    f = new ExcelFile((Excel._Worksheet)oWB.ActiveSheet);

    oXL.Visible = true;

    /* displaying data from a gridview, non revelant here (?) */

    oXL.Visible = true;


    f = null;
    oXL = null;
    oWB = null;

}

エラーの説明 (225 行目) :

Erreur source: 

Ligne 224 : // Set the values
Ligne 225 : oXL = new Excel.Application();
Ligne 226 : oWB = (Excel._Workbook) oXL.Workbooks.Add(Missing.Value));
Ligne 227 : f = new ExcelFile((Excel._Worksheet)oWB.ActiveSheet);

さて、サーバーからExcelファイルを生成しようとするとこの問題が発生しますが、ローカルバージョンでデバッグモードを実行すると発生しません(コードは機能します)。私の会社のすべてのワークステーションには、コンピューターに MS Office Excel がインストールされていますが、使用しているサーバーにはインストールされていません。私の質問は、サーバーに Excell をインストールする必要がないことによる解決策はありますか?

サーバーは私のサービスからのものではないため、サーバーにExcelをインストールすることは避けようとしています. サーバー上のアセンブリ フォルダーにライブラリをコピーしようとしました (すべてのワークステーションが同じであるため、参照は機能するはずです ?) が、サーバーからライブラリへのアクセスを許可するために与えなければならなかったアクセス許可が見つかりませんでした (私はそれを悪く説明しているわけではありません)。

前もって感謝します、

EDIT:私が理解していないことがあります.それは、すでに書かれている前のコードでは、Excelアプリケーションは次のように起動できるということです:

Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "attachment;filename=registrationData.xls");

// Pour les caractères spéciaux (é, à, etc...)
Response.ContentEncoding = System.Text.Encoding.Unicode;
Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble());

using (StringWriter sw = new StringWriter())
using (HtmlTextWriter htw = new HtmlTextWriter(sw))
{
    Table table = new Table();
    TableRow tRow = new TableRow();

    /* Adding each information of the grid using tRow.Cells.Add() */

    table.RenderControl(htw);
//  Response needs the Htmlwriter
    HttpContext.Current.Response.Write(sw.ToString());
    HttpContext.Current.Response.End();
}

そして、これは Excel がインストールされていなくても機能していました。なぜなら (よくわかりませんが)、Excel アプリケーションを呼び出すだけで、バッファ (StringWriter) でいっぱいになったからです。しかし、テーブルを使用するのは退屈であり、相互運用機能を使用してファイルを既に作成しているため、テーブルを使用したくありません... サーバーにインストールされているアセンブリを使用するために与える権限を見つけることができれば、すべての作業ステーションがExcel があれば、このコードで使用する方法で使用できるはずです。

4

2 に答える 2

4

相互運用性は、MS によるサーバー シナリオではサポートされていません

サーバーに相互運用/Excel をインストールせずに、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など。

于 2013-01-04T16:12:22.077 に答える
0

私のインターンシップは今週終了するので (ええ、このようなものを見つけるには少し遅れます)、今は新しいことに取り組むことができません。手遅れなので、変更を元に戻し、Excel ファイルを作成する以前のプロセスを使用します (私は改善しましたが)。

この問題を修正する方法は、サーバーから Interop アセンブリを使用してユーザーの Excel プログラムを呼び出す権限を与えることだと思いますが、権限を設定できませんでした (機能しませんでした。理由はわかりません)。遅くなりました。メンテナンスを行い、プロジェクトの継続性を確保します。

答えてくれてありがとう。

于 2013-01-07T15:13:30.280 に答える