如何使用PyQt5 Python将QTableWidget数据转换为PDF

问题描述

我正在处理一个Python项目,其中数据存储在QTableWidget中。我必须将此数据导出到excel sheetPDF中。我已经可以使用以下代码将数据导出到excel sheet。但是无法理解如何将其转换为PDF

filename,_ = QFileDialog.getSaveFileName(self,'Save File','',".xls(*.xls)")
wbk = xlwt.Workbook()
sheet = wbk.add_sheet("sheet",cell_overwrite_ok=True)
style = xlwt.XFStyle()
font = xlwt.Font()
font.bold = True
style.font = font
model = self.home_ui.reports_table.model()

for c in range(model.columnCount()):
    text = model.headerData(c,QtCore.Qt.Horizontal)
    first_col = sheet.col(c+1)
    l = len(text)
    first_col.width = (256 * l) + 1000
    sheet.write(0,c + 1,text,style=style)

for r in range(model.rowCount()):
    text = model.headerData(r,QtCore.Qt.Vertical)
    sheet.write(r + 1,style=style)

for c in range(model.columnCount()):
    for r in range(model.rowCount()):
        text = model.data(model.index(r,c))
        sheet.write(r + 1,text)

wbk.save(filename)

以上代码可以正常工作,并且可以将数据保存到excel。

我研究了其他具有相同主题questions,但所有这些都使用c ++。我正在寻找等效的python。

谁能给我一些有关如何将数据转换为PDF的好的建议。请帮忙。谢谢

解决方法

当您查看答案时,您不仅应该看到代码,而且应该看到解决方案本身,即后台的逻辑。在这种情况下,解决方案是创建一个显示表格内容的HTML,然后将QTextDocument和QPrinter一起使用以将HTML打印为PDF。

考虑到上述情况,由于逻辑清晰,因此无需进行翻译,因为它足以从头开始实现。

from PyQt5 import QtCore,QtGui,QtWidgets,QtPrintSupport

app = QtWidgets.QApplication([])

w = QtWidgets.QTableWidget(10,10)
for i in range(10):
    for j in range(10):
        it = QtWidgets.QTableWidgetItem("{}-{}".format(i,j))
        w.setItem(i,j,it)


filename = "table.pdf"
model = w.model()

printer = QtPrintSupport.QPrinter(QtPrintSupport.QPrinter.PrinterResolution)
printer.setOutputFormat(QtPrintSupport.QPrinter.PdfFormat)
printer.setPaperSize(QtPrintSupport.QPrinter.A4)
printer.setOrientation(QtPrintSupport.QPrinter.Landscape)
printer.setOutputFileName(filename)

doc = QtGui.QTextDocument()

html = """<html>
<head>
<style>
table,th,td {
  border: 1px solid black;
  border-collapse: collapse;
}
</style>
</head>"""
html += "<table><thead>"
html += "<tr>"
for c in range(model.columnCount()):
    html += "<th>{}</th>".format(model.headerData(c,QtCore.Qt.Horizontal))

html += "</tr></thead>"
html += "<tbody>"
for r in range(model.rowCount()):
    html += "<tr>"
    for c in range(model.columnCount()):
        html += "<td>{}</td>".format(model.index(r,c).data() or "")
    html += "</tr>"
html += "</tbody></table>"
doc.setHtml(html)
doc.setPageSize(QtCore.QSizeF(printer.pageRect().size()))
doc.print_(printer)