Python的excel应用
多张excel表某些数据的汇总
本地存着不方便,就上传到网上啦,以后自己有需要也能回来康康。
更主要是还是想分享给大家,讨论讨论,学点技巧
还没来得及学习xlrd和xlwt,XXX叫我帮他整份汇总脚本,为了我们的友谊(肥仔快乐水和炸鸡)
整个脚本昨天花了一下午的时间搞的,边看文献边敲代码
现在就当边写文档边优化代码啦
ps:本来还想写打包python程序的过程的,后来康了康篇幅,太长了,算了,放弃了,学习了,洗澡了,睡觉了。
应用场景
- 将一堆excel表放在同一文件夹
- 将打包好的Python脚本和excel表放在同一目录
- 运行脚本
- 生成一个日期命名的文件夹
- 文件夹内生成excel汇总表和原始excel表。
- 源代码上传到github上了
源码github链接.
效果图(小恶魔启动)
图一:原始数据+Python打包文件
图二: 打包入日期文件夹
图三:日期文件夹内容
图四:原始数据
图五:汇总数据
实现步骤(对各部分代码进行详解)
Ⅰ: 利用 os、shutil、re和datetime四模块来实现一堆excel导入同一命令文件夹。
'''将首目录的xls文件放入日期文件夹中'''
def moveXls(xlsNum, monthDay):
#创建日期命名的文件
os.makedirs('.\\'+monthDay+'')
#正则表达式收集含有“销售单”字样的excel表格
strRegex = re.compile(r'.*销.*售.*单.*')
for xls in xlsNum:
#不符合的返回None类型,符合的将对于的excel文件移动到'月-日-时'文件夹内
if strRegex.search(xls):
#用原始字符串标记r好像含变量的地址不太友好,或许大佬们有其他技巧,下方留言
shutil.move('.\\'+xls+'', '.\\'+monthDay+'')
'''main'''
#获得当前目录的文件名
xlsNum = os.listdir(r'.')
#获取当前时间,为文件命名做准备 “月-日-时”
monthDay = datetime.datetime.now().strftime('%m-%d-%H')
#调用函数:将首目录的xls文件放入日期文件夹中
moveXls(xlsNum, monthDay)
Ⅱ: 通过xlrd模块读取数据,将数据导入到列表/元组/字典,并根据自己的需求(排序),修改代码。
我的需求:只收集从第七行开始到倒数第三行间的第二列和第五列的数据集导入字典。
虽然我用的是字典,但是我 非常后悔用字典,但是又不想返工。(或许大佬们有其他技巧,下方留言)
'''将文档数据汇总成字典组'''
def sumDataDic(xlsNum):
ifff = 0
aaa = []
for xls in xlsNum:
#读取对应excel文件,返回BOOK对象
book = xlrd.open_workbook(xls)
#第一表单,索引号为0
sh = book.sheet_by_index(0)
#第一张excel表
if ifff == 0:
for rx in range(sh.nrows):
if rx - 6 >= 0 and rx + 2 < sh.nrows:
spam3[sh.row_values(rx)[1]] = int(sh.row_values(rx)[4])
#后面的一堆excel表
else:
for rx in range(sh.nrows):
if rx - 6 >= 0 and rx + 2 < sh.nrows:
spam2[sh.row_values(rx)[1]] = int(sh.row_values(rx)[4])
ifff += 1
#有多张张excel表的情况,若2字典有3字典的值,就把3字典的值添加到2字典里
if ifff != 0:
for k, v in spam3.items():
if k in spam2:
spam2[k] += v
else:
spam2[k] = v
#通过压缩zip函数,转化元组,然后用sorted函数排序
aaa = sorted(zip(spam2.values(),spam2.keys()), reverse=True)
#只要一张excel表的情况,3字典就是全部值
else:
#通过压缩zip函数,转化元组,然后用sorted函数排序
aaa = sorted(zip(spam3.values(),spam3.keys()), reverse=True)
#再转换成字典
for i, j in aaa:
spam1[j] = int(i)
#main
#将当前目录修改成日期文件夹,相当于进入日期文件夹
os.chdir('.\\'+monthDay+'')
xlsNum = os.listdir(r'.')
spam1,spam2,spam3 = {}, {}, {}
#将文档数据汇总成字典组
sumDataDic(xlsNum)
# #打印测试
#print(spam1)
Ⅲ: 将字典的数据导入到新的excel表中
'''将字典组打入新的xls'''
def dicTranXks(spam1):
lenSpam1 = len(spam1)
wb = xlwt.Workbook(encoding='utf-8') #含有中文,所以使用了万国码
#没有cell_overwrite_ok=True
worksheet = wb.add_sheet('sheet1', cell_overwrite_ok=True)
#单元格宽度
worksheet.col(0).width = 23 * 256
worksheet.col(1).width = 8 * 256
worksheet.col(3).width = 23 * 256
worksheet.col(4).width = 8 * 256
worksheet.col(6).width = 23 * 256
worksheet.col(7).width = 8 * 256
#设置单元格的高度
worksheet.row(0).height_mismatch = True
worksheet.row(0).height = 2 * 256
#字体对象
font = xlwt.Font()
font.bold = True #加粗
font.height = 25*14 #字大小
#单元框对象
borders = xlwt.Borders()
borders.left = 2
borders.right = 2
borders.top = 2
borders.bottom = 2
borders.left_colour = 2
borders.right_colour = 2
borders.top_colour = 2
borders.bottom_colour = 2
#创建style:合并font和borders对象
style0 = xlwt.XFStyle()
style0.font = font
style0.borders = borders
i, t = 0, 0
for k,v in spam1.items():
if i % 15 == 0:
worksheet.write(int(i % 15), int(0 + (i / 15) * 3), '商品名称', style0)
worksheet.write(int(i % 15), int(1 + (i / 15) * 3), '数量', style0)
t += 1
i += 1
worksheet.write(int(i % 15), int(0 + ( t-1 ) * 3), k, style0)
worksheet.write(int(i % 15), int(1 + (t-1) * 3), v, style0)
i += 1
#保存在汇总单中
wb.save('汇总单.xls')
#mian
#将字典组打入新的xls
dicTranXks(spam1)
结束语
毛得结束语