作为一个零基础,对爬虫感兴趣,刚看了几节《疯狂Python讲义》(其实已经看了20+节了),并且觉得python的语法跟excel函数有很多相似之处的小白,在B站偶然间刷到了openpyxl操作excel表的视频后,我瞬间感觉到了python的便利之处。 我非常喜欢那段B站视频中的一句话:我很讨厌机械重复工作,但又不得不做。恰好机械重复工作很适合让电脑自动运行,所以我选择编段程序。 所以我就开始了这个坑套坑的操作之路。 之所以是“读取csv,转换成excel表”的思路,原因很jian单: 1,因为我在编程方面是个小白,白到不懂得怎么操作csv文件。。 2,“表哥”我倒是有接近8年的经验。 我的目的只是把过往让我花费大量时间的算表过程,编成一段段的脚本代码,让表格们长大到会自己计算出结果来的程度~ 闲话到此为止。
对openpyxl感兴趣的码友可以自行在B站上搜索关键词“openpyxl”(没错,就是直接搜库名),就会大概知道这个库能给你建个excel表,然后往excel表的单元格(cell)里填数值,还能保存。。 一个伟大的坑就这么挖在我面前了,还贼像印度飞饼。。。
既然能打开表格文件,能填值,能保存,那应该也能读取csv文件并且操作才对。 所以,第一版大体的思路就定下来了: step1:转到对应目录。 step2:运行openpyxl生成表格。 step3:进行导入csv文件和编辑操作。 step4:保存。
问题又来了: 1,好像openpyxl木有导入csv文件的操作。。 2,xlwt倒是可以保存成abc.xlsx,但仅限于文件名,只能改回去abc.xls才能正常用excel打开。。 3,更可气的是,openpyxl居然不支持操作xls文件!!!
所以,最终大概的思路就变成了: step1:转到对应目录。 step2:通过xlwt和csv两个库,读取csv文件,然后生成xls格式的表格。 step3:通过pywin32库,将xls文件转化成xlsx文件。 step4:通过openpyxl库(终于到你了),编辑xlsx文件。 step5:保存,完事。。
相信我,我已经将一切我能看得懂的代码都添加备注,以防看不懂了。。。
#转到对应目录 import os os.chdir('C:\\Users\\administrator\\Desktop\\dailyreport\\morningreport') #转到对应目录 #csv文件另存成xls文件,感谢前辈@张行之, #这段代码的原文网址在https://blog.csdn.net/qq_33689414/article/details/78307031 import csv import xlwt def csv_to_xlsx(): with open('20190501to0522.csv', 'r', encoding='Shift-JIS') as f: # 由于这个csv文件中的字库是Shift-JIS,这里用了个encoding='Shift-JIS'的参数来指定使用Shift-JIS字库。 read = csv.reader(f) workbook = xlwt.Workbook() sheet = workbook.add_sheet('data') # 创建一个名叫data的sheet(原作者的备注) l = 0 for line in read: print(line) r = 0 for i in line: print(i) sheet.write(l, r, i) # 一个一个将单元格数据写入(原作者的备注) r = r + 1 l = l + 1 workbook.save('20190501to0522-01.xls') # 保存Excel文件 if __name__ == '__main__': csv_to_xlsx() #csv文件另存成xls文件,感谢前辈@张行之, #这段代码的原文网址在https://blog.csdn.net/qq_33689414/article/details/78307031 #xls文件转换成xlsx文件 import win32com.client as win32 fname = "C:\\Users\\Li\\Desktop\\dailyreport\\morningreport\\20190501to0522-01.xls" excel = win32.gencache.EnsureDispatch('Excel.Application') wb = excel.Workbooks.Open(fname) wb.SaveAs(fname+"x", FileFormat = 51) #FileFormat = 51 is for .xlsx extension wb.Close() #FileFormat = 56 is for .xls extension excel.Application.Quit() #xls文件另存成xlsx文件 import openpyxl #载入openpyxl os.chdir('C:\\Users\\Li\\Desktop\\dailyreport\\morningreport') #转到对应目录 wb = openpyxl.load_workbook('20190501to0522-01.xlsx') #读取文件 ws = wb.active #动作起始语句 ws.move_range("A7:AR3000", rows=-6, cols=0) #通过移动第七行开始的表格,删除csv文件中的多余表头。 wb.save('20190501to0522-02.xlsx') #输出并保存以上处理的结果 # 删除草稿文件,如果原始csv文件也不需要存底了,可以多加一句remove("20190501to0522.csv") os.remove("20190501to0522-01.xls") os.remove("20190501to0522-01.xlsx") # 删除草稿文件,如果原始csv文件也不需要存底了,可以多加一句remove("20190501to0522.csv")再次重申一下目的,只是为了把之前做表哥的时候需要计算的表格,写成脚本,让表格自动运算而已。 实际对于大神们来说,直接操作csv文件输出结果,会使得代码更简洁,而且过程也更快。
一点点吐槽, openpyxl能实现删除整列,但居然不支持删除整行,会报错。。 不过倒是可以通过move_range(“选定范围”,rows=行数【负往上,正往下,整数】,cols=列数【负往左,正往右,整数】)的途径实现,毕竟这货是整一块选定范围挪过去,然后覆盖掉原来在单元格中的内容,这样出来的效果其实也跟“删除”差不多了。 后来我自己也仔细想了想,excel里即便是“直接删除整列”,也像是把后面的内容往前“盖”一列,所以也就想通了。
以上就是一个编程小白入坑后,为自己写的第一串代码。 后续继续使用openpyxl的时候如果有感想,也会继续发出来。