Autor |
Beitrag |
Schlüsselbein
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 31.01.14 11:24
Hallo,
bin mir leider nicht sicher, ob ich im richtigen Forum bin, entschuldigt, falls nicht.
Ich habe ein COM-Add-In für alle Office-Programme geschrieben, welches diese mit einem zusätzlichen Button ausrüstet. Dafür habe ich using Microsoft.Office.Core; benutzt.
Beim Klicken wird das Event
C#-Quelltext 1: 2: 3: 4:
| private void MyButton_Click(CommandBarButton cmdBarbutton, ref bool cancel) { } |
ausgelöst. Und hier würde ich gerne ein PDF-Konverter reinschreiben. D.h., das offene Office-Dokument soll als PDF gespeichert werden auf D:\.
Habe schon gesucht und gesucht, allerdings nicht so ganz das richtige gefunden.
Wenn jemand einen guten Link oder mir sonstige Hinweise geben kann, wäre ich dankbar.
Grüße
Moderiert von Th69: C#-Tags hinzugefügt
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 31.01.14 11:47
Howtos
Excel - msdn.microsoft.com/e...office/bb407651.aspx
Word - msdn.microsoft.com/e...office/bb412305.aspx
für Powerpoint gibts scheinbar kein Tutorial aber zumindest die gleiche Funktionalität
Powerpoint - msdn.microsoft.com/e...office/ff746080.aspx
und in Outlook müßte man wenn man eine Mail drucken will die erst in Word öffnen udn dann von da das PDF erzeugen
Outlook - www.slipstick.com/de...e-outlook-email-pdf/
|
|
Schlüsselbein
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 31.01.14 11:56
Danke für deine schnelle Antwort. Werde ich mir mal anschauen.
Gildet das auch für Office 2010?
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 31.01.14 12:46
Sehr wahrscheinlich. Die API ist da eigentlich gleich.
|
|
Schlüsselbein
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 31.01.14 12:55
In dem Excel Link unter dem Punkt 3 werden mir bei
C#-Quelltext 1: 2:
| ApplicationClass excelApplication = new ApplicationClass(); Workbook excelWorkBook = null; |
diese Fehlermeldung angezeigt:
Der Interoptyp "Microsoft.Office.Interop.Excel.ApplicationClass" kann nicht eingebettet werden. Verwenden Sie stattdessen die entsprechende Schnittstelle.
Markiert wird "ApplicationClass"
Was stimmt nicht ?
Moderiert von Th69: C#-Tags hinzugefügt
|
|
Tranx
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Fr 31.01.14 13:00
Eine Möglichkeit Office-Komponenten zu pdf zu konvertieren ist die Installation eines PDF-Druckers (Foxit-Reader, Free-PDF). Dann brauchst Du die Dokumente - egal von welchem Programm aus - nur noch zu drucken (Meistens wird der Dokumentenname mit .pdf als Vorgabename für die zu speichernde Datei benutzt).
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
Schlüsselbein
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 31.01.14 13:02
Die Dokumente sollen allerdings nicht gedruckt werden, sondern erstmal nur gespeichert werden.
|
|
Tranx
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Fr 31.01.14 13:50
Der "Drucker" speichert die Dokumente, wenn Du das wünschst. Beim Free-PDF erledigst Du das z.B. über "Datei ablegen". Dann wählst Du das Verzeichnis aus nur änderst ggfs. den Dateinamen.
Vorteil: Du kannst dies für JEDES Programm mit Druckerausgabe nutzen udn sogar diesen "Drucker" als Standarddrucker definieren.
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
Schlüsselbein
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 31.01.14 13:55
Achso, dann wäre das natürlich praktisch. Bleibt nur noch die Frage, wie man das in den C#-Code einbringt. :(
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 31.01.14 14:11
Zitat: | Der Interoptyp "Microsoft.Office.Interop.Excel.ApplicationClass" kann nicht eingebettet werden. Verwenden Sie stattdessen die entsprechende Schnittstelle. |
Dann solltest du das embedden für diese Referenz ausschalten.
Im Solution Explorer bei den Referenzen die Interop Assembly raussuchen und in den Properties "Embedd Interop Types" auf false setzen.
|
|
Schlüsselbein
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 31.01.14 17:40
Den Solution Explorer kann ich einfach nicht finden. :(
Wo ist der?
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 31.01.14 17:43
Das ist das zentrale Ding wo alle Projekte Dateien und so weiter aufgezählt sind. Das kannst du eigentlich nicht übersehen Ich weiß leider nur nicht wie das in einem deutschen VS heißt
|
|
Th69
Beiträge: 4785
Erhaltene Danke: 1055
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 31.01.14 21:13
|
|
Schlüsselbein
Hält's aus hier
Beiträge: 12
|
Verfasst: Mo 03.02.14 12:35
Achso! Ja ok habe es dann schnell gefunden
Zitat: | Im Solution Explorer bei den Referenzen die Interop Assembly raussuchen und in den Properties "Embedd Interop Types" auf false setzen. |
Hat geklappt. Danke für den Hinweis.
Also mit meinem Add-In bin ich jetzt soweit:
In dem Click-Event wird eine feste Datei + Pfad genommen und an einem festen Pfad gespeichert.
C#-Quelltext 1: 2:
| string Quellpfad = @"D:\Test.xlsx"; string Zielpfad = @"D:\Test.pdf"; |
Allerdings möchte ich erreichen, dass in der Variable Quellpfad der Name (+ Pfad) des aktuell offenenen Office-Dokuments steht und diese folgendermaßen gespeichert wird:
D:\(UrsprünglicherNameDerDatei).pdf
Es soll also der Name beibehalten werden, nur die Extension soll pdf sein.
Ich brauche somit also eine Möglichkeit, mit C# den Namen des aktuell offenen Office-Dokuments herauszubekommen. Nach langem Suchen habe ich lediglich Beispiele für einzelne Office-Programme bekommen, meist Word und Excel.
Dies soll aber in allen Office-Programmen gelten. (Erstmal Word,Excel,PowerPoint und Outlook)
Hat jemand eine Idee, wie ich das mache?
In VB wäre das leicht, aber ich möchte das in C# schreiben.
Quelltext 1:
| Zielpfad = Left(ActiveDocument.Name, InStr(1, ActiveDocument.Name, ".") - 1) & ".pdf" |
Für jeden Hinweis wäre ich sehr dankbar.
Grüße
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 03.02.14 12:55
Unter der Annahme das in ActiveDocument.Name der Name mit Extension aber ohne Path steht dann z.B. so.
C#-Quelltext 1:
| string destination = Path.Combine(@"D:\", Path.ChangeExtension(ActiveDocument.Name, "pdf")); |
|
|
Schlüsselbein
Hält's aus hier
Beiträge: 12
|
Verfasst: Mo 03.02.14 13:14
Danke für die schnelle Antwort! Aber:
C#-Quelltext 1:
| string sourcePath = Path.Combine(@"D:\", Path.ChangeExtension(ActiveDocument.Name, "pdf")); |
Bei "ActiveDocument": Der Name "ActiveDocument" ist im aktuellen Kontext nicht vorhanden.
Was muss ich tun?
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 03.02.14 13:17
Du hast in deinem Beispiel ActiveDocument.Name benutzt darum bin ich davon ausgegangen das es das gibt bzw. du schon hast. Wenn du das so in einem VB Script hinbekommen hast solltest du in C# genauso an das aktive Dokument kommen (und dessen Namen) kommen. Die API ist ja die gleiche. Den Namen des pdf Files bekommst du dann wie gezeigt erzeugt.
|
|
Schlüsselbein
Hält's aus hier
Beiträge: 12
|
Verfasst: Mo 03.02.14 13:27
Ich habe gerade das Gefühl, ich seh den Wald vor lauter Bäumen nicht mehr.
In dem Beispielcode gibt es vorher doch auch kein ActiveDocuement.Name. Ich poste ihn mal hier ganz.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| ''Excel-Datei exportieren Sub pdfexport() Dim strFilePath As String Dim strFileName As String
strFilePath = "D:\" strFileName = Left(ActiveWorkbook.Name, InStr(1, ActiveWorkbook.Name, ".") - 1) & ".pdf"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=strFilePath & strFileName, Quality:=xlQualityStandard, _ IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
End Sub |
Aber meine Frage, was ich tun muss, damit ActiveDocument erkennt, besteht immernoch.
Entschuldige, wenn ich hier sehr unwissend rüberkomme, bin grad sehr verwirrt. :(
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 03.02.14 14:13
Zitat: | Entschuldige, wenn ich hier sehr unwissend rüberkomme, bin grad sehr verwirrt. |
Vorsicht. Das ist ansteckend.
Ich rate mal vor mich hin und vermute mal das ActiveDokument oder in deinem jetzt gezeigten Code ActiveWorkbook einfach Properties der Application Klasse sind. Schau doch einfach mal nach was die so bietet.
|
|
Schlüsselbein
Hält's aus hier
Beiträge: 12
|
Verfasst: Mo 03.02.14 15:55
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| Microsoft.Office.Interop.Excel.ApplicationClass excelApplication = new ApplicationClass(); Workbook excelWorkBook = null;
try { string test2 = excelApplication.ThisWorkbook.FullName; string test3 = excelApplication.ThisWorkbook.Path; string test4 = excelApplication.Name; File.AppendAllText(@"D:\test2.log", test2); File.AppendAllText(@"D:\test3.log", test3); File.AppendAllText(@"D:\test4.log", test4); } catch (Exception ex) { MessageBox.Show("Fehler:" + ex.Message + "\n" + ex.StackTrace, "Fehler"); } |
ergibt die Fehlermeldung:
Fehler: 0x800A03EC
bei Microsoft.Office.Interop.Excel.ApplicationClass.get_ThisWorkbook() bei Test.Connect.MyButton_Click(CommandBarButton cmdBarButton, Boolean& cancel) in B:\-Pfad zum Projekt-\Connect.cs:Zeile 135. (in dem Zitat oben ist das Zeile 6)
Fällt jemandem auf, was ich falsch mache?
|
|