01 | 拆分与合并:如何快速地批量处理内容相似的Excel?
01 | 拆分与合并:如何快速地批量处理内容相似的Excel?
讲述:尹会生
时长15:04大小13.81M
如何用 Python 手工操作一个 Excel 文件?
怎样实现 Excel 的合并?
怎样实现 Excel 的拆分?
小结
思考题
赞 39
提建议
精选留言(79)
- 达文西置顶2021-02-03上周刚碰到类似的需求,客户发过来的excle跟系统要求的模板跟数据格式都不对应,上万条数据,手动改肯定是搞不来了.就自己摸索着一天用python处理了一下做适配.不得不说python确实简单好学,很适合处理这些简单重复的业务场景.
作者回复: 这是python最擅长的领域之一了。给这些非标的数据做格式化特别好用。
12 - 🐑置顶2022-03-30编辑小提示:专栏的完整代码位置是https://github.com/wilsonyin123/python_productivity,可点击链接下载查看。 或者通过网盘链接提取后下载,链接是: https://pan.baidu.com/s/1UvEKDCGnU6yb0a7gHLSE4Q?pwd=5wf1,提取码: 5wf1。
- 李京斌2021-02-07能否共享讲课中提到的文件(EXCEL文件等)。
作者回复: https://github.com/wilsonyin123/python_productivity 代码和课程中的文件都在链接中
共 3 条评论10 - 旧草2021-02-04例子保存的excel是xlsx,而官方文档写着: xlwt is a library for writing data and formatting information to older Excel files (ie: .xls) by https://xlwt.readthedocs.io/en/latest/
作者回复: 感谢指正,xlsx应该为xls格式
共 2 条评论10 - 唐超伟2021-03-012.01版本的xlrd不支持xlsx文件,只支持xls文件 亲测装旧版本的可用 pip install xlrd==1.2.0
作者回复: 感谢反馈, 可以使用openpyxl库代替xlrd xlwt 实现xlsx文件的读写
共 6 条评论8 - Nick2021-02-04老师,我现在正好也碰到类似这样合并Excel文件的业务场景。大概有几十个拆分的Excel文件,要合并导入到数据库中,按照今天课程的思路,将所有的数据合并到一个Excel文件中来处理,但现在的问题是数据量比较大,超过了千万条记录。已经超出了Excel的最大范围,请问这种情况该怎么处理?我自己目前想到的是通过循环读所有的Excel文件,将数据一条条的插入到数据库中,请问老师还有什么高见?
作者回复: 千万条数据存入到 Excel已经不合适了。存入到数据库是比较好的解决方案。 我们以MySQL为例,为了避免你的内存不足,建议你读取一个文件向数据库写一次。python可以使用mysqlDB这个库写入数据库。 如果你需要跨文件做一些关联处理,必须一次性把这些文件都读入到内存的话,可以使用一个叫做pandas的库来进行相关处理。 如果数据的量级再大,建议你直接写入数据库,用SQL来处理数据之间的关系。
共 2 条评论8 - Fan2021-02-03哈哈哈,这个主题讲得好,比爬虫,Django 那些内容实用多了。
作者回复: 都很有用,过年女朋友让你在某东某宝抢个化妆品,爬虫的功能就派上用场了。
共 3 条评论7 - 陈芳2021-03-11像我这样情况的,是不是应该学习【零基础学Python】,而不是这个课程。感觉十分吃力,连怎么开门都不知道
作者回复: 你好,我觉得问题并不是对python不熟悉造成的,而是对编程的基础概念比如运行环境、计算机原理等不熟悉导致,这些知识对于初学者没有必要先全部掌握,会造成学习的挫败感,建议你可以先跟着专栏的程序来模仿,通过模仿再慢慢理解,之后再从理解到运用,之后再慢慢补齐计算机原理和windows系统知识,这样会让进阶之路更平缓一些
4 - 比国王2021-12-20老师,只论报表的拆分和合并,Python比VBA强在哪些方面?因为打开Excel就可以写VBA,非常方便,但如果知道Python比VBA更好的话,就可以说服自己学习Python而放弃使用VBA了。
作者回复: 只论报表的拆分和合并 ,python 和 VBA 都是利用 COM组件和Excel完成底层交互的。但是考虑现在代码的丰富程度,以及学习成本,Python无疑要比VBA要好太多,我来说服你学Python吧 :)
3 - 巩春雨2021-02-08老师,您讲的都是对于一些简单格式的excel数据有效。实际工作中财务的一些表格都是包含大量的格式,如合并单元格,涂色,隐藏,筛选及单元格内存在大量的公式。如果我把10个文件合并到一个文件中的不同sheet,如何能把相应的格式及公式快速的复制过去
作者回复: 你好啊, 我想先带你解决从手动到自动的思路问题, 自动化的前提解决了,再细化特殊问题,. 比如你提到的,单元格公式问题,公式能够正常处理的前提是是否被正常读取了,你会发现openpyxl 、xlrd这两个模块在读取excel的时候,有一个data_only 参数,控制着读取公式的行为, data_only为True读取的公式单元格就是None(需要用excel再打开文件一次才能显示值),如果是False就是公式本身. 还有一个终极方案,用python将公式内容以python字符串方式写入,如: xls["B10"] = "=SUM(B1:B9)" 通过这两个参数控制
共 2 条评论3 - BBQ2021-02-05老婆总是让我批量处理文件,上次学用 PowerShell 写了一个小程序,非常难写。用Python 简单多了。
作者回复: Python在网络和文件库的丰富程度上,是ps无法比拟的,但是在命令行方面ps也是非常强悍的,我在加餐当中也会使用到powershell,为你讲解它擅长的地方。
3 - 谢韬 Fragos2022-03-12我用openpyxl3.0.9写的支持xlsx格式的代码供大家参考。谢谢尹老师的指导。 from openpyxl import load_workbook from pathlib import Path,PurePath from openpyxl import Workbook src_path='/Users/tx/Desktop/文章1代码/调查问卷' dst_path = '/Users/tx/Desktop/文章1代码/result/结果.xlsx' p= Path(src_path) files= [x for x in p.iterdir() if PurePath(x).match('*.xlsx')] # print(files) content = [] for file in files: username = file.stem # print(file) wb = load_workbook(file) # print(wb.sheetnames) ws=wb.active # print(ws) answer1 = ws['E5'].value answer2 = ws.cell(row=11,column=5).value print(answer1) print(answer2) temp = f'{username},{answer1},{answer2}' content.append(temp.split(',')) print (temp) print(content) ws1_header =['员工姓名','第一题','第二题'] wb1= Workbook() ws1 = wb1.active ws1 = wb1.create_sheet("统计结果") rw=1 col=1 for cell_header in ws1_header: ws1.cell(row=rw, column=col,value=cell_header) col +=1 rw +=1 for line in content: col=1 for cell in line: ws1.cell(row=rw, column=col, value=cell) col+=1 rw+=1 wb1.save(dst_path)展开3
- 老李书店2021-04-22请问下有案例文件吗
作者回复: 您好,有的,在github下载, 每一课我都打包成了一个zip压缩包供你练习。 https://github.com/wilsonyin123/python_productivity
共 2 条评论2 - 落曦2021-02-07老师您好,我试了一下您的代码,第一个有问题,运行出错: Traceback (most recent call last): File "D:/pycharmproject/Exceldemo.py", line 10, in <module> value = table.cell_value(rowx=4, colx=4) File "D:\pycharmproject\venv\lib\site-packages\xlrd\sheet.py", line 420, in cell_value return self._cell_values[rowx][colx] IndexError: list index out of range 后来当我调试您github上的代码时,没有错误,然后根据留言区@旧草的提示,打开了您工资单.xlsx的文件,发现命名错误,于是我重命名为工资单.xls后来就能直接在excel上读取内容了。 所以我意识到xlrd 只适用于xls文件,老师您的电脑是mac,我用的windows可能是系统的不同吗? python 3.7.0 xlrd 1.2.0 xlwt 1.3.0 pip 21.0.1展开
作者回复: 您好, 错误提示如下: IndexError: list index out of range 是在 value = table.cell_value(rowx=4, colx=4) 出现了列表超过索引范围报的一个错误. 为什么报错的是一个列表呢?cell_value的底层实现是一个列表,所以报错提示是列表的索引超过了限制, 什么时候会报错index error ?比如列表只有三个元素,你引用第四个自然会报错,如果再往前面的代码追溯,就是文件打开失败,导致了列表没有数据,而你读取了_cell_values[4][4],所以超过了列表的长度限制,报了错 中间运行过程你可以了解一下, 你的解决办法是对的,从文件名下手.更正了文件路径错误的问题.后续我还会为你讲解异常处理,你可以在打开文件失败的时候就直接报文件打开失败错误,就不用通过内置错误间接分析文件名指定错误的问题了
共 2 条评论2 - 谢韬 Fragos2022-03-14Excel 文件拆分的持xlsx格式的代码供大家参考。我把注释都加上了。 谢谢尹老师的指导。 from openpyxl import load_workbook from pathlib import Path,PurePath from openpyxl import Workbook #工资单文件 salary_file = '/Users/tx/Desktop/文章1代码/工资单/工资单.xlsx' #拆分文件保存路径 dst_path1 = '/Users/tx/Desktop/文章1代码/工资单' wb2= load_workbook(salary_file) ws2=wb2.active # print(wb2.sheetnames) #取得表头 for rw1 in ws2.iter_rows(min_row=1, max_col=None,max_row=1,values_only=True): salary_header=rw1 #print(salary_header) #定义写入文件的函数 def write_to_file (filename,cnt): wb3 = Workbook() ws3= wb3.create_sheet("本月工资") rw = 1 for line in cnt: col=1 for cell in line: ws3.cell(row=rw, column=col, value=cell) col+=1 rw+=1 wb3.save(PurePath(salary_file).with_name(filename).with_suffix('.xlsx')) #取得员工数量 employee_number= ws2.max_row print(employee_number) #取得每一行,并用第二个单元格作为新的文件名 for line in range (2,employee_number+1): for rwn in ws2.iter_rows(min_row=line, max_col=None, max_row=line, values_only=True): content = rwn print(content) #将表头和员工数量组成一个新文件 new_content =[] #增加表头到要写入的内容中 new_content.append(salary_header) new_content.append(content) write_to_file(content[1],cnt=new_content)展开2
- 刘春富2022-01-11# 调用自定义函数write_to_file()写入新的文件 write_to_file(filename = content[1], cnt = new_content) 这个write_to_file()函数的代码是怎样的?谢谢
作者回复: https://github.com/wilsonyin123/python_productivity 这里有完整的源代码,为了保持文章阅读的连贯性,我没有贴完整代码上去,在这里可以下载到。
1 - Geek_39bcb22021-12-08初学者,老师帮忙解答一下找个是怎么回事 H:\PycharmProjects\pythonProject1\venv\Scripts\python.exe H:/PycharmProjects/pythonProject1/main.py File "H:\PycharmProjects\pythonProject1\main.py", line 2 pip3 install xlrd ^ SyntaxError: invalid syntax Process finished with exit code 1展开
作者回复: pip3 install xlrd 是安装Python软件包的命令。换句话说pip实际上是执行了pip3.exe命令。 因此它需要和python.exe 一样,要放在命令行里运行。而你将它放入到了main.py中,也就出现了上面的错误。 我最开始学的时候是这样记住pip和python的关系的。pip是管理python能够使用哪些第三方库的,所以它们没有从属关系,都要在命令行运行。
1 - 巩会杰2021-11-29卸载旧版本包出现错误: C:\Users\Administrator>pip uninstall xlrd Traceback (most recent call last): File "D:\Program Files\Python310\lib\runpy.py", line 196, in _run_module_as_main return _run_code(code, main_globals, None, File "D:\Program Files\Python310\lib\runpy.py", line 86, in _run_code exec(code, run_globals) File "D:\Program Files\Python310\Scripts\pip.exe\__main__.py", line 4, in <module> ModuleNotFoundError: No module named 'pip' 开始就错误不知道怎么学习了,求老师解答下,这个有学习群吗?展开
作者回复: 在第一课和课程开头会有我们的QQ群。 出现ModuleNotFoundError: No module named 'pip' 的原因,是命令行找不到pip这条命令导致的。最有可能的原因是你在安装第一次软件包之后,它提示你需要更新pip,你按照它的提示执行了pip的升级。 这里有两种解决办法,一种是后续使用新版本Python推荐的方式: python -m pip install xxx 这种方式来安装。 另一种是先在命令行执行 python -m ensurepip 执行完成后,再进行pip的更新 python -m pip install --upgrade pip 即可解决你遇到的问题 它的根本原因是pip的命令搜索路径导致的,只在windows中出现
1 - 巩会杰2021-11-22报错--xlrd.biffh.XLRDError: Excel xlsx file; not supported 老师最后一行代码 table.cell_value。为什么输入table.后没有自动提示其他的属性?? 代码如下: import xlrd file = 'D:/py-test/AAA.xlsx' data = xlrd.open_workbook(file) table = data.sheets()[0] value = table.cell_value(rowx=4,colx=4)展开
作者回复: 首先纠正一下,cell_value()是一个方法。没有自动补全有很多情况,比如笔记本的性能不够,比如vscode等IDE的索引还没更新完。那么还有一种原因是,table的方法是一个动态方法(Python是一门动态语言,它在运行的时候才产生的方法,这种情况是没有办法提示的,比如一个典型的库flask、django都有这种情况) ,这里的cell_value()就属于这样一种。 不必深究
1 - Nichkhun2021-05-03老师,有课程里用到的文件吗?
作者回复: 有的,和代码一起放在github中 地址:https://github.com/wilsonyin123/python_productivity
共 2 条评论1