Seite 1 von 1

Wie kann man Daten im Tabellenformat drucken?

Verfasst: Dienstag 1. September 2009, 14:28
von klaus66
Hallo zusammen,
ich habe unter Qt4Py eine Applikation gebaut, die mit mehreren Tabellen arbeitet. Die Applikation erstellt Einrahmungs Aufträge, die in einer SQL3 DB abgespeichert werden. Das alles funktioniert hervorragend und sieht auch super aus.
Das Ganze ist natürlich kein Selbstzweck und keine Spielerei. In der Praxis brauche ich jetzt einen vernünftig formatierten Ausdruck jedes Auftrags als Beleg. Und da beginnt mein Problem. Wie kriege ich eine Tabelle programm gesteuert, genau so ausgedruckt, wie am Bildschirm angezeigt.
Alle Versuche mit Formatanweisung (u"%s...." usw.) führen selbst bei Unispace-Schriften nur zu sehr unschönen, schlecht formatierten Ausdrucken.

Hat jemand eine Idee, wie man Tabellen tabellarisch drucken kann? Mir schwebt ein Verfahren vor, wie ich es mit OpenOffice realisiert hatte. Dort kann ein Tabellen-Formular erzeugen, in dem man jede Zelle direkt adressieren kann. Aber ich will natürlich kein OOo verwenden.

Verfasst: Donnerstag 3. September 2009, 07:02
von franzf
Hmmm... Bei Tabelle fällt mir als erstes immer HTML ein.
Du könntest deine ganzen Daten über eine <table> in ein QTextDocument packen. Hat den Vortiel, dass du auch noch nen (schön formatierten) Vorspann und Nachspann und sonstwas (z.B. weitere Tabellen :)) mit einbinden kannst.

Wenn du einfach nur das Widget rendern willst, das geht natürlich auch :D

Code: Alles auswählen

t = QTableWidget(10,10)
p = QPrinter()
p.setOutputFormat(QPrinter.PdfFormat)
p.setOutputFileName("/tmp/test.pdf")
t.render(p)
Ist natürlich nicht der Hit bei ner Tabelle :P

Verfasst: Donnerstag 3. September 2009, 10:52
von klaus66
@franzf,
danke, das war schon mal ein guter Hinweis, der mich möglicherweise auf die richte Spur gebracht hat. :wink:
Manchmal sitzt man vor dem Bildschirm und sieht den Wald vor lauter Bäumen nicht.
Nochmal danke,

Verfasst: Samstag 5. September 2009, 17:37
von klaus66
Ich fürchte ich brauche doch noch mal einen Anstoß, um weiter zu kommen. Ich schaffe es zwar den Beitext und die Tabelle zu drucken, aber immer auf einer separaten Seite. Das ist natürlich nicht das was ich will. Ich brauche ein druckbares Dokument, in dem sowohl der Text als auch die Tabelle als gerenderte Grafik enthalten ist.

Jetzt bemühe ich mich den Text und die Tabelle in ein QTextDocument einzufügen. Mit dem Text hab ich kein Problem. Nur bei der Tabelle kapier ich nicht, wie ich die in das QTextDocument einfügen kann. :(

Vielleicht kann mir mal jemand auf die Sprünge helfen. :wink:

Verfasst: Samstag 5. September 2009, 18:02
von franzf
Die komplette Seite samt Begleittext in HTML packen?
Also z.B.:

Code: Alles auswählen

pg = ""
pg += "Das ist der <i>Begleittext</i>"
# usw.
row = 0
while row < table.rowCount():
    pg += "<tr>"
    col = 0
    while col < table.columnCount():
        pg += "<td>"
        item = table.item(row, col)
        if item:
            pg += item.data(Qt.DisplayRole)
        col += 1
        pg += "</td>"
    row += 1
    pg += "</tr>"
pg += "</table"
doc = QTextDocument()
doc.setHtml(pg)
So in etwa dachte ich mir das.
Ansonsten kannst du auch den schwereren Weg gehen und alles Daten selber in Pixmaps rendern, die du dann millimetergenau auf deinem Drucker platzieren kannst.

Oder du malst mit nem Painter direkt auf den Printer (QPrinter ist auch nur ein QPaintDevice, welches du einem QPainter.begin() mitgeben kannst). Ist die umständlichste Lösung, aber wohl die mit den bestmöglichen Resultaten.

Verfasst: Montag 7. September 2009, 18:35
von Ene Uran
Hier is ein kleines Beispiel, was so wenigstens die HTML Code betrifft:

Code: Alles auswählen

# PyQT's QLabel widget can display html formatted text
# used here to display data in a nice table
# tested with Python 3.1.1 and PyQT 4.5.2
# ene

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MyForm(QWidget):
    def __init__(self, html_table):
        QWidget.__init__(self)
        # setGeometry(x_pos, y_pos, width, height)
        # widget will expand to fit lable size
        self.setGeometry(100, 150, 1, 1)
        self.setWindowTitle("html formatted data table")

        label = QLabel(html_table)

        # use the grid layout manager
        grid = QGridLayout()
        # addWidget(widget, row, column, rowSpan=1, columnSpan=1)
        grid.addWidget(label, 0, 0)
        self.setLayout(grid)


def make_html_table(data_list):
    """
    use a list of data tuples and create the html code
    of a html formatted table containing the data items
    """
    rows = len(data_list)
    columns = len(data_list[0])
    # color is in hex format "#RRGGBB"
    html = '<table border="5" bordercolor="#0000cc" cellspacing="5" '
    html += 'cellpadding="5" width="5" bgcolor="#ffff66">\n'
    for row in range(rows):
        html += '<tr>\n'
        for col in range(columns):
            item = data_list[row][col]
            html += "    %s%s%s\n" % ('<td>', item, '</td>')
        html += '</tr>\n'
    html += '</table>\n'
    return html


# a list of (name, age, weight) tuples
# the first tuple is the header
data_list = [
('Name', 'Age', 'Weight'),
('Heidi Kalumpa', '36', '127'),
('Frank Maruco', '27', '234'),
('Larry Pestraus', '19', '315'),
('Serge Romanowski', '59', '147'),
('Carolus Arm', '94', '102'),
('Michel Sargnagel', '21', '175')
]

html_table = make_html_table(data_list)

#print(html_table)  # for test only

app =  QApplication([])
form = MyForm(html_table)
form.show()
app.exec_()


Verfasst: Dienstag 8. September 2009, 08:25
von klaus66
Erstmal vielen Dank für Eure Hilfe und Anregungen.

Ich befinde mich noch in der Testphase mit PlainText und Formatstrings, weil alles andere nicht so geklappt hat, wie ich es mir vorstelle.
Das ist ein mühseeliges Geschäft, eine Art Erbsenzählerei!
Aber es scheint jetzt hinzuhauen und ist im Grunde vom Programm her die simpelste Lösung, wenn auch nicht die eleganteste. :wink:

Verfasst: Freitag 11. September 2009, 12:34
von microkernel
Hallo,
hab so ein ähnliches Problem. Nur das ich schon meine Tabelle im richtigen Format habe. Ich weiß jetzt nur nicht wie man texte, tabelle und/oder ect. überhaupt drucken kann.
Kann mir da jemand helfen?

Liebe Grüße
microkernel.