Hola, tambien soy de Lima pero no vivo en Peru ahora, es un placer poder ayudarte, espero sea asiiiiiiiiii........
Este sencillo ejemplo utiliza:
DataGridView llamado datagvDatos
Boton llamado cmdPrint
PrintPreviewDialog1
PrintDocument1
Este ejemplo obtiene los datos de un datagridview el cual lo puedes imprimir
para este ejemplo utilizo una consulta con 3 columna de una tabla, para hacerlo mas sencillo.....
Este codigo pegalo en un form en blanco, modifica la cadena sql de conexion.
Existe un Sub llamado Rellenar, que hace????, rellena con espacios en blanco, dependiendo de la cantidad que hayas dado en la variable digito.
Si por ejemplo el 1er valor de la columna tiene 4 caracteres y le pasas a digito 6
entonces insertara 2 caracteres en blanco. esto es para darle formato en la salida en la impresion, de esta manera todos los datos estan alineados.
Importante, debes insertar las columnas que desees en el Sub Rellenar (dentro del select si deseas mas de 3 columnas que son las que soporta este ejemplo)
Imports System.Data.SqlClient
Public Class Form1
Private printFont As Font
Dim ncadena As String
Dim count As Integer = 0
Dim dst As DataSet
Dim da As New SqlDataAdapter
Dim conectar As New SqlConnection
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
conectar.ConnectionString = "Data Source=127.0.0.1;DataBase=ISAliments;Integrated Security=SSPI"
Dim cmd As New SqlCommand
conectar.Open()
cmd.Connection = conectar
cmd.CommandText = "Select IdCliente,NombreCliente,NumeroIdentidad from Clientes"
cmd.CommandType = CommandType.Text
cmd.ExecuteNonQuery()
da.SelectCommand = cmd
dst = New DataSet
da.Fill(dst, "Clientes")
Me.datagvDatos.DataSource = dst.Tables(0)
PrintPreviewDialog1.Document = PrintDocument1
End Sub
Sub RellenarEsp(ByVal str As String, ByVal columna As Int32)
Dim r As Int32
Dim cad As String = ""
Dim digito As Int32
ncadena = ""
Dim numcif As Int32 = str.Length
Select Case columna ' Obtiene los valores de 3 columnas
Case 0 : digito = 10 'espacios q contendra la 1era columna en la hoja
Case 1 : digito = 36 'espacios q contendra la 2da columna en la hoja
Case 2 : digito = 12 'espacios q contendra la 3era columna en la hoja
End Select
If numcif > digito Then
ncadena = Mid(str, 1, digito)
Else
For r = 1 To (digito - numcif)
cad = " "
ncadena = ncadena & cad
Next
ncadena = str & ncadena
End If
End Sub
Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim linesPerPage As Single = 0
Dim yPos As Single = 0
Dim leftMargin As Single = 30
Dim topMargin As Single = e.MarginBounds.Top - 50
Dim line As String = Nothing
linesPerPage = e.MarginBounds.Height / printFont.GetHeight(e.Graphics)
Dim Fil, Col As Int32
Dim LString As String = ""
LString = LString & "Documento interno del almacén " & vbCrLf & vbCrLf & vbCrLf & vbCrLf
LString = LString & " INFORMACION DE CLIENTES " & vbCrLf & vbCrLf & vbCrLf & vbCrLf
LString = LString & " Fecha:" & Today & vbCrLf & vbCrLf & vbCrLf
LString = LString & "IdCliente Nombre DNI " & vbCrLf & _
"------------------------------------------------------------------------------------------------" & vbCrLf & vbCrLf
count = 0
For Fil = 0 To datagvDatos.Rows.Count - 1
For Col = 0 To datagvDatos.Columns.Count - 1
Call RellenarEsp(datagvDatos.Item(Col, Fil).Value.ToString, Col)
LString = LString & ncadena & Space(3)
Next
count += 1
LString = LString & vbCrLf
Next
yPos = topMargin + (count * printFont.GetHeight(e.Graphics))
e.Graphics.DrawString(LString, printFont, Brushes.Black, leftMargin, yPos, New StringFormat())
If Not (line Is Nothing) Then
e.HasMorePages = True
Else
e.HasMorePages = False
End If
End Sub
Private Sub cmdPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdPrint.Click
If datagvDatos.Rows.Count > 0 Then
Try
printFont = New Font("Courier new", 9)
'Con la linea siguiente puedes imprimir obviando mostrar la vista previa
'para eso debes deshabilitar las 2 lineas que le preceden
'PrintDocument1.Print()
'Vemos una vista previa de nuestra impresion sin imprimir.
PrintPreviewDialog1.Width = 600
PrintPreviewDialog1.ShowDialog()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End If
End Sub
End Class