Drucken mit externer Druckerauswahl

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Bmwf30.

    Drucken mit externer Druckerauswahl

    Hallo zusammen!

    ich habe ein kleines Problem:
    ich habe ein kleines Formular erstellt mit Textboxen (usw.) welche hinterher in eine Excel Tabelle gespeichert werden.
    Jetzt möchte ich meine Excel Datei drucken.
    Allerdings mit einem bestimmten Drucker.
    Ich habe eine Druckerauswahl erstellt (Form), in der der Druckername in eine externe Datei unter AppData gespeichert wird. Das funktioniert auch alles wunderbar.
    Jetzt weiß ich nur nicht, wie ich die Excel-Tabelle mit diesem ausgewähltem Drucker drucken lassen soll.

    Könnt ihr mir da weiter helfen? :)
    LG
    Hi,

    das grundsätzliche drucken mit einer externen Anwendung kannst du über Process.StartInfo realisieren. Ein etwas älteres Beispiel findest du z.B. hier: VB-fun.de
    Dafür muss Excel allerdings als Standartprogramm festgelegt sein. Der Code wirkt ungefähr so, wie wenn du einen Rechtsklick auf die Datei machst und "Drucken" auswählst.

    Bmwf30 schrieb:

    drucken lassen
    geht nur mit dem Standarddrucker.
    Wenn Du das Dokument selbst druckst (PrintDocument), kannst Du den Drucker vorgeben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany:
    mein bisheriger Code zum drucken (mit dem Stadarddrucker) ist:

    Quellcode

    1. Dim ExterneAnwendung As New System.Diagnostics.Process()
    2. ExterneAnwendung.StartInfo.FileName = AppData & "\VB-Test\test.xlsx"
    3. ExterneAnwendung.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    4. ExterneAnwendung.StartInfo.Verb = "print"
    5. ExterneAnwendung.Start()
    6. ExterneAnwendung.Close()​


    Wie mach ich das mit dem PrintDocument?
    Ich hab zwar schon ein bisschen gegooglet, aber nicht wirklich druchgeblickt :/

    Bmwf30 schrieb:

    PrintDocument
    Gugst Du hier.
    Schalte da noch einen PrintDialog davor.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Bmwf30 schrieb:

    dass es direkt aus meinem vorher definiertem Drucker raus kommt.
    Jou, habs mal getestet, dies hier druckt auf den vorgegebenen Drucker:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Me.PrintDocument1.PrinterSettings.PrinterName = "PDF Printer" ' Name Deines Druckers
    3. Me.PrintDocument1.Print()
    4. End Sub
    5. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    6. e.Graphics.DrawString("Test", New Font("Arial", 15), Brushes.Black, New Point(20, 20))
    7. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Me.PrintDocument1.PrinterSettings.PrinterName = "PDF Printer" ' Name Deines Druckers


    Wenn ich da meinen Drucker manuell eingebe druckt er mir den Text aus. :thumbup:
    Wenn ich aber den Drucker aus meiner Datei oder aus einem Label auslese, sagt er:

    Quellcode

    1. InvalidPrinterException wurde nicht behandelt... ...Stellen Sie sicher, dass der Drucker vorhanden ist.
    :thumbdown:

    &

    RodFromGermany schrieb:


    VB.NET-Quellcode

    1. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    2. e.Graphics.DrawString("Test", New Font("Arial", 15), Brushes.Black, New Point(20, 20))
    3. End Sub


    Wie bekomme ich da jetzt meine Excel Tabelle rein?
    Danke schonmal :)

    Bmwf30 schrieb:

    Wenn ich aber den Drucker aus meiner Datei oder aus einem Label auslese, sagt er
    Den richtigen Namen bekommst Du vom PrintDialog.
    Pack die Excel-Tabelle in ein DGV und drucke dies, dazu gibt es viele Code-Beispiele.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also den Namen lese ich bisher so aus:

    VB.NET-Quellcode

    1. Private Sub printer_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim pd As New Printing.PrintDocument()
    3. Dim s As String
    4. Dim i As Integer
    5. Dim j As Integer
    6. For Each s In Printing.PrinterSettings.InstalledPrinters
    7. ComboBox1.Items.Add(s)
    8. If CStr(ComboBox1.Items.Item(i)) = _
    9. pd.PrinterSettings.PrinterName Then
    10. j = i
    11. End If
    12. i += 1
    13. Next
    14. ...


    Dann Speicher ich das in eine Textdatei und die lese ich dann hinterher wieder aus...
    Aber da kommt ja dieser Fehler...

    RodFromGermany schrieb:

    DGV

    Naja, da kommt ja aber dann eine Vorschau der Datei oder?
    Ich glaube mir würde da ein kleines Code-Beispiel helfen... Sry. Anfänger :(

    Bmwf30 schrieb:

    Sry. Anfänger
    OK, dann verwende die Suchfunktion, hier im Forum und Frau Google.
    Stichworte, einzeln abarbeiten:
    Excel Datei einlesen DataTable
    DataTable drucken
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    also um nochmal auf den Anfang zu gehen:
    Drucken mit externer Druckerauswahl
    ist bisserl unerfreulich.
    Wäre der Standard-Drucker hinreichend, könnte man die Excel-Datei direkt mit einem PrintOut an Excel zum Ausdruck übergeben, und alles wäre gut.

    mit selbstgewähltem Drucker wirds Schwieriger, da kann man einen PrintDialog öffnen, um für seine eigene Anwendung den Drucker festzulegen, aber dann muss man auch selber drucken - und Tabellen drucken ist nicht trivial, Excel-Tabellen mit ihren millionen Formatierungs-Möglichkeiten schoma garnet.

    Also wie Rod schon sagt, muss man bei selbst-Drucker-Wählen die Excel-Tabelle erstmal in eine DataTable laden, und dann muss man eiglich OwnerDrawing lernen, denn in .Net ist Drucken ein OwnerDraw-Vorgang, also man muss alles selbst hinmalen, jede Zelle, jede GridLine, jeden String, BackColor, ForeColor und hastenichjesehn.

    Also bis zum Einstellen des Druckers kann einen dieses Beispiel weiterhelfen, und auch das mit dem Page-Counter ist bei Tabellen prinzipiell ähnlich: activevb.de/cgi-bin/tippupload/preview.pl?tippnr=218
    (ja, ok, gibts vmtl. viel zu im INet, aber was davon ist anfänger-verständlich)

    ErfinderDesRades schrieb:

    Wäre der Standard-Drucker hinreichend, könnte man die Excel-Datei direkt mit einem PrintOut an Excel zum Ausdruck übergeben, und alles wäre gut.


    Ja gut. Das wäre eine Idee..
    Wie kann ich beim Start des Programms den Standarddrucker denn ändern?
    Ich hab auch schon ein bisschen gegooglet aber die Codes funktionieren bei meinem VS2013 nicht :/

    Bmwf30 schrieb:

    aber die Codes funktionieren bei meinem VS2013 nicht
    welche?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Bmwf30 Der 1. Link funktioniert perfekt, nimm einfach den XP-Test raus, sofern Du mit einem System ab XP arbeitest.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Bmwf30 schrieb:

    leider
    bist Du noch nicht befähigt, aus der Liste der Imports ein TODO abzuleiten.
    Füge die System.Management.dll Deinem Projekt als Verweis hinzu.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Naja,... also ich habe eine (für mich) schnellere Lösung gefunden.
    Ich ändere den Standarddrucker mit einer Batch Datei mit einer Zeile Code und rufe diese dann auf

    Quellcode

    1. rundll32 printui.dll,PrintUIEntry /y /n freepdf


    Danke trzdm