Etiketten-Ersatz für Serienbrief

Outsider77

Erfahrenes Mitglied
Hallo zusammen,
zur Zeit drucken wir Etiketten über die Word-Serienbrief-Funktion.
Eigentlich auch nur indirekt, da ein VB-Proggi das erledigt.
Jetzt würde ich gerne komplett auf Word verzichten.
Hab ein Wenig gelesen und dachte, ich mache es per
Visual Basic:
DrawString

Die Daten werden aus einer txt-Datei gelesen,pro Etikett eine Teile,
die Daten Teilenummer, Größe, Datum und Teilename sind durch Semikolon getrennt.
Diese 4 Elemente sollen pro Etikett untereinander gedruckt werden, es befinden sich
6 Etiketten in einer Reihe.
Größe eines Etiketts = 30mmx23mm, Abstand zwischen den Etiketten einer Reihe = 10mm.
Kann mir bitte jemand einen Denkansatz geben, damit ich mal in etwa weiß, wie ich anfangen muß?

Bin für jede Hilfe dankbar.

Gruß Outi
 
OK, danke für die Links! Das mit dem Drucken ist machbar ;-)
Jetzt muß ich vorher nur noch zeilenweise auslesen und nach jeweils
6 Zeilen auf eine neue Reihe Etiketten springen.
Wie schaffe ich es,daß er nach jeder Zeile der Textdatei ein Feld/Etikett nach rechts springt
und nach jeder 6.Zeile eine Reihe runter? Sprich wie sind die x und y Werte zu vergeben?

Gruß Outi

Edit:
Hab es jetzt selber gelöst bekommen.
Ich habe mir den Code aus einem anderen Beitrag genommen und ein Wenig angepaßt.
Visual Basic:
Private Sub Einlesen()
        Dim stream As System.IO.StreamReader
        Dim rows_count As Integer = 0
        Dim zeile_split() As String

        stream = My.Computer.FileSystem.OpenTextFileReader("C:\Users\Markus\Documents\Etiketten\1234567-test.docx")
        While Not stream.EndOfStream
            Dim auslesen As String = stream.ReadLine
            ReDim Preserve str_array(rows_count)
            rows_count += 1
            zeile_split = auslesen.Split(";")
            teile_nummer = zeile_split(1)
            grössengang = zeile_split(2)
            datum = zeile_split(4)
            teile_name = zeile_split(5)
            str_array(rows_count - 1) = (teile_nummer & vbCrLf & grössengang & vbCrLf & datum & vbCrLf & teile_name)
        End While
        stream.Close()
    End Sub
Text-Datei zeilenweise auslesen, splitten und als String in Array speichern.

Visual Basic:
Private Sub Draw(ByVal g As Graphics, ByVal x As Integer, ByVal y As Integer)
        Dim c As Color = Color.Black
        Dim f As Font = New Font("Arial", 10)

        For i As Integer = LBound(str_array) To UBound(str_array)
            If (i + 1) Mod 6 = 0 Then
                g.DrawString(str_array(i), f, New SolidBrush(c), New Point(x + 2, y + 2))
                x = 0 : y += abstand_y
            Else
                g.DrawString(str_array(i), f, New SolidBrush(c), New Point(x + 2, y + 2))
                x += abstand_x
            End If
        Next
    End Sub
Das Array vom ersten bis letzten Eintrag einzeln als String zeichnen, dabei nach 6 Einträgen y-Wert erhöhen für neue Zeile.
 
Zuletzt bearbeitet:
Hallo zusammen,
ich hatte das Projekt jetzt eine Weile liegen lassen. Gestern habe ich es wieder zur Hand genommen und ich muss nun doch noch einmal nachfragen, da sich mir ein kleines Problem ergibt.
Für unsere Etiketten wollte ich zur richtigen Positionierung zunächst einmal nur das Raster (Ränder der Etiketten) ausdrucken.
Dazu folgender Code:
Visual Basic:
Imports System.Drawing.Printing

Public Class Form1

    Dim abstand_x As Decimal, abstand_y As Decimal

    Private WithEvents doc As New PrintDocument()

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        abstand_x = CDec(35.5)
        abstand_y = CDec(25.5)

        Me.NumericUpDown1.Value = abstand_x
        Me.NumericUpDown2.Value = abstand_y

    End Sub

    Private Sub Draw(ByVal g As Graphics, ByVal x As Integer, ByVal y As Integer)
        Dim c As Color = Color.Black

        For i As Integer = 0 To 45
            If (i + 1) Mod 6 = 0 Then
                g.DrawRectangle(New Pen(c), x, y, 30.5, 23)
                x = 0 : y = CInt(y + abstand_y)
            Else
                g.DrawRectangle(New Pen(c), x, y, 30.5, 23)
                x = CInt(x + abstand_x)
            End If
        Next
    End Sub

    Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
        abstand_x = Me.NumericUpDown1.Value
    End Sub

    Private Sub NumericUpDown2_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown2.ValueChanged
        abstand_y = Me.NumericUpDown2.Value
    End Sub

    Private Sub Drucker(ByVal sender As Object, ByVal e As PrintPageEventArgs) Handles doc.PrintPage
        Dim g As Graphics = e.Graphics
        g.PageUnit = GraphicsUnit.Millimeter
        g.TextRenderingHint = Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit
        Me.Draw(g, 0, 0)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        doc.Print()
    End Sub
End Class
Die Abstände (tatsächliche Werte für x und y) habe ich an den Etiketten nachgemessen.
Über die NumericUpDown wollte ich mit den Werten spielen, bis es paßt. Dabei ist mir aufgefallen, dass die Dezimal-Werte gar nicht eingesetzt werden, sondern immer der jeweils nächste gerundete Wert. Also für den x-Wert z.Bsp. bis 35.4mm nimmt er 35mm, ab 35.5mm nimmt er 36mm. Habe das per Einzelschritt auch nachverfolgt.
Nun ist der tatsächliche Abstand aber 35.5mm, gibt es eine Möglichkeit, dass dieser Wert auch wirklich eingesetzt wird oder funktioniert die DrawRectangle-Methode nur mit Ganzzahlen?

Außerdem habe ich das Problem, dass nach 12 Zeilen (augenscheinlich 1 Seite) nicht weiter gedruckt wird. Ich habe etwas gefunden, hasmorepages, allerdings läuft das Ganze dann in eine Endlos-Schleife.

Danke für die Hilfe!

Gruß Outi
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück