Autor Beitrag
ocram1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Mi 29.02.12 22:54 
Hallo.
Ich versuche 3 Klassen zu programmieren.
Die erste soll Excel starten.
Die zweite soll ins aktive Sheet einen Wert schreiben.
Die dritte soll diesen Wert auslesen.

Bis auf das starten des Excels funktioniert leider nichts.
Was mache ich bei dem Cells Befehl falsch.

und zweite Frage. Wie muss ich den Code ändern das ich nicht in jeder Klasse ein neues Sheet definieren muss.
Kann er nicht einfach das aktive ansteuern?

Grüsse und Danke im Voraus.

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Der Code fehlt noch :)

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Excel = Microsoft.Office.Interop.Excel;

namespace Excel_examples_01
{
    class Program
    {
        static void Main(string[] args)
        {

            CreateWorkbook NewWorkbook = new CreateWorkbook();
            NewWorkbook.workbook();
            WriteCells newWriteCells = new WriteCells();
            newWriteCells.StringToCells(5);
            ReadCells newReadCells = new ReadCells();
            newReadCells.CellsToString("blabla");
      
        }
    }
    public class CreateWorkbook
    {
        public void workbook()
        {
            try
            {
                // Start Excel and create a workbook and worksheet.  
                Excel.Application xlsApp = null;
                Excel.Workbook xlsWb;
                Excel.Worksheet xlsSheet;
                xlsApp = new Excel.Application();
                xlsWb = xlsApp.Workbooks.Add();
                xlsSheet = xlsWb.Sheets.Add();
                xlsApp.Visible = true;
            }
            catch
            {
            }
        }
    }
    public class WriteCells
    {
        public void StringToCells(int str)
        {
            Excel.Worksheet xlsSheet1 = new Excel.Worksheet();
            xlsSheet1.Cells[11] = str;
        }
    }
    public class ReadCells
    {
        public string CellsToString(string str)
        {
            Excel.Worksheet xlsSheet1 = new Excel.Worksheet();
            str = xlsSheet1.Cells[11];
        }
    }

}
ocram1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: So 04.03.12 23:25 
Hallo.

Die Fragen gehen mir leider nicht aus. Ich finde kaum Unterlagen wie man Excel mit C# bearbeitet.
Wie kann ich auf ein schon offenes Excel zugreifen?
Es soll von einem schon offenen Excel der Name des aktiven Tabellenblattes ausgegeben werden.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
            try
            {                
                Excel.Application xlsApp = null;
                Excel.Workbook xlsWb;
                Excel.Worksheet xlsSheet;
                xlsApp = (Excel.Application)... ???
                xlsWb = xlsApp.ActiveWorkbook();
                xlsSheet = xlsWb.ActiveSheet();
                Console.WriteLine(xlsSheet.Name);
                Console.ReadLine();

            }
            catch
            {
            }
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Mo 05.03.12 19:12 
Das Problem ist, dass du keine globale Variable hast, die den Status speichert. Somit weiß das Programm nicht, wo du bist. Du müsstest eher eine Klasse Workbook erstellen, ungefähr so (ungestestet):
user profile iconocram1 hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
namespace Excel_examples_01
{
    class Program
    {
        static void Main(string[] args)
        {

            Workbook NewWorkbook = new Workbook();
            NewWorkbook.StringToCells(5);
            NewWorkbook.CellsToString("blabla");
      
        }
    }
    public class Workbook
    {
        //Hier sind deine Variablen
        private Excel.Workbook xlsWb;
        private Excel.Application xlsApp = null;
        private Excel.Worksheet xlsSheet;
        public Workbook() //Konstruktor
        {
            try
            {
                // Start Excel and create a workbook and worksheet.  
                xlsApp = new Excel.Application();
                xlsWb = xlsApp.Workbooks.Add();
                xlsSheet = xlsWb.Sheets.Add();
                xlsApp.Visible = true;
            }
            catch
            {
            }
        }
        public void StringToCells(int str)
        {
            xlsSheet.Cells[11] = str;
        }
        public string CellsToString(string str)
        {
            str = xlsSheet.Cells[11];
        }
    }

}

Daraus erstellst du dir dann eine Instanz, mit der du dann alles machen kannst. Ich glaube, dir fehlen noch die Grundlagen in objektorientiertem Programmieren. Du solltest dich erstmal noch mit Konzepten Klasse und Objekt vertraut machen.
ocram1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Mo 05.03.12 22:24 
Hallo und Danke.
Konnte das Problem nun lösen.
Als nächstes versuche ich ein schon geöffnetes Excel zu bearbeiten.
Da hab ich noch ein paar Versuche vor mir bis mir auch hier ev. die Ideen ausgehen.

