ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 830|回复: 18

Python与Excel

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-4-26 12:34 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这几天学了一点Python,现整理如下:

  1. import xlwings as xw
  2. #先安装第三方软件包xlwings,方法有两种:
  3. #1 文件-设置-项目-python解释器-点+号-搜索框输入软件包名称xlwings-安装
  4. #2 打开电脑dos环境,输入pip install xlwings,回车等待安装完成
  5. app=xw.App(visible=True,add_book=False)
  6. # 打开Excel程序
  7. # 注意Python区分大小写,变量可以不用先定义
  8. wb=app.books.add()
  9. # 新建Excel工作簿,先新建后面再保存
  10. sht=wb.sheets['sheet1']#激活工作表
  11. # sht=wb.sheets.active
  12. # sht=wb.sheets[0]
  13. sht.range('a2').value=[1,'2024-4-18',3]
  14. sht.range('a1').value=['序号','日期','天猫']
  15. # 以上是写入一行数据示例
  16. list1=[2,3,4,5]
  17. sht.range('a3').options(transpose=True).value=list1
  18. # 写入一列,把列表数据装入变量list1,再赋值给单元格a3
  19. # 也可以把单元格区域赋值给变量,再把变量赋值给某单元格,
  20. # 例如:list2=sht.range('k2:m9').value  sht.range('a2').value=list2
  21. wb.save(r'D:\python学习\表1.xlsx')
  22. # 指定路径保存并命名工作簿
  23. wb.close()
  24. # 关闭工作簿
  25. app.quit()
  26. # 退出Excel程序
复制代码
  1. import xlwings as xw
  2. app=xw.App(visible=True,add_book=False)
  3. path_1=r'D:\python学习\表1.xlsx'
  4. wb=app.books.open(path_1)# 打开现有工作簿
  5. sht=wb.sheets.active
  6. sht1=wb.sheets.add('2月',after=sht) # 新建工作表并直接命名,放在sht后面
  7. # sht1=wb.sheets.add()# 新建工作表,放在最前面
  8. list1=wb.sheets['1月'].range('a1:c12').value
  9. sht1.range('a1').value=list1
  10. sht1.autofit() # 自动调整单元格大小
  11. # for i in [1,2,3,4,[1,2,3]]:
  12.     # print(i)
复制代码
  1. import xlwings as xw
  2. app=xw.App(visible=True,add_book=False)
  3. lujin='D:\python学习'
  4. for i in range(2,21):
  5.     wb=app.books.add()
  6.     wb.save(f'D:\python学习\shuju{i}.xlsx')
  7.     # 批量建20个工作簿并命名、保存,range(2,21)区间为左闭右开,即从2开始到21共20个
  8.     # 用f-string方法来拼接字符串
  9.     # 以f或F为修饰符引领字符串,变量用{}
  10.     # 例如 wb.save(f'{lujin}\表{i}.xlsx'),也达到一样效果
  11.     wb.close()
  12. app.quit()
复制代码
  1. import xlwings as xw
  2. import os
  3. import pandas as pd
  4. # 导入库,os是标准库
  5. # 导入pandas库
  6. lujin='D:\python学习'
  7. list1=os.listdir(lujin)
  8. # 获取路径下文件、子文件的文件名
  9. app=xw.App(visible=True,add_book=False)
  10. for i in list1:
  11.     print(i)
  12.     wb=app.books.open(lujin+'\\'+i)
  13.     # 依次打开所以工作簿
  14.     sht=wb.sheets['sheet1']
  15.     sht.range('a1').value=['班级','姓名','语文','数学','英语']
  16.     sht.range('a2').value=['高3-1','许仙','98','100','88']
  17.     sht.range('a3').value=['高3-1','天一','95','99','90']
  18.     sht.range('a4').value=['高3-2','炸蛇','92','90','90']
  19.     sht.autofit()
  20.     wb.save()
  21. wb.close()
  22. app.quit()
