Laden...

[gelöst] Excel Late-binding speichern in einen gewünschten Ordner

Erstellt von m.grauber vor 8 Jahren Letzter Beitrag vor 8 Jahren 4.401 Views
M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 8 Jahren
[gelöst] Excel Late-binding speichern in einen gewünschten Ordner

Hallo!

Ich verwende für die Excel-Automation Latebinding und das soll sich auch nicht ändern.

SaveAs funktioniert so weit, ausser wenn ich einen kompletten Pfad übergebe. Dann erhalte ich folgende Fehlermeldung:

Fehlermeldung:
Auf die Datei konnte nicht zugegriffen werden. Versuchen Sie die folgenden Lösungsvorschläge:\n\n• Überprüfen Sie, ob der angegebene Ordner vorhanden ist.\n• Stellen Sie sicher, dass der Ordner, in dem sich die Datei befindet, nicht schreibgeschützt ist.\n• Vergewissern Sie sich, dass der Dateiname keines der folgenden Zeichen enthält: < > ? [ ] : | oder *\n• Der Dateiname darf nicht länger als 218 Zeichen sein.

Hier z.B. wird das Thema besprochen, aber nicht so richtig gelöst: http://stackoverflow.com/questions/7632081/getting-error-on-calling-saveas-method

Der Pfad ist nicht länger als diese 218 Zeichen, aber er enthält einen ":" vom "C:&quot;. Im Programm kann der Benutzer den Wunschpfad angeben. Eingetragen ist z. B. C:\Users\mgrauber.MyDomain\AppData\Local\Temp\MyProg\Tabelle.xlsx

Wenn ich versuche, den Application.DefaultFilePath bereits vor dem Speichern zu setzen und dafür beim Speichern wegzulassen, kann ich zwar den DefaultFilePath setzen, der wird aber beim Speichern unhöflicherweise ignoriert.

Warum ärgert mich Excel so und wie kann ich die Excel-Datei auch in einem anderen Ordner speichern?

Natürlich wäre es gut, auch mehr als einen 218 Zeichen langen Dateipfad+Dateinamen zu verwenden, da ich ja nicht weiß, welchen Pfad der Kunde einstellt.

Beim SaveAs versuchte ich bereits die Variante mit 2 Parametern (Pfad+Dateiname, 51) und mit den vielen Parametern.

Bitte um Hilfe! 🙁

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 8 Jahren

Hallo!

Arbeitet wirklich niemand mit Excel, der etwas dazu sagen könnte? 🙁

Es soll wie gesagt unter verschiedenen Excel-Versionen laufen.

Danke im Voraus!!!!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

J
251 Beiträge seit 2012
vor 8 Jahren

Bezieht sich das ":" nicht nur auf den Dateinamen?

SaveAs funktioniert so weit, ausser wenn ich einen kompletten Pfad

Was wird der Methode übergeben, dass es funktioniert?

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 8 Jahren

Hallo Jamikus!

Es wird der komplette Pfad mit Dateiname übergeben: z. B. C:\Users\mgrauber.MyDomain\AppData\Local\Temp\MyProg\Tabelle.xlsx

Auch z.B. "C:\Test\Tabelle.xlsx" funktioniert nicht. "Tabelle.xlsx" hingegen schon - dort wird aber nicht in meinen gewünschten Ordner hineingespeichert.

Excel möchte scheinbar nur einen Dateinamen haben. Daher beim Speichern die Fehlermeldung nicht länger als 218 Zeichen. - Das ist für einen langen Dateinamen, der in vielen Unterordnern steckt, viel zu kurz aber nah an der Grenze der Länge, die ein Dateiname unter dem Filesystem haben darf.

Grüße

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

J
251 Beiträge seit 2012
vor 8 Jahren

ich habe nun auf die schnelle nichts gefunden bzw. kann ich mich erst später besser dran setzen, wenn ich Luft habe.

theo. sieht dies interessant aus: NetOffice - Ein versionsunabhängiger Wrapper für MS-Office

bzw. gäbe es im Notfall die Option, dass man die Datei verschiebt (sehr unglückliche Lösung) 😕

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 8 Jahren

Hallo Jamikus!

noch eines der vielen tausend Automations-Zusatztools möchte ich von Anfang an nicht nutzen. Ich habe mir so etwas bereits am Anfang vor der Automationsarbeit angesehen und mich dagegen entschieden.

Ein Excel-Dokument sollte sich schon mit Bordmittelchen in einen gewünschten Pfad per Latebinding speichern lassen?

Das mit Speichern, Verschieben und erneut Öffnen habe ich mir auch schon als letzte Möglichkeit ausgeguckt. Das wäre wirklich krass, zumal es dort dann auch Rechteeinschränkungen geben könnte und es länger dauert.

Vielen Dank, dass Du es Dir ansiehst - Das ist wirklich absolute Spitze 👍

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 8 Jahren

Hallo!

Leider komme ich wirklich nicht weiter und der "DefaultFilePath" wird auch ignoriert. Das ist doch eine rudimentäre Funktion die eigentlich klappen müsste? Bei Word ist es ja auch möglich. Speichert ihr Eure Excel-Dokumente nicht, daß das nicht auffällt?

🙁

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

1.029 Beiträge seit 2010
vor 8 Jahren

Hi,

hm - bei mir funktioniert das sehr gut 😉

void WriteExcelFile()
		{
			object app = null;

			if (Process.GetProcessesByName("EXCEL").Count() > 0)
			{
				app = Marshal.GetActiveObject("Excel.Application"); // as Excel.Application ;
			}

			if (app == null)
			{
				Type appType = Type.GetTypeFromProgID("Excel.Application");
				app = Activator.CreateInstance (appType);
			}

			app.GetType().InvokeMember("Visible", System.Reflection.BindingFlags.SetProperty, null, app, new object[]{ true });
			object missing = Missing.Value;

			object workbooks = app.GetType().InvokeMember("Workbooks", System.Reflection.BindingFlags.GetProperty , null, app, null);

			object wkb = workbooks.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, workbooks, new object[] { missing });

			string test = @"C:\Users\username\Desktop\test.xlsx";
			object[] p = new object[] {test, 51};

			wkb.GetType().InvokeMember("SaveAs", BindingFlags.InvokeMethod ,null , wkb, p );

			Marshal.ReleaseComObject(wkb);
			Marshal.ReleaseComObject(workbooks);
			Marshal.ReleaseComObject(app);
		}

Was machst du denn anders? Bei mir kam der Fehler zugegebenermaßen am Anfang auch - allerdings gab es dort den Zielordner noch nicht...

LG

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 8 Jahren

Hallo Taipi88!

Bombig - Danke! - Mein Fehler gefunden, das hat mir sehr geholfen!!! 👍 👍 👍

Mein Code sah ähnlich aus. Ich hatte beim "Add" anstatt einem Missing nur null verwendet und SaveAs nicht per InvokeMember aufgerufen und die Parameter Dateiname und Format als string bzw. int übergeben.

Nach Umstellung dieser Sachen kam trotzdem noch ein Fehler, also ging ich nochmals alles durch: Ich baute @Pfadnamen und @Dateiname mit "&quot; zusammen und daher hatte ich "\", d. h. im Debugger wurde "\\" angezeigt. Nun stattdessen Path.Combine genutzt und es klappt!

Dein Code u.a. mit der Verwendung von Missing und InvokeMember ist wesentlich besser, weshalb ich dies nun auch nutze.

Einen schönen Nachmittag!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]