PyQt:在文档或.txt文件中查看查询结果

0 投票
2 回答
1012 浏览
提问于 2025-04-18 18:47

有没有办法把这个查询(以及类似的查询)的结果保存到一个.txt或者.doc文件,用户可以随意保存到自己想要的地方,如果需要的话还可以打印出来?

query.setQuery(""" SELECT * FROM "%s" WHERE METAPHONE("%s", 3) = METAPHONE('%s', 3) OR LEVENSHTEIN("%s", '%s') < 4 """ % (str(self.search_from_table_lineEdit.text()), str(self.search_where_lineEdit.text()), str(self.search_has_value_lineEdit.text()), str(self.search_where_lineEdit.text()), str(self.search_has_value_lineEdit.text())))
                     global var
                     var = QtGui.QTableView()
                     var.setModel(query)
                     var.show()

编辑:我试过这个:

class report_GUI(QtGui.QWidget, Ui_report_Widget):
       def __init__(self):
              QtGui.QWidget.__init__(self)
              self.setupUi(self)
              self.report_Create_Report_button.clicked.connect(self.report_data)

       def report_data(self):
              FILE_NAME = 'export.csv'
              exportQSqlQueryModel = QSqlQueryModel()
              exportQSqlQueryModel.setQuery(""" SELECT * FROM "%s" WHERE "%s" = '%s' """ % (str(self.report_from_table_lineEdit.text()), str(self.report_where_lineEdit.text()), str(self.report_has_value_lineEdit.text())))
              exportFile = open(FILE_NAME, 'wt')
              writer = csv.writer(exportFile)

              for row in exportQSqlQueryModel.rowCount():
                     listsTmpData = []
                     for column in exportQSqlQueryModel.columnCount():
                            listsTmpData.append(str(exportQSqlQueryModel.record(row).value(column).toString()))
                     writer.writerow(listsTmpData)
              exportFile.close()

结果出现了这个错误:

line 563, in report_data
    for row in exportQSqlQueryModel.rowCount():
TypeError: 'int' object is not iterable

编辑2:

def report_data(self):
              FILE_NAME = 'export.csv'
              exportQSqlQueryModel = QSqlQueryModel()
              exportQSqlQueryModel.setQuery(""" SELECT * FROM "%s" WHERE "%s" = '%s' """ % (str(self.report_from_table_lineEdit.text()), str(self.report_where_lineEdit.text()), str(self.report_has_value_lineEdit.text())))
              exportFile = open(FILE_NAME, 'wt')
              writer = csv.writer(exportFile)

              if (self.report_from_table_lineEdit.text() == "pacijent"):
                  exportQSqlQueryModel.setHeaderData(0, QtCore.Qt.Horizontal, 'OIB pacijenta')
                  exportQSqlQueryModel.setHeaderData(1, QtCore.Qt.Horizontal, 'Prezime')
                  exportQSqlQueryModel.setHeaderData(2, QtCore.Qt.Horizontal, 'Ime')
                  exportQSqlQueryModel.setHeaderData(3, QtCore.Qt.Horizontal, 'ID sobe')
                  exportQSqlQueryModel.setHeaderData(4, QtCore.Qt.Horizontal, 'Adresa')
                  exportQSqlQueryModel.setHeaderData(5, QtCore.Qt.Horizontal, 'Datum rodjenja')
                  exportQSqlQueryModel.setHeaderData(6, QtCore.Qt.Horizontal, 'Spol')

              listsTmpData = []
              for row in range(exportQSqlQueryModel.rowCount()):
                     listsTmpData.append(str(exportQSqlQueryModel.headerData(row, QtCore.Qt.Horizontal)))
              writer.writerow(listsTmpData)

              for row in range(exportQSqlQueryModel.rowCount()):
                     listsTmpData = []
                     for column in range(exportQSqlQueryModel.columnCount()):
                            listsTmpData.append(str(exportQSqlQueryModel.record(row).value(column)))
                     writer.writerow(listsTmpData)
              exportFile.close()

它只显示了前四个列标题,结果看起来像这样:http://oi62.tinypic.com/2guxf5t.jpg

2 个回答

0

如果你在Linux终端里有一个单独的.py文件,想要运行这个代码,只需要输入这个命令:

python your_file_nam > ex_file.txt 
2

我建议使用csv格式,这样更容易阅读。可以参考这个例子

这里有个简单的例子:

import csv
import sys
from PyQt4 import QtCore, QtGui, QtSql

FILE_NAME = 'export.csv'
# .
# .
# .

exportQSqlQueryModel = QtSql.QSqlQueryModel()
exportQSqlQueryModel.setQuery('YOUR QUERY')
# .
# . # Do anything in query
# .

# Open file
exportFile = open(FILE_NAME, 'wt')
writer     = csv.writer(exportFile)

# If your don't have header data, Your can delete this section
listsTmpData = []
for column in range(exportQSqlQueryModel.columnCount()):
    listsTmpData.append(str(exportQSqlQueryModel.headerData(column, QtCore.Qt.Horizontal).toString()))
writer.writerow(listsTmpData)

# Write file
for row in range(exportQSqlQueryModel.rowCount()):
    listsTmpData = []
    for column in range(exportQSqlQueryModel.columnCount()):
        listsTmpData.append(str(exportQSqlQueryModel.record(row).value(column).toString()))
    writer.writerow(listsTmpData)
exportFile.close()

如果你想在导出的文件中包含标题,请在QSqlQueryMode.setHeaderData中设置标题,并在导出数据之前写入它们;

.
.
.
exportQSqlQueryModel.setHeaderData(0, QtCore.Qt.Horizontal, 'Name')
exportQSqlQueryModel.setHeaderData(1, QtCore.Qt.Horizontal, 'Age')
.
.
.
listsTmpData = []
for column in range(exportQSqlQueryModel.columnCount()):
    listsTmpData.append(str(exportQSqlQueryModel.headerData(column, QtCore.Qt.Horizontal).toString()))
writer.writerow(listsTmpData)
.
.
.

要在open office calc中查看你的数据,确保你的设置使用逗号来正确分隔数据;

使用open office calc查看csv

撰写回答