复制代码
  1. # 列表基础
  2. a=[1,2,3,4,'hello',[5,6,7]]
  3. # 这是列表,由元素组成,列表=[元素1,元素2,元素3,......],列表可以嵌套列表
  4. for i in a:
  5.     print(i)
  6. # 由for循环列出列表a的每一个元素
  7. b=a[1:4] # 这就是所谓的列表切片:取列表的多个元素
  8. '''
  9. 这是多行注释的写法
  10. 列表b取值a的第1个到第4个元素,也就是2,3,4
  11. 为什么是这样?因为列表取值默认是从0开始的,右边是4,只能取到第3个
  12. '''
  13. for i in b:
  14.     print(i)
  15. # 当不确定列表元素的序号时,可以只写一个序号
  16. b=a[1:] # 从第2个到最后
  17. for i in b:
  18.     print(i)
  19. # 运行结果:2,3,4,'hello',[5,6,7]
  20. b=a[-3:] # 倒数第3个到最后
  21. for i in b:
  22.     print(i)
  23. # 运行结果:4,'hello',[5,6,7]
  24. b=a[:-3] # 到数第3个到最前,不包括倒数第3个
  25. for i in b:
  26.     print(i)
  27. # 运行结果:1,2,3
  28. a.append(1000) # 用appden()函数向列表添加元素,一次只能1个
  29. a.append(100)
  30. print(a)
  31. # 运行结果:[1, 2, 3, 4, 'hello', [5, 6, 7], 1000, 100]
  32. a=[1,2,3,4,5,'hello']
  33. # b="-".join(a)
  34. # print(b) # 很奇怪,这里开始报错、不运行
  35. # 用join()函数将列表a转换为用-连接的字符串
  36. b='-'.join('%s'%id for id in a)
  37. print(b)
  38. # 改成这样才能运行,因为:a里面数据不全部是字符串类型str,所以报错
  39. # 运行结果:1-2-3-4-5-hello
  40. c='nihao mao hello www'
  41. print(c.split(' '))
  42. # split()函数是将字符串拆分成列表
  43. # 运行结果:['nihao', 'mao', 'hello', 'www']
复制代码
  1. import numpy as np
  2. import pandas as pd
  3. # import xlrd ,xlrd必须安装1.2.0版本,最新版本2.0.1不支持xlsx,会报错,坑了好久
  4. # 导入pandas模块
  5. # pandas主要是处理数据
  6. lujin = 'D:\python学习'
  7. frame=pd.read_excel(lujin+'\\'+'表2.xlsx') # 这是用变量的写法
  8. # usecols=['姓名','班级'],读取特定列;usecols=[0,1,2],读取前3列,也可以这样usecols='a:c'
  9. # nrows=2,读取前2行
  10. # skiprows=2,跳过前2行;skiprows=lambda x: x % 2 == 0,跳过偶数行
  11. # header=1,用第2行做表头,即第1行不要了,header=None表示不使用数据源中的表头
  12. # names=['aa','ss','dd','ff','gg'],自定义表头

  13. # frame=pd.read_excel(r'D:\python学习\表2.xlsx')
  14. # 这是绝对路径的写法
  15. print(frame)


  16. feilei_sums=frame.groupby(['班级','姓名']).sum()
  17. # 按班级、姓名进行分组汇总各科成绩
  18. print(feilei_sums)
  19. # print(frame.groupby(['班级']).sum())

  20. # 数据透视表函数pivot_table():按班级统计各科总分、平均分
  21. toushi=frame.pivot_table(frame,index='班级',aggfunc=[np.sum,np.mean])
  22. print(toushi)