Zu deiner Aussage Klassen und Objekte anschauen...
Ich habe einige hundert Seiten eines Buches durchgearbeitet. Mittlerweile gehts da um Polymorphie, nested classes usw.
Das sind alles Dinge die ich so im Detail nicht bzw. noch nicht brauche.
mit einfachen Variablen Klassen und Methoden zu erzeugen hab ich ja schon gemacht. Aber das ganze an Excel anbinden ist m.M nach eine andere Stufe. Ich will kein Programmierer werden. Hab auch nicht die Zeit dazu. Ich habe Probleme die ich mir mit einfachen C# Programmen lösen will. Der einfachste und schnellste Weg hierzu ist sich mal ein paar Grundlagen anzu sehen und dann einfach mal rein ins Vergnügen. Das Bücher pauken allein bringt nichts weil man sich nicht alles merken kann.


Grüsse
ocram1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Do 08.03.12 20:35 
Hallo.

Hab nun einen Code gefunden der mir den Wert aus einer Zelle auf die Konsole ausgibt.

Meine Fragen falls mir jemand helfen könnte wären:
->Muss das wirklich alles sein was in dem Code steht? Der Code für das Auslesen aus einer Zelle geht über den ganzen Bildschirm?!
->Manchmal geht der Code nicht. Im Taskamanager sehe ich dann, das dort noch eine Excel.Exe offen ist.
Ich bin mir also nicht sicher ob der Code den ich hier habe so stabil ist.

Den Code hab ich als Vorlage:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using Excel = Microsoft.Office.Interop.Excel;
// Diesen Namensraum brauchst Du für COM-Interop
using System.Runtime.InteropServices;
// Diesen Namensraum brauchst Du für "Late Binding"
using System.Reflection;



// Dieses Beispiel ruft den Inhalt der Zelle A1 aus dem aktuellen Excel-Dokument ab
namespace ExcelHelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            // Verweis auf die geöffnete Excel-Instanz herstellen (Excel muss für dieses Beispiel bereits geöffnet sein)
            object excel = Marshal.GetActiveObject("Excel.Application");

            // Aktuelles Tabellenblatt abfragen
            object sheet = excel.GetType().InvokeMember("ActiveSheet", BindingFlags.GetProperty, null, excel, new object[0]);

            // Inhalt von Zelle A1 lesen und auf die Konsole schreiben (Das auslesen einer Zelle, lässt sich, wie Du siehst, mit zwei Zeilen erledigen)
            object rangeA1 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "A1", Missing.Value });
            Console.WriteLine("Inhalt von A1: " + Convert.ToString(rangeA1.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, rangeA1, new object[0])));

            // Warten bis der Benutzer Enter drückt
            Console.ReadLine();

            // COM-Verweise freigeben
            Marshal.ReleaseComObject(rangeA1);
            Marshal.ReleaseComObject(sheet);
            Marshal.ReleaseComObject(excel);
        }
    }
}
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 08.03.12 21:32 
Sorry aber deine Frage regt mich auf. Programmieren ist kein LEGO. Code denn du im Netz findest solltest du nicht einfach wiederverwenden und unverstanden mit anderen, im schlimmsten Fall auch unverstanden Code, zusammenstöpseln. Auch wenn dir hier jemand sagt das dieses Codefragment OK ist wenn du denn nimmst und mit anderen Code kombinierst kann der nicht stabil sein solange du ihn nicht verstehst.

Zitat:
Muss das wirklich alles sein was in dem Code steht? Der Code für das Auslesen aus einer Zelle geht über den ganzen Bildschirm?!

Das Auslesen der Zelle ist ein Einzeiler ist. Der Rest ist Overhead (finden der Excel Instanz, Tabellenblatt ranholen, aufräumen von unmanaged Resourcen) den du auch nur einmal hättest wenn du 1 Millionen Zellen ausliest.

Zitat:
Manchmal geht der Code nicht. Im Taskamanager sehe ich dann, das dort noch eine Excel.Exe offen ist.


