Laden...

Forenbeiträge von dansmo Ingesamt 14 Beiträge

24.02.2011 - 16:42 Uhr

Hallo Sebastian,

vielen Dank für deine Arbeit.

Ich habe zwei Fragen:

  1. Wie greife ich auf ein bestimmtes, benanntes Worksheet zu?
    In deinen Beispielen finde ich nur die Möglichkeit via Nummerierung einen Abruf zu machen:
objSheet = (Excel._Worksheet)objSheets[1];

Geht das auch mit dem Tabellennamen?

objSheet = (Excel._Worksheet)objSheets["Signal"];
  1. Wie steuere ich eine laufende Excel Anwendung und Tabelle an?
    Ohne dein Latebinding habe ich das so gemacht, was jetzt aber zu einem Fehler führt:
    objWorkbook =
(Excel.Workbook)System.Runtime.InteropServices.Marshal.BindToMoniker(filePath + file);
                    objSheets = objWorkbook.Application.Sheets;

Dazu konnte ich in deinen Beispielen leider nichts finden, dort werden Datein eher neu erstellt als das auf geöffnete Dateien zugegriffen wird. Wie geht das am besten?

Danke,
dansmo

24.02.2011 - 16:02 Uhr

Hallo Sebastian,

danke für dein Projekt, jetzt geht es.
Eine kleine Frage dazu:
vorher konnte ich ein einzelnes Worksheet so ansteuern:

objSheet = (Excel._Worksheet)objSheets.get_Item("Signal");

Mit deiner dll geht das jetzt nicht mehr, anscheinend kann ich das nur noch nach Nummerierung aufrufen?

objSheet = (Excel._Worksheet)objSheets[1];

Oder geht das so auch?

objSheet = (Excel._Worksheet)objSheets["Signal"];

Danke für Feedback,
dansmo

15.02.2011 - 09:15 Uhr

Es geht um den Code in diesem Thrad http://www.mycsharp.de/wbb2/thread.php?threadid=77102und dessen Integration mit meinem obigen Code. Ich gehe davon aus, dass das der richtige Weg ist verstehe aber vom Code ehrlich gesagt nichts.

14.02.2011 - 21:50 Uhr

Hallo Tom,

ich habe zu dem Late Binding code gefunden, ja. Leider habe ich keine Ahnung, wie ich meinen obigen Code verändern muss, damit das klappt. Ich war ja schon froh, dass es überhaupt funktioniert hat. Kann mir denn jemand helfen dass in meinen Code zu integrieren?

12.02.2011 - 15:00 Uhr

Hallo MarsStein,

glaub mir: das spielt keine Rolle in dieser Situation. Letztlich bin ich der user und ich will nur überprüfen, ob nach Beedndigung eines Vertrages die Software weiterhin ausgeführt wird. Ich will also nur überwachen, ob mein Auftraggeber unmoralisch gegen den Vertrag handelt.
Wie macht man das am besten? Ich muss das von außerhalb überprüfen können.

11.02.2011 - 22:56 Uhr

Dann vielleicht nochmal zum Sinn und Zweck des Ganzen:

ich schreibe ein kleines, aber wertvolles Add-in. Im Moment habe nur ich Zugriff auf den Rechner und auf das Tool. Da das zukünftig aber nicht der Fall sein wird und ich überprüfen möchte ob bestimmte vertraglich vereinbarte Regelungen eingehalten werden, möchte ich gerne in ein Logbuch, das ich eben auch von außerhalb der Organisation abrufen kann, das Datum der letzten Tool- Ausführungen anzeigen. Es geht um Kontrolle. Da das Haupttool, in das das Programm integriert ist, über eine Internetverbindung verfügt kam ich auf die Idee, das in dieser Weise kontrollieren zu können.
Es geht also um etwas relativ einfaches. Wichtig ist nur, dass der user davon nichts mitbekommt.

11.02.2011 - 18:56 Uhr

Jetzt habe ich noch eine Anschlussfrage:

Auf meinem "Entwickler PC" habe ich Office 2010 installiert, auf dem "Arbeits PC" jedoch Office 2003. Dort funktioniert es jetzt leider nicht, wenn ich meine Anwendung am Arbeits PC laufen lass.
Was muss ich tun damit das trotzdem geht, egal welche Office Version der user benutzt?

11.02.2011 - 17:31 Uhr

Hallo,

genau, das Datum der letzten Ausführung des Codes.
Die Datenbank ist dann auf dem Server der Website installiert? Verstehe ich das richtig?

11.02.2011 - 16:44 Uhr

Hallo,

vorne weg:
Ich kann nur ein wenig die einfachsten Sachen in Visual C# Express programmieren und dabei geht es immer um kleine Code Teile für eine andere Anwendung.
Jetzt möchte ich einem dieser Codes eine besondere Funktion hinzufügen:
immer wenn er ausgeführt wird soll auf einer dafür vorgesehenen Website das Datum der Ausführung angezeigt werden.
Wie geht das? Was brauche ich dazu? Ich bin schon über ASP.Net gestolpert habe aber keine Ahnung wie ich das in Visual C# Express in meine "normalen" Codes bekomme.
Kann mir da jemand einen Tipp geben?

Danke.
dansmo

