Qt6 Python SQLServer 取引先一覧表
Qt6Creatorでプロジェクト LstTorihikisakiを作成
LstTorihikisaki.pyproject LstTorihikisaki.py form.ui を作成
form.ui は、pyside6-uic form.ui -o ui_form.py を実行して ui_form.py を作成します。pymssqlを利用してSQLServerへ接続します。pdf作成は、reportlabを利用します。
form.ui
LstTorihikisaki.py
# This Python file uses the following encoding: utf-8
import sys
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QMainWindow,QMessageBox
# Important:
# You need to run the following command to generate the ui_form.py file
# pyside6-uic form.ui -o ui_form.py, or
# pyside2-uic form.ui -o ui_form.py
from ui_form import Ui_LstTorihikisaki
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, landscape, portrait
from reportlab.lib.pagesizes import A3
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.platypus import Table, TableStyle
import webbrowser
import pymssql
import csv
class LstTorihikisaki(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = Ui_LstTorihikisaki()
self.ui.setupUi(self)
self.ui.lineEdit.returnPressed.connect(self.edit_2)
self.ui.lineEdit_2.returnPressed.connect(self.edit_1)
self.ui.label.setAlignment(Qt.AlignCenter)
self.ui.label_2.setAlignment(Qt.AlignCenter)
self.ui.lineEdit.setAlignment(Qt.AlignRight)
self.ui.lineEdit_2.setAlignment(Qt.AlignRight)
self.ui.pushButton.clicked.connect(self.pdfwrt)
self.ui.pushButton_2.clicked.connect(self.exit)
self.ui.label.setStyleSheet("background-color: pink")
self.ui.label_2.setStyleSheet("background-color: violet")
self.ui.pushButton.setStyleSheet("background-color: aqua")
self.ui.pushButton_2.setStyleSheet("background-color: green")
def exit(self) -> None:
sys.exit()
#self.close()
def edit_1(self):
self.ui.lineEdit.focusPreviousChild()
def edit_2(self):
self.ui.lineEdit_2.focusNextChild()
def pdfwrt(self):
sttstr = self.ui.lineEdit.text()
endstr = self.ui.lineEdit_2.text()
try:
sttint = int(sttstr)
endint = int(endstr)
except:
QMessageBox.warning(self,'エラー','数値エラー')
self.edit_1()
return
else:
if sttint > endint:
QMessageBox.warning(self,'エラー','範囲エラー')
self.edit_1()
return
server = '192.168.10.111'
username = 'sa'
password = 'xxxxxxxx'
database = 'kakei'
try:
conn = pymssql.connect( server , username , password, database )
tablenm = "取引先マスター"
cursor = conn.cursor()
sql = "select * from " + tablenm
sql += " where 取引先コード >= " + str(sttint) + " and 取引先コード <= " + str(endint)
sql += " order by 取引先コード"
cursor.execute(sql)
results = cursor.fetchall()
#用紙サイズ
ans = 1
# 白紙をつくる
FILENAME = 'LstTorihikisaki.pdf'
if ans == 1:
c = canvas.Canvas(FILENAME, pagesize=portrait(A4))
gyosuu = 50 #a4縦 50
elif ans == 2:
c = canvas.Canvas(FILENAME,pagesize=landscape(A4))
gyosuu = 34 #a4横 34
elif ans == 3:
c = canvas.Canvas(FILENAME,pagesize=landscape(A3))
gyosuu = 50 #a3横 34
else:
pass
# フォント登録
pdfmetrics.registerFont(UnicodeCIDFont('HeiseiMin-W3'))
pdfmetrics.registerFont(UnicodeCIDFont("HeiseiKakuGo-W5"))
page = 0
hedcol = ['コード','取引先名','取引先区分']
tb = []
tb.append(hedcol,)
row = 0
for res in results:
rowdta = []
rowdta.append(str(res[0]))
rowdta.append(str(res[1]))
rowdta.append(str(res[2]))
tb.append(rowdta)
if row == gyosuu:
c.setFont('HeiseiKakuGo-W5', 12)
if ans == 1:
c.drawString(10*mm, 290*mm, "* " + tablenm + "一覧表 *") #a4 縦 書き出し(横位置, 縦位置, 文字)
elif ans == 2:
c.drawString(10*mm, 200*mm, "* " + tablenm + "一覧表 *") #a4 横 書き出し(横位置, 縦位置, 文字)
elif ans == 3:
c.drawString(10*mm, 290*mm, "* " + tablenm + "一覧表 *") #a3 横 書き出し(横位置, 縦位置, 文字)
else:
pass
page += 1
strpage = 'page.' + str(page)
if ans == 1:
c.drawString(170*mm, 290*mm,strpage) # a4 縦 書き出し(横位置, 縦位置, 文字)
elif ans == 2:
c.drawString(270*mm, 200*mm,strpage) # a4 横 書き出し(横位置, 縦位置, 文字)
elif ans == 3:
c.drawString(370*mm, 290*mm,strpage) # a3 横 書き出し(横位置, 縦位置, 文字)
else:
pass
#table = Table(tb,colWidths=40*mm, rowHeights=5*mm) # テーブルサイズ 列 行
table = Table(tb,colWidths=(20*mm,60*mm,20*mm), rowHeights=5*mm) # テーブルサイズ 列 行
table.setStyle(TableStyle([ # tableの装飾
('FONT', (0, 0), (-1, -1), 'HeiseiMin-W3', 11), #フォント,サイズ FONTL
('BOX', (0, 0), (-1, -1), 1, colors.black), #罫線外側 BOX
('INNERGRID', (0, 0), (-1, -1), 1, colors.black), #罫線内側 INNERGRID
('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), #フォントの場所垂直 TOP MIDDLE BOTTOM
("ALIGN", (0,0), (-1,-1), "CENTER"), #フォントの場所水平 LEFT CENTER RIGHT
("ALIGN", (0,1), (-1,-1), "RIGHT"), #フォントの場所水平 LEFT CENTER RIGHT
("ALIGN", (1,1), (-1,-1), "LEFT"), #フォントの場所水平 LEFT CENTER RIGHT
("ALIGN", (2,1), (-1,-1), "CENTER"), #フォントの場所水平 LEFT CENTER RIGHT2
('BACKGROUND',(0,0),(2,0),colors.yellow), #列、行
]))
#セル結合 span #横線 lineabove #縦線 linebefore
c.setFont('HeiseiKakuGo-W5', 12)
if ans == 1:
table.wrapOn(c, 10*mm, 20*mm) # table a4 縦 書き出し位置 横 縦
table.drawOn(c, 10*mm, 20*mm)
elif ans == 2:
table.wrapOn(c, 10*mm, 10*mm) # table a4 横 書き出し位置 横 縦
table.drawOn(c, 10*mm, 10*mm)
elif ans == 3:
table.wrapOn(c, 10*mm, 20*mm) # table a3 横 書き出し位置 横 縦
table.drawOn(c, 10*mm, 20*mm)
else:
pass
# Canvasに書き込み
c.showPage()
row = -1
tb = []
tb.append(hedcol,)
row += 1
if row > 0:
num = 1
if ans == 1:
kasan = 2
elif ans == 2:
kasan = 2
elif ans == 3:
kasan = 2
else:
pass
while num < gyosuu + kasan - row:
tb.append(['','',''])
num += 1
c.setFont('HeiseiKakuGo-W5', 12)
if ans == 1:
c.drawString(10*mm, 290*mm, "* " + tablenm + "一覧表 *") #a4 縦 書き出し(横位置, 縦位置, 文字)
elif ans == 2:
c.drawString(10*mm, 200*mm, "* " + tablenm + "一覧表 *") #a4 横 書き出し(横位置, 縦位置, 文字)
elif ans == 3:
c.drawString(10*mm, 290*mm, "* " + tablenm + "一覧表 *") #a3 横 書き出し(横位置, 縦位置, 文字)
else:
pass
page += 1
strpage = 'page.' + str(page)
if ans == 1:
c.drawString(170*mm, 290*mm,strpage) # a4 縦 書き出し(横位置, 縦位置, 文字)
elif ans == 2:
c.drawString(270*mm, 200*mm,strpage) # a4 横 書き出し(横位置, 縦位置, 文字)
elif ans == 3:
c.drawString(370*mm, 290*mm,strpage) # a3 横 書き出し(横位置, 縦位置, 文字)
else:
pass
table = Table(tb,colWidths=(20*mm,60*mm,20*mm), rowHeights=5*mm) # テーブルサイズ 列 行
table.setStyle(TableStyle([ # tableの装飾
('FONT', (0, 0), (-1, -1), 'HeiseiMin-W3', 11), #フォント,サイズ FONTL
('BOX', (0, 0), (-1, -1), 1, colors.black), #罫線外側 BOX
('INNERGRID', (0, 0), (-1, -1), 1, colors.black), #罫線内側 INNERGRID
('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), #フォントの場所垂直 TOP MIDDLE BOTTOM
("ALIGN", (0,0), (-1,-1), "CENTER"), #フォントの場所水平 LEFT CENTER RIGHT
("ALIGN", (0,1), (-1,-1), "RIGHT"), #フォントの場所水平 LEFT CENTER RIGHT
("ALIGN", (1,1), (-1,-1), "LEFT"), #フォントの場所水平 LEFT CENTER RIGHT
("ALIGN", (2,1), (-1,-1), "CENTER"), #フォントの場所水平 LEFT CENTER RIGHT2
('BACKGROUND',(0,0),(2,0),colors.yellow), #列、行
]))
#セル結合 span #横線 lineabove #縦線 linebefore
if ans == 1:
table.wrapOn(c, 10*mm, 20*mm) # table a4 縦 書き出し位置 横 縦
table.drawOn(c, 10*mm, 20*mm)
elif ans == 2:
table.wrapOn(c, 10*mm, 10*mm) # table a4 横 書き出し位置 横 縦
table.drawOn(c, 10*mm, 10*mm)
elif ans == 3:
table.wrapOn(c, 10*mm, 20*mm) # table a3 横 書き出し位置 横 縦
table.drawOn(c, 10*mm, 20*mm)
else:
pass
# Canvasに書き込み
c.showPage()
# ファイル保存
c.save()
# ブラウザーで表示
webbrowser.open(FILENAME)
except Exception as e:
QMessageBox.warning(self,'エラー','接続エラー' + e.args)
else:
pass
if __name__ == "__main__":
app = QApplication(sys.argv)
widget = LstTorihikisaki()
widget.show()
sys.exit(app.exec())
実行画面
Ubuntuで実行 PDF作成で select を実行し pdfファイルを作成。