目录

一、背景介绍

二、代码及成果

三、代码分析

四、打包为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...相关推荐

  1. python操作图片批量保存成PDF文件

    有个脚本需求: 就是把一个一个图片获取下来,并把图片拼接成一个PDF文档. 代码如下: # -*- coding: utf-8 -*- """ Created on Mo ...

  2. mysql导出七张表成dtf文件_如何用Java实现把excel表中的数据导入到mysql数据库已有的表中?...

    展开全部 java 读excel 还是比较方便简单的,原理就是,先用java 读取excel,然后,一行行的写入数据库,字段的话32313133353236313431303231363533e4b8 ...

  3. 方德系统装exe文件_国产x86处理器+中科方德定制Linux 完美运行exe

    预计在最早本月底.最迟下月中上旬,一批搭载骁龙835芯片的Windows 10笔记本电脑将会首发登场. 这批基于ARM移动架构打造的PC产品之所以受人关注,主要是高通和微软联手,实现了在精简指令集的平 ...

  4. Python 实现office单个文件或整个文件夹(word,ppt,excel)转换成PDF文件,并获取PDF文件页数

    Python 实现office单个文件或整个文件夹(word,ppt,excel)转换成PDF文件,并获取PDF文件页数 文件夹中获取需要转换的文件数,将其全部转换或可单独转换单个文件,并获取转成PD ...

  5. node-js——将excel表格转换成json文件

    文章目录 将excel表格转换成json文件 步骤 一.引用nodejs的xlsx模块,读取表格的数据 二.引入fs模块,创建文件并写入 三.写一个bat脚本,双击自动执行nodejs文件 示例文件下 ...

  6. Python打包成exe文件_详细操作

    Python打包成exe文件 前言 一.安装pyinstaller 1.1 安装pyinstaller,使用安装命令: 1.2 如果遇到需要更新版本请输入: 1.3 检查是否正确安装 1.4 稍等,水 ...

  7. 将Excel VBA封装成exe程序[老贴收藏]

    假如您手头已有一xls文档等待封装,假如您机子上已安装有VB6开发系统,那么请跟着往下操作: 一.用VB制作EXE文件头部分 1.打开VB,"文件"-"新建工程" ...

  8. vs python生成exe文件_使用VScode编写python程序并打包成.exe文件-文件夹变成exe

    1. 下载vscode并安装 2. 配置Python环境 点击左下角的吃了图标,在弹出的菜单中选择extensions,在左上方搜索框内输入"Python",可以看到好多Pytho ...

  9. 基于Python操作将数据存储到本地文件

    点击蓝字 关注我们 前面说过Python爬取的数据可以存储到文件.关系型数据库.非关系型数据库.前面两篇文章没看的,可快速戳这里查看!<使用Python将数据存入SQLite3数据库> & ...

最新文章

  1. Castle ActiveRecord 泛型应用
  2. JavaScript学习(十三)---RegExp对象
  3. Levenberg-Marquardt快速入门教程
  4. 【GAN优化】长文综述解读如何定量评价生成对抗网络(GAN)
  5. ASP.NET开发要抛弃ASP旧习和破烂
  6. LeetCode-69 x的平方根
  7. DOM操作与引用资源的前后关系
  8. Unity 工具 之 XChart UGUI 表格工具,轻松简单的帮你实现需要的数据图表形式,建议 Mark 一下
  9. python运行需要网络吗_python邮件和网络的简单使用
  10. Png怎么转jpg?这种方法教你如何快速转换
  11. ObjectARX开发(自定义块以及属性的获取)
  12. 2022年(上半年)信息系统项目管理师考试-综合知识真题及解析(一)
  13. 微博商城开启社会化电商之路
  14. 《电感元器件》的特性分析
  15. od使用的小tips
  16. python爬取凤凰新闻网_爬取网易,搜狐,凤凰和澎湃网站评论数据,正负面情感分析...
  17. java学习笔记————SSH
  18. 基于Springboot的大学生社团管理系统
  19. 【opencv-python 6】 获取RIO、泛洪填充
  20. 图书管理系统1.0(当然是很简low的系统,没有华丽界面,但是很锻炼软件开发能力,只用到c++的面向对象知识)

热门文章

  1. bat文件(cmd命令批处理)的编写使用
  2. 量化基金 获取基金持仓情况;获取优秀基金人气组合持仓基金情况
  3. 51nod 1515 明辨是非 2017百度之星初赛第一场第二题(并查集+启发式合并)
  4. 一圈,两圈,三圈,四圈……
  5. Android Studio自动排版格式化(android排版和xml排版)
  6. 【汇正财经】证券市场的结构有哪些?
  7. 马云最简单最赚钱的互联网产业,普通人如何才能抓住这波财富机会
  8. sublime3 离线安装 pretty json
  9. print(f‘‘)的用法
  10. 快速排序-单边循环代码解析