python操作excel并封装成exe文件_十一、使用QTableWidget,openpyxl处理excel,并打包为exe...
目錄
一、背景介紹
二、代碼及成果
三、代碼分析
四、打包為exe
本實例主要使用了QTableWidget,openpyxl,利用openpyxl實現對excel文件的讀取,QTableWidget實現對excel文件內容讀取后,擇需要信息在窗體上顯示。之所以寫該代碼,是因為在同一項目的設計過程中(本人的工作是水工設計),常使用緯地軟件設計多段道路,每段道路的數模都會生成土方計算表,軟件的默認命名難以區分樁號,且挖填方量需要依次點開各個excel文件查看,不太方便。該段代碼專門處理緯地軟件生成的土方計算表,功能有
自動獲取樁號,并批量將文件以起止樁號重命名
自動批量計算總挖填方,并將各段路的方量顯示在QTableWidget中。
一、背景介紹
緯地軟件生成的土方計算表通常會給定默認命名(如下圖),我懶得一個個去改,但是僅根據默認據文件名難以確定是那段樁號的文件。如果改成以樁號來命名,方便最后統計工程量
緯地生成的土方計算表,同一個工作簿內通常有多個工作表,但最后一個是沒有用的。需要從每個工作表的A列提取樁號,然后再倒數第二個工作表內提取累計的挖方量和填方量。
二、代碼及成果
主要代碼及操作界面如下
from PyQt5.QtWidgets importQWidget, QApplication, QFileDialog, QPushButton, QLineEdit, QHBoxLayout, \
QVBoxLayout, QLabel, QTableWidget, QHeaderView, QTableWidgetItemfrom PyQt5.QtGui importQIconimportsys, os, openpyxl
path= os.path.dirname(os.path.dirname(__file__))classMyWin(QWidget):def __init__(self):
super(MyWin, self).__init__()
self.initui()definitui(self):
self.setWindowTitle('土方計算表計算')
self.setWindowIcon(QIcon(r'%s\4.mypython\chuan.ico' %path))
self.resize(600, 500)
btn_open= QPushButton('打開文件')
btn_rename= QPushButton('重命名')
lbl_excavation= QLabel('總挖方量', self)
lineedit_excavation=QLineEdit()
lbl_fill= QLabel('總填方量', self)
lineedit_fill=QLineEdit()
tableWidget=QTableWidget()#=======布局======
hbx1 =QHBoxLayout()
hbx1.addWidget(lbl_excavation)
hbx1.addWidget(lineedit_excavation)
hbx1.addWidget(lbl_fill)
hbx1.addWidget(lineedit_fill)
hbx1.addWidget(btn_open)
hbx1.addWidget(btn_rename)
vbx=QVBoxLayout()
vbx.addWidget(tableWidget)
vbx.addLayout(hbx1)
self.setLayout(vbx)
btn_rename.clicked.connect(self.rename_files)
btn_open.clicked.connect(lambda: self.open_files(lineedit_excavation, lineedit_fill, tableWidget)) #調用函數
#btn_open.clicked.connect(lambda: self.table_init(tableWidget))
defrename_files(self):
f_names, _= QFileDialog.getOpenFileNames(self, '打開文件', 'D:\\', 'XLSX Files(*.xlsx)')if f_names: #f_names返回值為列表,元素為文件地址
for f_name inf_names:
wb= openpyxl.load_workbook(f_name) #打開工作簿
stake_numbers =[]for sheetname in wb.sheetnames[:-1]: #依次獲取工作表,提取起止樁號。最后一個工作表無內容,因此舍去
ws =wb[sheetname]
stake_numbers+= [i.value for i in ws['A'] if i.value != None][4:-2] #獲取樁號列表
start_station, end_station = stake_numbers[0], stake_numbers[-1] #賦值起點樁號和終點樁號
os.rename(f_name.split('/')[-1], '%s~%s.xlsx' % (start_station, end_station)) #os.rename(舊名字,新名字)
defopen_files(self, lineedit_excavation, lineedit_fill, table):
f_names, _= QFileDialog.getOpenFileNames(self, '打開文件', 'D:\\', 'XLSX Files(*.xlsx)')iff_names:
total_excavation, total_fill=0, 0
self.quantity_all= [] #起止樁號和挖填方
for f_name inf_names:
wb= openpyxl.load_workbook(f_name, data_only=True) #只返回數值,不返回公式
#cell_range = ws['A1':'C2'] #通過切片訪問多個單元格
ws = wb[wb.sheetnames[-2]]
quantity_fill, quantity_excavation= ws['R37'].value, ws['E37'].value
total_excavation+=quantity_excavation
total_fill+=quantity_fill
stake_numbers=[]for sheetname in wb.sheetnames[:-1]: #依次獲取工作表,提取起止樁號。最后一個工作表無內容,因此舍去
ws =wb[sheetname]
stake_numbers+= [i.value for i in ws['A'] if i.value != None][4:-2] #獲取樁號列表
start_station, end_station = stake_numbers[0], stake_numbers[-1] #賦值起點樁號和終點樁號
self.quantity_all.append(
[start_station, end_station, round(quantity_excavation,2), round(quantity_fill, 2)])
lineedit_excavation.setText(str(round(total_excavation,2))) #必須轉換為字符串才能賦值
lineedit_fill.setText(str(round(total_fill, 2))) #必須轉換為字符串才能賦值
self.table_init(table)deftable_init(self, table):
table.setColumnCount(4)
table.setRowCount(len(self.quantity_all))
table.setHorizontalHeaderLabels(['起點樁號', '終點樁號', '挖方量', '填方量'])
table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)#print(self.quantity_all)
for i inrange(len(self.quantity_all)):for j in range(4):
newitem= QTableWidgetItem(str(self.quantity_all[i][j])) #必須轉成字符串,否則不報錯,也不顯示
table.setItem(i, j, newitem)if __name__ == '__main__':
app=QApplication(sys.argv)
win=MyWin()
win.show()
sys.exit(app.exec_())
批量處理土方計算表
處理后的文件:
三、代碼分析
f_names, _ = QFileDialog.getOpenFileNames(self, '打開文件', 'D:\\', 'XLSX Files(*.xlsx)')
這里_為占位符,f_names范圍的是元組,元素為各個文件的絕對路徑。如果使用getOpenFileName就只能打開單個文件,getOpenFileNames可以打開多個文件,實現批量處理。
stake_numbers += [i.value for i in ws['A'] if i.value != None][4:-2]
這里使用了列表生成器,if i.value != None可以將空白單元格排除掉
wb = openpyxl.load_workbook(f_name, data_only=True)
這里必須加data_only=True,因為excel里有些單元格是有公式的,不加這個返回的就是單元格的公式而不是單元格的值。
table.setRowCount(len(self.quantity_all)) #行數隨文件自動變化
table.setHorizontalHeaderLabels(['起點樁號', '終點樁號', '挖方量', '填方量'])
table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) #列寬自動拉伸
四、打包為exe
可以使用pyinstaller將代碼打包為exe。windows平臺打包后,想要運行時不彈出cmd窗口,步驟如下,
1.將文件名改為pyw后綴,例如“表格.py”改為“表格.pyw”
2.啟動cmd,切換到py文件所在目錄
3. 輸入pyinstaller -F 表格.pyw --noconsole 這里的“表格.pyw”是要打包的py文件名,“--noconsole”必須要加上,這樣程序運行時不會彈出cmd窗口
總結
以上是生活随笔為你收集整理的python操作excel并封装成exe文件_十一、使用QTableWidget,openpyxl处理excel,并打包为exe...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Elasticsearch 7.7.0
- 下一篇: python高级--数据分析(Panda