09.02.2011 - 16:20 Uhr

Ja, hast du recht. Danke.

Jetzt habe ich noch ein kleineres Problem, das ich der Vollständigkeit halber auch gerne noch lösen möchte:

Wenn mehrere Excel Instanzen geöffnet sind dann kommt es zu Problemen. Wie kann ich das noch einfügen, damit der Code immer (naja, fast immer) richtig funktioniert?

09.02.2011 - 15:34 Uhr

Habs gelöst:

                if(!isFileOpenOrReadOnly(filePath + file))
                {
                    //Open it since it is not yet open ----working fine
                    objApp = new Excel.ApplicationClass();
                    objWorkbook = objApp.Workbooks.Open(filePath + file);
                    objSheets = objWorkbook.Worksheets;
                }
                else
                {
                    //it is open, get it ------this part IS working fine
                    objWorkbook = (Excel.Workbook)System.Runtime.InteropServices.Marshal.BindToMoniker(filePath + file);
                    objSheets = objWorkbook.Application.Worksheets;
                }

und de funktion ist

        public bool isFileOpenOrReadOnly(string file)
        {
            try
            {
                //first make sure it's not a read only file
                if ((File.GetAttributes(file) & FileAttributes.ReadOnly) != FileAttributes.ReadOnly)
                {
                    //first we open the file with a FileStream
                    using (FileStream stream = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Read, FileShare.None))
                    {
                        try
                        {
                            stream.ReadByte();
                            return false;
                        }
                        catch (IOException)
                        {
                            return true;
                        }
                        finally
                        {
                            stream.Close();
                            stream.Dispose();
                        }
                    }
                }
                else
                    return true;
            }
            catch (IOException)
            {
                return true;
            }
        }  
09.02.2011 - 14:03 Uhr

So, ich habe selbst noch einiges versucht. Im Moment hänge ich aber fest. Ich schaffe es, dass er die Datei öffnet, wenn sie nicht offen ist. An dem Punkt war ich ja schon heute Morgen.
Zusätzlich schaffe ich es jetzt, die Datei zu bearbeiten, wenn sie schon offen ist. Soweit so gut. Jetzt geht es darum beide zusammenzufügen, mit einer Prüfung, ob die Datei läuft. Falls nein: öffne sie, sonst beschreibe sie direkt.
Hier kommt aber ein Fehler. Ich denke, dass der Fehler direkt die Zeile eins in dem Ausschnitt betrifft. Evtl. klappt das mit der Überprüfung auf null nicht, wie kann ich das anders machen?
Der Fehler heißt ungefähr so:

Error: Ausnahme von HRESULT; 0x800A03EC bei Microsoft.Office.Interop.Excel

                if ((Excel.Workbook)System.Runtime.InteropServices.Marshal.BindToMoniker(filePath + file) == null)
                {
                    //Open it since it is not yet open ----working fine
                    objApp = new Excel.ApplicationClass();
                    objWorkbook = objApp.Workbooks.Open(filePath + file);
                    objSheets = objWorkbook.Worksheets;
                }
                else
                {
                    //it is open, get it ------this part IS working fine
                    objWorkbook = (Excel.Workbook)System.Runtime.InteropServices.Marshal.BindToMoniker(filePath + file);
                    objSheets = objWorkbook.Application.Worksheets;
                }

Auch die andere Alternative bringt leider keine Lösung. Zwar kommt dann der Fehler nicht, aber es wird in die geöffnete Datei nicht geschrieben.

                try
                {
                    //Open it since it is not yet open ----working fine
                    objApp = new Excel.ApplicationClass();
                    objWorkbook = objApp.Workbooks.Open(filePath + file);
                    objSheets = objWorkbook.Worksheets;
                }
                catch(Exception e)
                {
                    //it is open, get it ------this part IS working fine
                    objWorkbook = (Excel.Workbook)System.Runtime.InteropServices.Marshal.BindToMoniker(filePath + file);
                    objSheets = objWorkbook.Application.Worksheets;
                }

09.02.2011 - 08:36 Uhr

Hallo,

ich möchte auf eine bestimmte Excel Datei und in dieser auf bestimmte Sheets zugreifen. Das klappt soweit gut, wenn die Datei geschlossen ist und vom Programm erst geöffnet wird. Dazu benutze ich folgenden Code:


/*Excel*/
            Excel.Sheets objSheets;
            Excel._Worksheet objSheet;
            try
            {
                // Open a specified workbook           
                objApp = new Excel.ApplicationClass();
                objBook = objApp.Workbooks.Open("I:/Test123.xls");
                objSheets = objBook.Worksheets;

                //write to the Signal sheet
                objSheet = (Excel._Worksheet)objSheets.get_Item("Test");

                /*Erstmal Sheet bereinigen*/
                objSheet.get_Range("C3:L18").set_Value(Missing.Value, "");

                objSheet.get_Range("B1").set_Value(Missing.Value, "Test123456");
}

Was muss ich anpassen, damit zunächst geprüft wird, ob diese Datei bereits geöffnet ist und dann direkt in diese geschrieben wird?
Ich habe zwar via Google einige Beispiele gefunden, diese aber nicht verstanden und hopffe mir kann jemand das konkret an meinem Code zeigen. Danke.