Du verbindest dich zu einer laufenden Excel Instanz. Wenn dein Programm zum Ende einfach Excel beendet wäre der User wahrscheinlich ziemlich sauer denn er hatte ja vermutlich einen Grund gehabt Excel auch schon vor deinem Programm offen zu haben. Auch fehlt deinem Code jegliches Exceptionhandling. Damit Excel sich schließen kann müssen alle Excel COM Objekte am Ende freigegeben werden das ist in deinem Code in keinster Weise sichergestellt.
ocram1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: So 11.03.12 13:45 
Hallo und danke für die Antwort.
Da ich leider keine Unterlagen über die Anbindung an Excel finde (ich such schon länger) kann ich mir nur mit dem kopieren von Code behelfen,
und dann einfach das beste draus machen.
Zurück zu meiner Frage:
Danke nochmals für die Tipps. Ich werds mir mal vormerken. Wenn ich weiter fortgeschritten bin werde ich hoffentlich verstehen
wie ich das umsetzen kann was du empfhielst.

Fürs erste funktionert der Code ja schon. Das ist einmal wichtig für mich.
Ich hab das ganze nun in eine Klasse eingebetet sodass ich nun mittels Klasse.Methode drauf zugreifen kann.

Als nächstes möchte ich nun den Code direkt vom Excel starten.
Das Problem zur Zeit ist das der Zugriff immer auf das zuerst gestartete Excel geschieht.
Deshalb möchte ich den Code in Zukunft direkt vom Excel aus starten und als aktives Sheet bzw. Blatt soll dann
natürlich das gelten das gerade offen ist.
Im Autocad geschieht das mittels dlls. Es werden im ACAD Buttons eingefügt die dann mit den dlls verknüpft werden.
Kann mir hier jemand einen Tipp gegen wo ich Unterlagen für dieses Problem finde um sowas in Excel zu gestalten. Müssen in Excel ebenfalls Buttons erzeugt werden die dann
auf dlls verweisen?

Danke und Grüsse
ocram1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Mi 14.03.12 22:17 
In dem folgenden Link hab ich ev etwas gefunden:

support.microsoft.com/kb/302901/de

Hier wird allerdings von einem Erweiterungsassistenten gesprochen.
Ich finde den in meiner Gratis VS Version nicht. Kann es sein das es den nur in der zu zahlenden Version gibt?

Wenn ja, hat jemand eine Idee wie ich die Angaben von obigen Link trotzdem verwenden kann?

Also nochmals anders gefragt. Wie bekomm ich den C# Code als Add-In ins Excel?

Grüsse und Danke.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 28.05.12 18:24 
Guten Tag :)


Hab mich hier eben angemeldet, weil ich finde, dass eine Frage nicht so stehen gelassen werden sollte.

Ich kann zwar nicht dabei helfen, wie man mit Excel arbeitet (hab das noch nie gebraucht, also auch nie danach gesucht), aber ich kann ein paar andere Punkte ansprechen:

Zuerst einmal:
Ja, die Office-Projekte sind nur ab der Professional-Version verfügbar.
Für einige mag das doof sein, aber das ist nun mal eine Professional-Version und in der Express-Version geht man nicht davon aus, dass der Nutzer schon soweit geht. Ganz abgesehen davon ist Visual Studio ein ziemlich umfangreiches Programm, da finde ich es persönlich so schon klasse, dass es überhaupt eine kostenlose Version gibt^^
Da ich dir nun aber keinen Vortrag halten will, warum das nun kostenpflichtig ist, biete ich noch an, eine Projektmappe zu erstellen, die die ganzen Office-Projekte enthält und dann dir zu schicken.

Was die objektorientierte Programmierung angeht kann ich Ralf Jansens Ärger verstehen.
Das Problem bei C# (und auch anderen Sprachen) ist, dass sie sehr typorientiert sind und ohne objektorientierte Programmierung eigentlich kaum zu gebrauchen sind. Man kann zwar einfache Programme schreiben, wie ein einfacher Konsolen-Rechner, aber sobald du auch willst, dass dein Programm etwas mehr fordernde Aufgaben erledigt, geht es nicht mehr wirklich ohne die objektorientierte Programmierung.
Ich bezweifle zwar (nur eine Vermutung), dass du bei der Arbeit mit Excel die Polymorphie und Vererbung allgemein brauchst, aber du solltest sie zumindest verstanden haben.

