Problem mit process.start



  • haha was mir jetzt einfiel habe ja Excel hier bei mir am start

    Excel kann man ja doppel und dreifach vierfach aufmachen
    es tummeln sich dan mehrer Excel-Tasks daran kann es auch liegen

    Eine Excel hat Deine Datei
    Du klickst wie wild auf Excel und die eine Excel-Instanz regt sich dann
    auf das noch andere Excel-Brüder/Schwestern/Verwandte/Erbschleicher auftauchen
    die auch anspruch auf diese Dateien erheben! Wobei mir unbekannt ist ob Excel vor der Öffnung immer eine Kopie macht. Ich bin ja schliesslich kein Excel-Entwickler.

    Du musst also vorher abchecken durch Code ob schon Excel läuft und ob das Excelinstanzen sind die schon Datei nutzen die in deiner Liste sind!

    Lösungsmöglichkeit Office-Automation auch bekannt unter Interoperabolität.
    Der Namensraum System.Diagnostics sollte hier auch wieder brauchbare Sachen dazu beisteuern können!



  • starchild schrieb:

    Es ist eindeutig meine c# Anwendung, die auf das Excelfile zugreift.
    Wen ich beim in Excel erscheinenden Dialog aus "Benachrichtigen" klicke und mien Programm schließe, meldet Excel, das die Datei freigegeben wurde und bietet an, sie zum schreiben zu öffnen.
    Programme installieren ist leider nicht so einfach. (sehr restriktive Richtlinien)

    Kann es sein da Excel auch mit .csv-Dateien arbeiten Tut das Du in Deiner IDE
    jedesmal wenn Du es öffnest auch eine solche Datei mit aufmachst.



  • Wo zeigst Du eigentlich die geordneten Datein in deiner C#-Anwendung an?

    In einer ListBox um sie von da per Klick zu staretn was dann über

    Process.Start läuft.



  • Das Problem folgendermassen aus ..... wenn Du diese Dateien jedesmal wenn Du eine Datei aus der ListBox wählst müsste wenn Du daraufihn im SelectItem-Delegaten
    der Listbox mit den .xls-Files, aufrufst. Innerhalb dieser DelegatenCallbackMethode rufst du dann bestimmt

    Process.Start(SeletedItem.....); immer ein extra Excel-Instanz auf!
    Wenn Du an der Stelle in der ListBox 2mal dieselbe Datei aufmachst,
    Hast Du aus Deiner C#-Anwendung heraus einen Neuen Excel-Nachkommen erstellt
    der auf die gleiche xls-Datei zugreift wie ein Excel-Vorfahre schon zuvor!

    Lösung dafür anders machen per Automation/Interoperabilität:
    Eine Excel-Instanz wird hierbei von deiner C# anwendung kontrolliert.
    Aus C# heraus kannst Du dieser einen Excel-Marionette sagen öffne diese Datei tue das usw.. Du kommst damit vom Process.Start-Ansatz weg, der unter Umstaänden für mehrfaczugriffe auf .xls-Files sorgt.



  • Ich verwende folgenden Code zum auswählen und Starten.
    Umgehe ich testweise die Listbox, indem ich Process.Start direkt einen String übergebe, wird die Datei ohne meckern geöffnet.
    Es liegt also tatsächlich an der Listbox Komponente.
    Gibt es eine Alternative?

    private void Open_Click(object sender, System.EventArgs e) {
      string item = listBox1.Items[listBox1.SelectedIndex].ToString();
    
    string filepath = @filename[int.Parse(item.Substring(10, item.IndexOf(":")-10))-1];
    string excelpath = @PathToExcel.Text;
      Process.Start(excelpath, filepath);
    }
    


  • starchild schrieb:

    Gibt es eine Alternative?

    Die hatte ich in meiner Antwort vor Deiner Antwort ja schon angedeutet!
    Process.Start in Deinem Anwendungskontext weglassen.

    Office-Automation verwwenden genauer Excel-Automation Stichwort Interoperabilität verwenden.

    Deine C#-Anwendung macht damit eine Excel-Instanz zu Ihrer Marionette.
    Ist eine ganz legale Technik die von Microsoft mit Werbung für .NET propagiert wird.

    Damit sagts Du zur marionette lade die Datei mache mit der datei das .....
    usw. und sofort.

    Wie bei Process-Start kannst du darüber eine Excel-Instanz starten
    als auch versuchen eine laufende Excel-Instanz über dein C#-Programm
    zur Marionette zu machen.



  • http://www.codeproject.com/info/search.asp?cats=3&searchkw=Excel+Automation&Submit1=Search&author=&sd=15+Nov+1999&ed=4+Aug+2006

    Selbst der Mozilla-Browser lässt sich fernsteuern, diese Interoperabilität
    ist mein persöhnlicher Kracher/Favorit/C#-Droge/Abhängigkeit. Und ein Argument warum ich mich C#
    abgebe. Naja ich will mal nicht übertreiben sonst kommt noch jemand mit einer weissen Jacke.... *lach*

    Aber ich findes es eine super Sache.



  • Eigendlich hätte ich ja nur die Datei einfach öffnen wollen...
    Aber so werde ich mir das ganze Automatisationszeug nur mal ansehen müssen.
    Danke für die Hilfe!



  • starchild schrieb:

    Eigendlich hätte ich ja nur die Datei einfach öffnen wollen...
    Aber so werde ich mir das ganze Automatisationszeug nur mal ansehen müssen.
    Danke für die Hilfe!

    Was willst Du machen wenn Excel so gestrickt ist und pro ein Process.Start
    eine extra Excel-Instanz/Task aufmacht.

    http://www.mycsharp.de/wbb2/thread.php?threadid=19410



  • hier ich bekomme zwar bei einem direkten using Excel einen Fehler

    "Appliction mehrdeutig"

    aber habe ich umgangen bei meinem .NET 1.1 bekomme ich excel über C# so Excel (als Marionette eines C#-Prog.) an den Start

    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using DasExcel = Excel; // ein using Excel; führt zu einem mehrdeutigen Vereiss bei mir dann eben so
    
    namespace ImagesInAssembly
    {
    	/// <summary>
    	/// Zusammenfassung für Form1.
    	/// </summary>
    	public class Form1 : System.Windows.Forms.Form
    	{
    		/// <summary>
    		/// Erforderliche Designervariable.
    		/// </summary>
    		private System.ComponentModel.Container components = null;
    
    		DasExcel.ApplicationClass excelApp = null;
    		public Form1()
    		{
    			//
    			// Erforderlich für die Windows Form-Designerunterstützung
    			//
    			InitializeComponent();
    
    			//
    			// TODO: Fügen Sie den Konstruktorcode nach dem Aufruf von InitializeComponent hinzu
    			//
    			excelApp = new Excel.ApplicationClass();
    			excelApp.Visible = true;
    
    		}
    

    funktioniert nat. nur wenn Du einen verwies auf ein COM-Assembly in den Projekt bringst

    "Microsoft Excel Object Library 10.0" oder so heisst das

    jo und dann starte dei C#-Applikation und es macht eine Marionette von Excel auf jo es funzt toll



  • funktioniert bei mir beides

    eine schon laufende Excelinstanz zur Marionette machen
    wenn noch kein Excel im System rumkraucht eben eine Marionette selbst aufmachen!

    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Data;
    using DasExcel = Excel;
    
    namespace ImagesInAssembly
    {
    	/// <summary>
    	/// Zusammenfassung für Form1.
    	/// </summary>
    	public class Form1 : System.Windows.Forms.Form
    	{
    		/// <summary>
    		/// Erforderliche Designervariable.
    		/// </summary>
    		private System.ComponentModel.Container components = null;
    
    		private DasExcel.Application excelApp = null;
    		public Form1()
    		{
    			//
    			// Erforderlich für die Windows Form-Designerunterstützung
    			//
    			InitializeComponent();
    
    			//
    			// TODO: Fügen Sie den Konstruktorcode nach dem Aufruf von InitializeComponent hinzu
    			//
    
    			// Versuch eine vielleicht schon laufende Excel-Instanz zur Marionette zu machen
    
    			try
    			{
    				object oApp = Marshal.GetActiveObject("Excel.Application");
    				excelApp = (Excel.Application) oApp;
    			}
    			catch{}
    
    			if(excelApp == null) // kein laufendes Excel gefunden
    			{
    				// Marionette selbst aufmachen
    				excelApp = new Excel.ApplicationClass();
    				excelApp.Visible = true;
    			}
    
    		}
    ..
    


  • // Excel-Interopmarionette
    		// Projekktverweis auf "Microsoft Excel 10.0 Object Library" machen
    		// using-Klausel machen
    		// using DasExcel = Excel;
    		// da man sonst zumindest bei mir Mehrdeutigkeitsverweis bekommt auf 'Application'
    		// ich benutz .NET 1.1
    		private DasExcel.Application excelApp = null;
    		private void ExcelInteropRemote()
    		{
    
    			// Versuch eine vielleicht schon laufende Excel-Instanz zur Marionette zu machen
    			// bedarf Verweis auf Excel-COM-Library und eines using aber nur so bei mir in .NET 1.1
    			// using DasExcel = Excel; // ansonsten wird Application ein mehrdeutiger Verweis
    			try
    			{
    				object oApp = Marshal.GetActiveObject("Excel.Application");
    				excelApp = (Excel.Application) oApp;
    			}
    			catch{}
    
    			if(excelApp == null) // kein laufendes Excel gefunden
    			{
    				// Marionette selbst aufmachen
    				excelApp = new Excel.ApplicationClass();
    				excelApp.Visible = true;
    			}
    		}
    

    barauchst jetzt nurnoch im Load deiner Form oder Ctor
    son Aufruf zu tun

    ExcelInteropRemote();
    


  • eine Xls-File zu öffnen geschied dann über die Methode _Open

    gesetzt dem Fall deine ExcelApplikationsVariable lautet so wie in meier Methode
    in der vorherigen Antwort von mir kommt bei dir
    dann im ListBox-Click so was:

    if(excelApp != null)
    excelApp.Application.Workbooks._Open(listBox.items[listbox1.SelectedIndex].ToString(),.....);
    

    So jetzt will ich aber mal an meinem eigene Kram weiterbasteln



  • Hier das sollte noch aufschlussreicher fuer Dich sein

    // Excel-Interopmarionette
    		// Projekktverweis auf "Microsoft Excel 10.0 Object Library" machen
    		// using-Klausel machen
    		// using DasExcel = Excel;
    		// da man sonst zumindest bei mir Mehrdeutigkeitsverweis bekommt auf 'Application'
    		// ich benutz .NET 1.1
    		DasExcel.Application excelApp = null;
    		private void ExcelInteropRemote()
    		{
    
    			// Versuch eine vielleicht schon laufende Excel-Instanz zur Marionette zu machen
    			// bedarf Verweis auf Excel-COM-Library und eines using aber nur so bei mir in .NET 1.1
    			// using DasExcel = Excel; // ansonsten wird Application ein mehrdeutiger Verweis
    			try
    			{
    				object oApp = Marshal.GetActiveObject("Excel.Application");
    				excelApp = (Excel.Application) oApp;
    				excelApp.Visible = true;
    			}
    			catch
    			{
    				// Marionette selbst aufmachen
    				excelApp = new Excel.ApplicationClass();
    				excelApp.Visible = true;
    			}
    
    		}
    
    		private void button2_Click(object sender, System.EventArgs e)
    		{
    			// "Missing.Value" durch using System.Reflection;
    			if(excelApp != null)
    			{
    				excelApp.Application.Workbooks._Open("c:\\Mappe1.xls", 
    					Missing.Value,
    					Missing.Value,
    					Missing.Value,
    					Missing.Value,
    					Missing.Value,
    					Missing.Value,
    					Missing.Value,
    					Missing.Value,
    					Missing.Value,
    					Missing.Value,
    					Missing.Value,
    					Missing.Value);
    			}
    		}
    
    		private void button1_Click(object sender, System.EventArgs e)
    		{
    			if(excelApp != null)
    				excelApp.Application.Quit();
    
    		}
    

    So jetzt aber wirklich muss an meinem interessanten Kram auch noch vorankommen

    Gruss sclearscreen

    P.S.: Unter den Parametern die ich mit Mising.Value maskiert habe
    sind noch andere z.b. fuer verschlüsselte/Passwortgeschüzte Excel-Dateien.
    Aber das führt jetzt vom 100 in 10000000....
    Und etwas Forschergeist will ich noch übrig lassen



  • Danke für deine Hilfe!
    Starten und Datei laden funktioniert jetzt wunderbar ohne Probleme!
    Ich habe allerdings noch nicht rausgefunden, wie man auf eine Tabelle zugreifen kann um z.b. ein diagramm zu zeichnen.
    Das Einzige was ich gefunden habe sind Beispielprogramme, die Zellen kopieren, aber da komme ich leider nicht weiter 😞



  • hmm Du brachst ein Objekt namens

    Excel.Workbook das wiederum hat die Eigenschaft Charts

    darüber ist es dann möglich Diagramme in einer Excelmappe zu zeichnen.

    Beispiel ist allerdings VB.NET ein Problem das in C# zu machen sollte nicht bestehen da es auf der gleichen Library/Framwork besteht. Sind Aufrufe,Eigenschaften Methoden und Objekte gleichen Namens.

    Beispiel in VB.NET



  • Zum Prob Zellen ansprechen habe ich auf Codeproject diesen
    Schnippel gefunden

    /// <summary>
        /// Vahe Karamian - 03/22/2005 - Get Range from Worksheet
        /// Return content of range from the selected range
        /// </summary>
        /// Range parameter: Example, GetRange("A1:D10")
    #region GET RANGE
        public string[] GetRange(string range)
        {
            Excel.Range workingRangeCells = excelWorksheet.get_Range(range,Type.Missing);
            //workingRangeCells.Select();
            System.Array array = (System.Array)workingRangeCells.Cells.Value2;
            string[] arrayS = this.ConvertToStringArray(array);
    
            return arrayS;
        }
    #endregion
    


  • Ich empfehle hier wirklich das Du mal auf
    Codeproject vorbeischaust
    in dem Bereich gibts dort die geballte Ladung.

    Dieses MyCSharp hat auch einigen Fundus darüber.

    Sowie hier Treffer in der MSDN.

    Ansonsten mal gucken schreib wieder hierein falls es weitere Fragen gibt.
    Ich schaue ja immer mal herein.

    Als Artikelschreiber muss ich mich als Autor um meinen neuen Beitrag hier noch kümmern (ein Vergleich: SharpDevelop 1.1 versus VS.NET 2003).

    Grüsse sclearscreen



  • Mach Dir wieder ein 2 Projekt auf wo Du das was Du ernst umsetzen möchtes wieder testen tust. Dann musste nicht dort rumfrickeln wo das was Du bis jetzt hast schon funktioniert.



  • Zellen selektieren und kopieren (ein Beispiel bei MSDN) funktioniert auch wunderbar.
    Nur habe ich nichts gefunden, wie man diese zellen in einem Diagramm darstellt.
    Ich habe schon ein VBA Makro wo alle Befehle zum Diagrammformatieren drinnstehen, aber ich habe einfach keine Ahnung wo ich diese in C# hinschreiben kann / muss um ein Diagramm zu zeichnen.


Anmelden zum Antworten