pdf aus Excel generieren

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    pdf aus Excel generieren

    Guten Morgen zusammen,

    ich hab nun mein Projekt fast fertig gestellt. Jetzt möcht ich noch ein "NiceToHave" als Highlight für den Chef einbauen .

    Ich würde gerne eine Excel-Vorlage kopieren, diese über mein Programm füllen und dann aber als pdf ausgeben.
    Die Excel krieg ich soweit hin. wobei es happert ist der Export als pdf. Hab schon das Netz auf links gedreht, aber nichts gefunden, was mich weiterbringt.
    Hat jemand ne Idee wie ich das angehen muss? SaveAs... Print...??? ?(

    Griaßle Sarah (übrigens...bin absoluter Anfänger!!!)



    Hier mal ein Auszug von meinem bisherigen Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Exportieren_Click(sender As Object, e As EventArgs) Handles Exportieren.Click
    2. If TB_ID.Text <> "" Then
    3. Dim Name As String = TB_06.Text
    4. Dim Vorname As String = TB_05.Text
    5. 'Sonderzeichen entfernen
    6. If Name.Contains("ä") Then
    7. Name = Name.Replace("ä", "ae")
    8. ElseIf Name.Contains("ö") Then
    9. Name = Name.Replace("ö", "oe")
    10. ElseIf Name.Contains("ü") Then
    11. Name = Name.Replace("ü", "ue")
    12. ElseIf Name.Contains("ß") Then
    13. Name = Name.Replace("ß", "ss")
    14. End If
    15. Dim xls_Kontakt As String = "C:\temp\" & Name & "_" & Vorname & ".xlsx"
    16. IO.File.Copy(xlsVorlage, xls_Kontakt, True)
    17. Dim xls_Appl As Excel.Application ' Excel Anwendung
    18. Dim xls_Mappe As Excel.Workbook ' Excel Arbeitsmappe
    19. Dim xls_Blatt As Excel.Worksheet ' Excel Blatt (Tabelle)
    20. 'Dim Anzahlzeilen As Integer
    21. xls_Appl = New Excel.Application() ' Excel Instanz bilden
    22. xls_Appl.Visible = False
    23. xls_Mappe = xls_Appl.Workbooks.Open(xls_Kontakt)
    24. xls_Blatt = CType(xls_Mappe.ActiveSheet, Excel.Worksheet)
    25. 'Zeile, Spalte
    26. xls_Blatt.Cells(3, 5) = TB_06.Text & " " & TB_05.Text 'Überschrift
    27. xls_Blatt.Cells(49, 6) = Now.ToShortDateString 'Stand
    28. xls_Blatt.Cells(5, 4) = TB_01.Text 'Firma
    29. xls_Blatt.Cells(16, 4) = TB_02.Text 'Position
    30. xls_Blatt.Cells(18, 4) = TB_03.Text 'Titel
    31. xls_Blatt.Cells(20, 4) = CB_04.Text 'Anrede
    32. xls_Blatt.Cells(22, 4) = TB_05.Text 'Vorname
    33. xls_Blatt.Cells(24, 4) = TB_06.Text 'Name
    34. xls_Blatt.Cells(7, 4) = TB_07.Text 'Gesch. - Straße
    35. xls_Blatt.Cells(9, 4) = TB_08.Text & ", " & TB_09.Text 'Gesch. - PLZ + Ort
    36. xls_Blatt.Cells(26, 4) = TB_10.Text 'Gesch. - Telefon
    37. xls_Blatt.Cells(28, 4) = TB_11.Text 'Gesch. - Fax
    38. xls_Blatt.Cells(37, 4) = TB_12.Text 'Privat - Straße
    39. xls_Blatt.Cells(39, 4) = TB_13.Text & ", " & TB_14.Text 'Privat - PLZ + Ort
    40. xls_Blatt.Cells(41, 4) = TB_15.Text 'Privat - Telefon
    41. xls_Blatt.Cells(45, 4) = TB_16.Text 'Privat - email
    42. xls_Blatt.Cells(30, 4) = TB_17.Text 'Gesch. - mobil
    43. xls_Blatt.Cells(32, 4) = TB_18.Text 'Gesch. - email
    44. xls_Blatt.Cells(13, 4) = TB_19.Text 'Homepage
    45. xls_Blatt.Cells(47, 4) = TB_21.Text 'Bemerkung
    46. xls_Blatt.Cells(11, 4) = TB_22.Text 'Gesch. - Land
    47. xls_Blatt.Cells(35, 4) = TB_23.Text 'Zusatzadresse
    48. xls_Blatt.Cells(43, 4) = TB_24.Text 'Privat - Mobil
    49. 'xls_Blatt.Cells(1,1) = TB_ID.Text 'ID
    50. xls_Appl.Application.WindowState = Excel.XlWindowState.xlMinimized
    51. xls_Appl.Visible = True
    52. xls_Mappe.Close(SaveChanges:=True)
    53. xls_Appl.Quit()
    54. MessageBox.Show("Der Kontakt " & TB_06.Text & " " & TB_05.Text & " wurde unter C:\temp gespeichert")
    55. Else
    56. MessageBox.Show("Bitte Kontakt auswählen")
    57. End If
    58. End Sub


    Wie kann ich den Code hier eigentlich einbetten, dass es als "Spoiler" angezeigt wird? So wird der Thread ja Kilometerlang 8|

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sarah“ ()

    Laut stackoverflow sollte es so gehen (ungetestet):

    VB.NET-Quellcode

    1. xls_Mappe.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, Zielpfad)


    btw: Die #9-#17 kannst Du vereinfachen. Lass die Bedingungszeilen weg und lass nur die Replace-Zeilen stehen. Replace meckert nicht, wenn der gesuchte Text nicht gefunden wird, sondern macht einfach nix.
    Und: Die Zeilen#33-#55 verraten etwas: Statt durch Kommentare klarzumachen, was da nach Excel übertragen wird, benenne Deine TextBoxen entsprechend. Die meisten Kommentare im Code zeigen, dass man besser am Code selber was ändern sollte und sich den Kommentar einsparen kann.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Ja so geht das.
    Ich selbst benutze dazu eine Funktion, die eine List(of String) und den Pfad der Excel-Arbeitsmappe entgegen nimmt um die in der Liste enthaltenen Tabellenblätter zu drucken.
    Die Ausgabe geschieht im selben Verzeichnis, in dem die Arbeitsmappe liegt.

    Es ist bei mir gewollt, dass im Fehlerfalle keine Meldung ausgegeben wird!
    Übersetzt aus C# mit dem Telerik Converter.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Friend Shared Sub SaveWorksheetAsPDF(ByVal worksheets2print As List(Of String), ByVal excelPath As String)
    2. Dim excelApp As Excel.Application = New Excel.Application()
    3. Dim wb As Excel.Workbook = Nothing
    4. excelApp.DisplayAlerts = False
    5. Try
    6. excelApp.Workbooks.Open(excelPath)
    7. excelApp.Visible = False
    8. wb = excelApp.ActiveWorkbook
    9. Dim fname As String = Path.Combine(Path.GetDirectoryName(excelPath), Path.GetFileNameWithoutExtension(excelPath) & ".pdf")
    10. Dim fi As FileInfo = New FileInfo(fname)
    11. If fi.Exists Then fi.Delete()
    12. For x As Integer = excelApp.Sheets.Count To 0 + 1
    13. Dim sheet As Excel._Worksheet = CType(excelApp.Sheets(x), Excel._Worksheet)
    14. If sheet IsNot Nothing AndAlso worksheets2print.Contains(sheet.Name) = False Then excelApp.Sheets(x).Visible = Microsoft.Office.Interop.Excel.XlSheetVisibility.xlSheetHidden
    15. Next
    16. excelApp.ActiveWorkbook.ExportAsFixedFormat(Microsoft.Office.Interop.Excel.XlFixedFormatType.xlTypePDF, fname, Excel.XlFixedFormatQuality.xlQualityStandard, True, False, Type.Missing, Type.Missing, False)
    17. Catch __unusedException1__ As Exception
    18. Finally
    19. excelApp.Visible = False
    20. wb.Close(SaveChanges:=False)
    21. excelApp.Quit()
    22. If wb IsNot Nothing Then
    23. wb = Nothing
    24. End If
    25. If excelApp IsNot Nothing Then
    26. excelApp = Nothing
    27. End If
    28. GC.Collect()
    29. GC.WaitForPendingFinalizers()
    30. GC.Collect()
    31. GC.WaitForPendingFinalizers()
    32. End Try
    33. End Sub



    Nachtrag zum Spoiler:


    Korrekturen wo ich weiß, dass es in VB.Net nicht wie vom Übersetzer dargestellt programmiert wird.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Dksksm“ ()

    Mega!!! :thumbsup:

    Danke Euch beiden!!! Hat astrein funktioniert!

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Exportieren_Click(sender As Object, e As EventArgs) Handles Exportieren.Click
    2. If TB_ID.Text <> "" Then
    3. Dim Name As String = TB_06.Text
    4. Dim Vorname As String = TB_05.Text
    5. 'Sonderzeichen entfernen
    6. Name = Name.Replace("ä", "ae")
    7. Name = Name.Replace("ö", "oe")
    8. Name = Name.Replace("ü", "ue")
    9. Name = Name.Replace("ß", "ss")
    10. Dim xls_Kontakt As String = "C:\temp\" & Name & "_" & Vorname & ".xlsx"
    11. Dim pdf_Kontakt As String = "C:\temp\" & Name & "_" & Vorname & ".pdf"
    12. IO.File.Copy(xlsVorlage, xls_Kontakt, True)
    13. Dim xls_Appl As Excel.Application ' Excel Anwendung
    14. Dim xls_Mappe As Excel.Workbook ' Excel Arbeitsmappe
    15. Dim xls_Blatt As Excel.Worksheet ' Excel Blatt (Tabelle)
    16. 'Dim Anzahlzeilen As Integer
    17. xls_Appl = New Excel.Application() ' Excel Instanz bilden
    18. xls_Appl.Visible = False
    19. xls_Mappe = xls_Appl.Workbooks.Open(xls_Kontakt)
    20. xls_Blatt = CType(xls_Mappe.ActiveSheet, Excel.Worksheet)
    21. 'Zeile, Spalte
    22. xls_Blatt.Cells(3, 5) = TB_06.Text & " " & TB_05.Text 'Überschrift
    23. xls_Blatt.Cells(49, 6) = Now.ToShortDateString 'Stand
    24. xls_Blatt.Cells(5, 4) = TB_01.Text 'Firma
    25. xls_Blatt.Cells(16, 4) = TB_02.Text 'Position
    26. xls_Blatt.Cells(18, 4) = TB_03.Text 'Titel
    27. xls_Blatt.Cells(20, 4) = CB_04.Text 'Anrede
    28. xls_Blatt.Cells(22, 4) = TB_05.Text 'Vorname
    29. xls_Blatt.Cells(24, 4) = TB_06.Text 'Name
    30. xls_Blatt.Cells(7, 4) = TB_07.Text 'Gesch. - Straße
    31. xls_Blatt.Cells(9, 4) = TB_08.Text & ", " & TB_09.Text 'Gesch. - PLZ + Ort
    32. xls_Blatt.Cells(26, 4) = TB_10.Text 'Gesch. - Telefon
    33. xls_Blatt.Cells(28, 4) = TB_11.Text 'Gesch. - Fax
    34. xls_Blatt.Cells(37, 4) = TB_12.Text 'Privat - Straße
    35. xls_Blatt.Cells(39, 4) = TB_13.Text & ", " & TB_14.Text 'Privat - PLZ + Ort
    36. xls_Blatt.Cells(41, 4) = TB_15.Text 'Privat - Telefon
    37. xls_Blatt.Cells(45, 4) = TB_16.Text 'Privat - email
    38. xls_Blatt.Cells(30, 4) = TB_17.Text 'Gesch. - mobil
    39. xls_Blatt.Cells(32, 4) = TB_18.Text 'Gesch. - email
    40. xls_Blatt.Cells(13, 4) = TB_19.Text 'Homepage
    41. xls_Blatt.Cells(47, 4) = TB_21.Text 'Bemerkung
    42. xls_Blatt.Cells(11, 4) = TB_22.Text 'Gesch. - Land
    43. xls_Blatt.Cells(35, 4) = TB_23.Text 'Zusatzadresse
    44. xls_Blatt.Cells(43, 4) = TB_24.Text 'Privat - Mobil
    45. 'xls_Blatt.Cells(, 4) = TB_25.Text 'FREI
    46. 'xls_Blatt.Cells(, 4) = TB_ID.Text 'ID
    47. xls_Appl.Application.WindowState = Excel.XlWindowState.xlMinimized
    48. xls_Appl.Visible = True
    49. 'Esport als pdf
    50. xls_Mappe.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, pdf_Kontakt)
    51. xls_Mappe.Close(SaveChanges:=True)
    52. xls_Appl.Quit()
    53. IO.File.Delete(xls_Kontakt)
    54. MessageBox.Show("Der Kontakt " & TB_06.Text & " " & TB_05.Text & " wurde unter C:\temp gespeichert")
    55. Else
    56. MessageBox.Show("Bitte Kontakt auswählen")
    57. End If
    58. End Sub

    @VaporiZed
    Danke für den Hinweis mit den Raplace-Zeilen!

    Zu meinen 1000 kommentaren. Ja, da hab ich noch einige drin. Hab aber im Moment lieber noch zu viele Beschreibungen. Lieder einen zu viel wie zu wenig. Das wird sich bestimmt mit der Zeit verbesser, wenn ich die Codes dann auch immer mehr verstehe. Das extreme Beisiel mit meinen zig Textboxen hat einen Grun. Die Textboxen haben die Bezeichnung der Arrays aus meiner "Datenbank". Sonst blick ichs da nimmer 8|
    Aber wie gesagt... das wird sich mit der Zeit auf jeden Fall verbessern.

    Griaßle und einen schönen Tag Euch!!!
    Falls Du willst, kannst Du die Replaces auch koppeln:

    VB.NET-Quellcode

    1. Name = Name.Replace("ä", "ae").Replace("ö", "oe").Replace("ü", "ue").Replace("ß", "ss")

    Ob das für die Übersichtlichkeit förderlich ist, weiß ich nicht.
    Falls Du aber sowas häufiger brauchst, würd ich das dann sogar auslagern (hohes Framework wegen vereinfachten Tuples vorausgesetzt):

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim Text As String = "Das aöü ist dem ß voraus."
    4. MessageBox.Show(Text.Replace(("Ä", "Ae"), ("Ö", "Oe"), ("Ü", "Ue"), ("ä", "ae"), ("ö", "oe"), ("ü", "ue"), ("ß", "ss")))
    5. End Sub
    6. End Class
    7. Public Module Extensions
    8. <Runtime.CompilerServices.Extension>
    9. Public Function Replace(Text As String, ParamArray Replacings As (OldPart As String, NewPart As String)()) As String
    10. For Each Replacing In Replacings
    11. Text = Text.Replace(Replacing.OldPart, Replacing.NewPart)
    12. Next
    13. Return Text
    14. End Function
    15. End Module
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.