DevTrain Startseite Visual Studio 1 Magazin  
  
  
SUCHEN:  
ARTIKEL ONLINE: 525   

Kategorien
.NET
Datenbanken
Web
XML

Allgemein
Camp
Foren
Events
Persönliche Einstellungen
Registrieren
Prämien Shop
Kontakt
Impressum
Über DevTrain

Autoren



 

Forum: ASP.NET | Thema: Starten einer Excel-Applikation von ASP.Net aus | Von: G. Guest ( 29.10.2003 14:44)

Hallo Leute !

Habe hier eine hoch interessante Sache für Tobi.

(Bitte den gesamten Text mit Ctrl-A markieren und in einen Editor kopieren, damit es leichter lesbar wird)

wir möchten von asp.net aus eine excel-applikation starten - es wird ein Macro im Excelfile gestartet und Parameter (eine Hashtable) an dieses Makro übergeben.
Der Excelfile erstellt dann einen 'Excelbericht'.

(der gesamte code ist unten angeführt).

Beim Statement

xlApp.GetType().InvokeMember( "Visible", BindingFlags.SetProperty, null, xlApp, args );

bekommen wir eine System.Reflection.TargetInvocationException.

Wir vermuten, daß es mit den Rechten für das Setzen von Properties einer DCom-Applikation zu tun hat.
ASP.Net läuft unter dem user ASPNET und der hat einfach die Rechte nicht dazu. Wenn ich mit dem Tool 'dcomcnfg'
die Rechte für 'Microsoft Access Application'-Properties-Tab Security dem ASPNet-User volle Rechte gebe,
genügt das anscheinend nicht.

Übrigens muß im 'dcomcnfg'-Tool der ASPNET-User überall eingetragen sein, damit
das late binding mit Activator.CreateInstance funktioniert - sonst gibt es eine 'Access is Denied'-Exception.

Außerdem funktioniert der gleiche Code von einer Windows-Forms-Application aus.

Nachdem die Exception geworfen wurde, bleibt ein Excel-Prozeß in der Prozessliste, der aber über Task Manager
nur eliminiert werden kann, wenn ich mich mit dem ASPNET-User einlogge - dh. der User ASPNet muß der Eigentümer
dieses Prozesses sein.

Sonstige Zusatzinfos:

- Asp-Applikation verwendet keine Authentication-Methode
- Asp-Applikation wurde mit meinem lokalen User erstellt
- Betriebssystem: Windows 2000
- Excelversion: Excel 2000 (aus Office 2000)
- IIS-Version 5.0
- .Net Framework 1.0

Vielleicht hat jemand von euch eine Idee, welche Security-Settings noch nicht eingestelt sind.


Hier noch der Code im Detail:

sing System;
using System.Collections;
using System.ComponentModel;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data;
using System.Reflection;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Globalization;

private void Button1_Click(object sender, System.EventArgs e)
{
Type xlType =null;
object xlApp = null;
object xlWorkbooks=null;

System.Threading.Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.CreateSpecificCulture("en-US");

try
{
Hashtable htParams = new Hashtable();

// usually it is necessary - do not remove or there could be an automation error
System.Threading.Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.CreateSpecificCulture("en-US");

// late binding
object [] args;
#region Get Excel object
xlType = Type.GetTypeFromProgID("Excel.Application");
xlApp = Activator.CreateInstance( xlType );
#endregion

#region Get Excel Workbooks collection
xlWorkbooks = xlApp.GetType().InvokeMember( "Workbooks",
BindingFlags.GetProperty, null, xlApp, null );
#endregion

#region make excel invisible and do not display alerts
args = new Object[1];
args[0] = false;
xlApp.GetType().InvokeMember( "Visible", BindingFlags.SetProperty,
null, xlApp, args );
args[0]=false;
xlApp.GetType().InvokeMember( "DisplayAlerts", BindingFlags.SetProperty,
null, xlApp, args );
#endregion

#region Open report template file
// open report template file in this excel instance
args = new Object[13];
// args[0] = this.reportConfig.Template; // file to open
args[0] = "c:\\temp\\template.xls"; // file to open
args[1] = Missing.Value;
args[2] = true; // readonly
for (int i =3;i<args.Length;i++) { args[i] = Missing.Value;}
xlWorkbooks.GetType().InvokeMember("Open",
BindingFlags.InvokeMethod, null, xlWorkbooks, args);
#endregion

#region Call a macro to start up report generation

// call a macro to start the report generation with a hashtable as parameter
args = new Object[30];

htParams.Add("Param1", "Wert1");
htParams.Add("Param2", "Wert2");

// macroname
args[0] = "vaiReportGeneral.SetupAndStart";

// parameters
args[1] = this;
args[2] = htParams;

for (int i =3 ; i<30 ; i++) { args[i] = Missing.Value;}

xlApp.GetType().InvokeMember("Run",
BindingFlags.InvokeMethod, null, xlApp, args);
// xlApp.GetType().InvokeMember("Quit",
// BindingFlags.InvokeMethod,null,xlApp,null);

Page.Response.Write("Report finished");
}
catch (Exception ex)
{
Page.Response.Write(ex.ToString());
}
#endregion
finally
{
// cleanup
Marshal.ReleaseComObject(xlWorkbooks );
Marshal.ReleaseComObject( xlApp );

xlWorkbooks = null;
xlApp = null;
xlType = null;
}
}






Antworten
Vorsicht bei der Eingabe: Die Zeichen ' oder -- sind nicht erlaubt!

 Betreff:
 Nachricht: Den Beitrag finden Sie nun unter: http://beta.devtrain.de/foren Die Benutzerdaten und Foreninhalte von beta.devtrain.de und www.devtrain.de sind die selben.
Sie können sich dort sogar per RSS über neue Inhalte informieren lassen.
Bei Problemen bitte direkt Mail an asp [AT] ppedv.de.

 Signatur:

  



Login
Username:


Passwort:






Passwort vergessen?

Advanced Developers Conference vom 14.-15. Februar 2011

© Copyright 2003 ppedv AG