Sehr gut, danke.
Hallo Sebastian,
vielen Dank für deine Arbeit.
Ich habe zwei Fragen:
objSheet = (Excel._Worksheet)objSheets[1];
Geht das auch mit dem Tabellennamen?
objSheet = (Excel._Worksheet)objSheets["Signal"];
(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
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
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.
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?
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.
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.
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?
Hallo,
genau, das Datum der letzten Ausführung des Codes.
Die Datenbank ist dann auf dem Server der Website installiert? Verstehe ich das richtig?
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
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?
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;
}
}
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;
}
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.