复制代码
  1. import numpy as np
  2. import pandas as pd
  3. import os
  4. # 导入库
  5. lujin=r'D:\python学习'
  6. df_empty=pd.DataFrame(columns=['班级','姓名','语文','数学','英语'])
  7. # 建一个空库,列名跟数据源一样

  8. for parents, dirnames, filenames in os.walk(lujin):
  9.     for filename in filenames:
  10.         df = pd.read_excel(os.path.join(parents, filename))
  11.         df_empty = df_empty.append(df, ignore_index=True)
  12. # 利用os库的walk功能遍历文件夹里的所有文件,并读取文件名字
  13. # os.path.join能够将文件夹的路径和文件名字合并成每个文件的完整路径
  14. # 然后将每个文件读取,再与空的DataFrame合并

  15. print(df_empty) # 输出合并表

  16. d=df_empty.groupby(['班级','姓名']).sum()
  17. print(d) # 输出汇总表
  18. # 按班级、姓名汇总

  19. print(df_empty.pivot_table(df_empty,index=['班级','姓名'],aggfunc=[np.sum]))
  20. # 数据透视表

  21. # df_empty.to_excel('分类汇总.xlsx',sheet_name='sheet1',index=False)
  22. # d.to_excel('分类汇总.xlsx',sheet_name='sheet2',index=True)

  23. with pd.ExcelWriter(lujin+'\\'+'分类汇总.xlsx') as writer:
  24.     df_empty.to_excel(writer,sheet_name='sheet1',index=False) # 合并表写入sheet1
  25.     d.to_excel(writer,sheet_name='sheet2',index=True) # 汇总表写入sheet2
  26. # pd.ExcelWriter 第一个参数路径或文件名,如果文件不存在就新建,存在就覆盖
  27. # 参数mode=‘a’表示新增模式,即新增sheet,不覆盖以前的sheet
复制代码
待续······

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-26 12:56 | 显示全部楼层
发现pandas处理数据特别快,功能很强大。对Excel而言,简单的说就是一个写入read_excel(),一个输出to_excel(),结合分类汇总groupby()、透视表pivot_table()很好用

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-26 13:11 | 显示全部楼层
上传附件
python学习.rar (132.18 KB, 下载次数: 46)

TA的精华主题

TA的得分主题

发表于 2024-4-26 14:55 | 显示全部楼层

xlwings这个库的方法看起来更接近VBA,但是这个库操作Excel是不是很慢?

TA的精华主题

TA的得分主题

发表于 2024-4-26 15:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

我运行的时候,要将这append改成“_append”才可以,否则报错

TA的精华主题

TA的得分主题

发表于 2024-4-26 15:34 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
LIUZHU 发表于 2024-4-26 14:55
xlwings这个库的方法看起来更接近VBA,但是这个库操作Excel是不是很慢?

xlwings是pywin32通过com对象Excel.application来操作表的,比如大多对象的api属性返回的就是com对象,这个相对较慢

pandas打开xlsx依赖openpyxl,这个大概相当于解压xlsx后解析xml,类似c#的epplus,更快一些,但操作相比com对象少

wps里可用xloil代替xlwings,接口不同,但真正处理数据用的还是dataframe,c#、rust都有dataframe,比如nushell用dataframe比py更快,不过还是py简单

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-26 17:36 | 显示全部楼层
LIUZHU 发表于 2024-4-26 15:17
我运行的时候,要将这append改成“_append”才可以,否则报错

很奇怪哦,我这都是能运行的才发出来

TA的精华主题

TA的得分主题

发表于 2024-4-26 17:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
1578278106 发表于 2024-4-26 17:36
很奇怪哦,我这都是能运行的才发出来

据说很早版本的pandas里是append现在版本都是_append了
批注 2024-04-26 174825.jpg

TA的精华主题

TA的得分主题

发表于 2024-4-26 20:56 | 显示全部楼层
wanghan519 发表于 2024-4-26 15:34
xlwings是pywin32通过com对象Excel.application来操作表的,比如大多对象的api属性返回的就是com对象,这 ...

py要装运行环境和开发工具,这点不太方便

TA的精华主题

TA的得分主题

发表于 2024-4-26 20:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wanghan519 发表于 2024-4-26 17:50
据说很早版本的pandas里是append现在版本都是_append了

这个也是开发工具吗?没见过啊
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-19 01:25 , Processed in 0.043459 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表