Du hast auch geschrieben, dass du "einige hundert Seiten eines Buches durchgearbeitet" hast und "Mittlerweile gehts da um Polymorphie, nested classes usw".
Das Buch würde ich gerne mal sehen, das nach einigen hundert Seiten erst da angekommen ist. Es stimmt, dass C# sehr umfangreich ist, aber die objektorientierte Programmierung, dessen größte Stütze nun einmal Polymorphie ist, sollte immer möglichst früh behandelt werden.
Nun, ich weiß nicht, ob das mit dem Buch nun wirklich stimmt, oder ob es einfach zu umfangreich ist, aber ich kann dir das hier empfehlen:
openbook.galileocomp...sharp_2010/index.htm
Es ist kostenlos und lässt sich auch hier kostenlos als HTML-Version downloaden:
www.galileocomputing.de/openbook?GPP=nlch
Steht etwas weiter unten, scrolle einfach mal runter.
Die CD dazu ist zwar nicht dabei, aber wenn du aufmerksam liest und eventuell auch die vorgestellten Projekte mit programmierst, brauchst du die auch gar nicht.
Das Klassendesign kommt in Kapitel 3 dran, Vererbung, Polymorphie und Interfaces findest du in Kapitel 4.
Bis dahin wird eigentlich alles grundlegende erklärt. Überfliege es trotzdem.^^
Als ich damit angefangen habe, musste ich auch ein paar Kapitel überspringen, aber ich hab überall noch kleine Dinge gefunden, die ich nicht kannte.


Was das Verständnis von Code-Schnipseln angeht, haben die anderen auch Recht. Es birgt keine Gefahr in sich (zumindest in den wenigsten Fällen), allerdings ist es sehr schwer, solch einen Schnipsel wirklich richtig zu verwenden, wenn du ihn nicht verstanden hast. Das liegt ganz einfach daran, dass sie aus einem anderen Kontext gerissen sind und eventuell so in der Form völlig ungeeignet sind, aber durch leichte Änderungen angepasst werden können.
Das hatte ich bisher eigentlich immer, außer die Methode oder die Klasse war generisch (Im oben genannten Buch im Kapitel 7.2. An sich nicht weiter schwer, aber es erfordert solide Grundkenntnisse) und war für den allgemeinen und öffentlichen Gebrauch gemacht, dann hat sie einiges mehr erlaubt und ließ sich auch gleich nutzen.



Also nochmal zusammen fassend:
Du möchtest C# nutzen um einzelne Probleme zu lösen und da ist C# auch eine gute Wahl, weil es sehr anfängerfreundlich ist, aber trotzdem (dank Net-Framework) im Grunde fast alles erlaubt.
Wenn du also wirklich weiterhin damit Probleme lösen willst, dann solltest du dich ganz rein lesen. Deshalb wirst du noch lange kein professioneller Programmierer, denn das erfordert deutlich mehr, aber du wirst Probleme, wie deinen Eingangs-Code, von vornherein erkennen und Lösen können. Außerdem stoßt es in Foren, wie diesem, oft auf negative Reaktionen, da es einfach sehr viele Menschen gibt, die denken, wie du und solche Fragen irgendwann auch einfach auf die Nerven gehen. Du musst dabei verstehen, da solche Dinge zu den grundlegendsten Dingen (und, wenn man es eine Weile kennt, zu den einfachsten Dingen) gehört, dass erfahrenere Programmierer nicht lange Texte schreiben und das erklären möchten, wo es in Büchern (wie dem oben genannten) doch viel besser erklärt ist.

Daher mein Tipp:
Lade dir das Buch und lies einfach jeden Abend ein Thema durch (kein Kapitel, nur ein Unterthema dort) oder mehrere, je nachdem, und schreibe dir neue Dinge, die du dir nicht merken kannst auf. Ich persönlich mache es so, dass ich mir einen Ordner im FireFox erstellt habe und dort Lesezeichen erstellt habe, die das Thema im Buch gleich auf die Stelle verlinken.
Wenn du die grundlegenden Themen kannst, wirst du in Foren auch auf mehr Kooperation treffen.




PS:
Bevor mich die eingefleischten Bordler jetzt auseinander nehmen, dass ich mich bloß angemeldet habe um so einen Roman unter einem 3 Monate alten Beitrag zu kleben:
Ich werde jetzt nicht abhauen. ^^
Ich sehe mich als fortgeschrittenen Anfänger, auf dem direkten Weg zum Fortgeschrittenen und ich hoffe, hier Leuten helfen zu können, die noch nicht so weit sind wie ich und andererseits Hilfe bei Fragen zu finden, die auf andere, Erfahrene Programmierer, zu einfach wirken. Es möchte ja jeder mal anfangen. ^^
Deshalb bin ich hier, weil bei dem Forum, auf dem ich vorher immer gefragt hab, waren zu viele Profis und Leute, wie ich, wurden immer gleich darauf verwiesen, dass sie erst mal ein gutes Buch ganz durcharbeiten sollen.
Da mir das hier ganz freundlich vor kam, hab ich mich einfach mal auf gut Glück angemeldet und hoffe, dass ich auch Glück hab^^