ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] Python中xlwings模块操控Excel大全

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-1-19 10:55 | 显示全部楼层 |阅读模式
学习Python有些时日了,,,下面就是学习Python学习笔记,与大家共享


1.png

2.png

3.png

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-19 10:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
4.jpg


5.png

6.png


7.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-19 10:57 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-19 11:01 | 显示全部楼层
下面是Python代码生成的Excel示例文件


练习.rar (162.66 KB, 下载次数: 87)

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-1-19 14:25 | 显示全部楼层

我主要学的openpyxl和pandas,xlwings没怎么学

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-19 15:28 | 显示全部楼层
  1. import xlwings as xw    # 导入xlwings模块
  2. from pathlib import Path
  3. # xlwings操作Excel的套路——引领
  4. app = xw.App(visible=True, add_book=False)   # 启动Excel
  5. wb = app.books.open(r'E:\WPS练习题\业绩提成表.xlsx')   # 打开Excel工作簿
  6. sht = wb.sheets['业绩提成']     # 定位引用工作表
  7. arr = sht.range("A1").expand().value         # 读取工作表内容
  8. brr = [x for x in arr if x[2].find('小') > -1]     # 加工处理数据
  9. brr.insert(0, arr[0])      # 添加表头
  10. sht.range('l1:p5').value = brr       # 处理后数据写入工作表
  11. wb.save()      # 保存
  12. wb.close()     # 关闭
  13. app.quit()     # 退出Excel

  14. # 新建工作簿
  15. app = xw.App(visible=True, add_book=False)
  16. wb = app.books.add()    # 新建工作簿
  17. wb.save(r'E:\Python操控Excel\练习.xlsx')   # 保存工作簿
  18. sht = wb.sheets[0]    # 引用指定工作表
  19. sht.name = '员工信息表'    # 重命名工作表
  20. sht.range("A1").value = [1, 2, 3, 4, 5]      # 行写入数据
  21. sht.range("B2:F2").value = ['a', 'b', 'c', 'd', 'e']    # 行写入数据
  22. sht.range("a2").options(transpose=True).value = ['A', 'B', 'C', 'D']   # 列写入数据
  23. sht.range("A1:C3").clear_contents()   # 指定区域清楚数据
  24. sht.clear_contents()    # 整个工作表清楚数据
  25. arr = [['序号', '姓名', '性别', '年龄'], [1, '张三', '男', 23], [2, '李敏', '女', 18], [3, '马超', '男', 36]]
  26. sht.range("A1:D1").color = (247, 109, 221)   # 给单元格区域添加底色
  27. # rng.color = None    # 取消底色
  28. sht.range("A1:D1").font.color = (255, 255, 255)    # 给字体添加颜色
  29. sht.range("a1:d1").font.name = '微软雅黑'      # 设置字体
  30. sht.range("a1:d1").font.size = 14         # 设置字号
  31. sht.range("A1:D1").font.bold = True       # 设置是否加粗
  32. sht.range("a1").resize(len(arr), len(arr[0])).value = arr   # 数组一次性写入单元格区域中

  33. brr = [4, "貂蝉", "女", 24]     # 添加一条记录
  34. # rn = sht.range("A1").expand('down').last_cell.offset(1, 0)    # 定位
  35. # end(参数)方法返回区域内的边界单元格,参数有:up,down,right,left。得到的结果与按Ctrl+up,Ctrl+down,Ctrl+right,Ctrl+left
  36. rn = sht.range('A1').end('down').offset(1, 0)     # 定位
  37. rn.value = brr      # 把记录写入工作表

  38. # 获取单元格区域行数和列数——shape属性
  39. tup = sht.range('A1').expand('table').shape  # 数据区域的行数和列数,得到一个元组
  40. print(tup)      # (5, 4)
  41. row_nums = tup[0]     # 行数是5
  42. col_nums = tup[1]     # 列数是4
  43. sht.cells(row_nums+1, 1).value = [5, '唐伯虎', '男', 28]    # 添加一条新数据

  44. # 获取单元格区域的单元格数,行数,列数——count属性
  45. rnge = sht.range('A1').expand('table')   # 和省略table是一样的。
  46. cell_nums = rnge.count    # 获取单元格区域内单元格个数
  47. cls = rnge.size             # 获取单元格区域内单元格个数
  48. r_nums = rnge.rows.count     # 获取单元格区域内的行数
  49. c_nums = rnge.columns.count     # 获取单元格区域内的列数
  50. print(cell_nums, r_nums, c_nums, cls)

  51. # sht.clear()       # 清除工作表,包括内容格式。还可以清除受保护的工作表的内容
  52. wb.sheets.add('员工工资表', after='员工信息表')    # 在员工信息表后面新建一个表,命名为员工工资表
  53. area = sht.range("a1").expand()     # 向下向右的扩展区域,是方法
  54. area2 = sht.range("A1").current_region     # 当前单元格区域,是属性
  55. # 两者区域是有区别的,要深刻理解合理运用。
  56. print(area)
  57. print(area2)
  58. rng = area.last_cell     # 区域内最后一个单元格
  59. r = rng.row       # 单元格所在的行号
  60. c = rng.column    # 单元格所在的列号
  61. print(r, c)
  62. area.autofit()     # 自动调整区域的行高和列宽
  63. area2.wrap_text = True     # 设置单元格区域自动换行

  64. app.screen_updating = False    # 关闭屏幕更新,可以加速脚本运行
  65. app.display_alerts = False    # 关闭消息提醒
  66. app.calculate()     # 重算工作簿
  67. app.display_alerts = True
  68. app.screen_updating = True

  69. wb = app.books.active    # 引用当前活动工作簿
  70. wb.activate()     # 激活wb工作簿
  71. wb.activate(steal_focus=True)    # 激活wb工作簿,并把窗口显示到最上层,并且把焦点从Python切换到Excel
  72. pth = wb.fullname     # 获取工作簿的完整路径。
  73. print(pth)            # E:\Python操控Excel\练习.xlsx
  74. wbn = wb.name       # 获取工作薄名称(带扩展名)
  75. n = wb.names       # 返回工作薄中定义过的所有公式名称(名称管理器中可见,当然也可以隐藏)
  76. print(n)          # 如果工作簿中没有定义过公式名称,那么返回的将是一个空序列
  77. wb.app.calculation = 'manual'    # 计算模式改为手动计算。有三种模式:manual(手动), automatic(自动), semiautomatic(半自动)三种方式

  78. # shts和shts1有可能相同,也有可能不同
  79. shts = xw.sheets     # 引用当前活动工作薄中的所有工作表
  80. shts1 = wb.sheets    # 引用指定工作簿中的所有工作表
  81. # sht.delete()       # 删除工作表(可以删除隐藏的工作表,但是不能删除深度隐藏的工作表)
  82. b = sht.book       # 工作表所在的工作簿对象
  83. print(b)
  84. # sht.cells.clear()    # 清除
  85. rng = sht.used_range   # 引用工作表中用过的区域,如果空表,则返回A1单元格
  86. print(rng)

  87. i = sht.range('A1').end('down').row+1
  88. sht.cells(i, 1).value = "合计"
  89. sht.cells(i, 4).formula = '=sum(d2:d'+str(i-1)+')'    # 单元格中写入公式

  90. # 单元格格式设置
  91. sht.range("G1").value = 0.06
  92. sht.range('f1').value = 45309
  93. sht.range("g1").number_format = "0.00%"
  94. sht.range('f1').number_format = "e-m-d"

  95. # 复制粘贴——rng.copy(destination=None)——把一个区域拷贝到目的区域或者剪贴板
  96. sht.range('A1').expand().copy(wb.sheets('员工工资表').range('A1'))
  97. # 参数:destination 设置目标区域,如果省略,rng区域会被拷贝到剪贴板上
  98. ''' rng.paste(paste=None, operation=None, skip_blanks=False, transpose=False)
  99. paste
  100.     all_merging_conditional_formats(将粘贴所有内容,并且将合并条件格式)
  101.     all(粘贴全部内容)
  102.     all_except_borders(粘贴除边框外的全部内容)
  103.     all_using_source_theme(使用源主题粘贴全部内容)
  104.     column_widths(粘贴复制的列宽)
  105.     comments(粘贴批注)
  106.     formats(粘贴复制的源格式)
  107.     formulas(粘贴公式)
  108.     formulas_and_number_formats(粘贴公式和数字格式)
  109.     validation(粘贴有效性)
  110.     values(粘贴值)
  111.     values_and_number_formats(粘贴值和数字格式)
  112. operation
  113.     add(加)
  114.     divide(除)
  115.     multiply(乘)
  116.     subtract(减)
  117. skip_blanks (bool, default False)
  118.     设为 True 时忽略空白单元格
  119. transpose (bool, default False)
  120.     设为 True 时对行列转置
  121. '''
  122. # 插入
  123. sht.range("A3:D4").insert(shift='down', copy_origin='format_from_left_or_above')
  124. '''shift (str, default None)
  125. 指定单元格的移动方向,可选:right 或者 down 。如果省略,Excel根据区域的形状决定。
  126. copy_origin
  127. 这个参数决定了**从何处复制插入单元格的格式,**可选 format_from_left_or_above 或 format_from_right_or_below
  128. '''
  129. # 删除
  130. sht.range("A3:D3").delete(shift='up')
  131. '''参数:shift (str, default None) – 使用 left 或 up 。如果省略,Excel根据区域的形状决定
  132. 可以理解为右侧单元格左移 或者 下方单元格上移
  133. 注意:区域删除后,会被其他单元格补上,但是此时xlwings中的rng已经没了,需要重新选定这个区域才能继续操作
  134. '''
  135. # 合并单元格
  136. sht.range("F3:G4").merge()     # 合并成一个单元格
  137. sht.range('f5:g6').merge(across=True)   # 跨列合并
  138. rngg = sht.range("F3").merge_area     # 返回合并单元格区域
  139. print(rngg)
  140. print(sht.range('g4').merge_cells)    # 判断是否合并单元格
  141. sht.range("f5").unmerge()     # 取消单元格合并

  142. # 设置超级链接
  143. sht.range('f6').add_hyperlink(r'https://club.excelhome.net', 'Excel之家', '提示:点击即链接到Excel之家')

  144. # 插入图片
  145. sht.range("I4:J11").merge()
  146. p = sht.pictures.add(r'C:\Users\Administrator\Desktop\应用程序\图片\image5.jpg')
  147. p.top = sht.range("I4").top
  148. p.left = sht.range('I4').left
  149. p.width = sht.range('I4:J11').width
  150. p.height = sht.range('I4:J11').height
  151. p.delete()

  152. # 综合应用——新建一个图片工作表,批量插入图片
  153. sh = wb.sheets.add('图片', after='员工工资表')
  154. sh.range("A1:A6").column_width = 15
  155. sh.range("A1:A6").row_height = 115
  156. j = 1
  157. pts = Path(r'E:\Python操控Excel')
  158. lst = pts.glob("*.jpg")
  159. for ws in lst:
  160.     p = sh.pictures.add(ws)
  161.     p.top = sh.range("A"+str(j)).top
  162.     p.left = sh.range("A"+str(j)).left
  163.     p.width = sh.range("A"+str(j)).width
  164.     p.height = sh.range("A"+str(j)).height
  165.     sh.cells(j, 2).value = ws.stem
  166.     j += 1
  167. sh.range('A1:B1').insert('down')
  168. sh.range('A1:B1').row_height = 25
  169. sh.range('a1').value = '图片'
  170. sh.range('b1').value = '名称'

  171. # 下面引用API,一用就卡死,代码不往下运行,效果是有的。都能居中
  172. # area.api.HorizontalAlignment = -4108     # 垂直居中
  173. # area.api.verticalAlignment = -4108       # 水平居中
  174. sht.select()    # 员工信息表被选中,即当前活动表格。注意:只能在活动工作簿中选择
  175. wb.save()       # 保存工作簿
  176. wb.close()      # 关闭工作簿
  177. # app.quit()      # 退出Excel
  178. app.kill()      # 通过杀掉进程,强制退出Excel
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-19 15:32 | 显示全部楼层
cztanghao 发表于 2024-1-19 14:25
我主要学的openpyxl和pandas,xlwings没怎么学

其它的,都没有这个全,这个xlwings模块可读可写,

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-19 15:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
下面是pathlib模块操作文件和文件夹笔记

  1. # 创建路径对象
  2. # 由于‘\’路径分隔符在Python中有特殊含义,所以要用转义字符“\\”
  3. # 表示路径的写法有三种:
  4. # 1. ’E:\\Python\\练习\\path对象.xlsx‘
  5. # 2. ‘E:/Python/练习/path对象.xlsx‘
  6. # 3. r’E\Python\练习\path对象.xlsx'
  7. # 创建Path对象
  8. from pathlib import Path
  9. p = Path('E:\\Python\\练习\\path对象.xlsx')  # 通过构造函数Path把字符串对象转换为路径对象
  10. print(type(p))   # <class 'pathlib.WindowsPath'>
  11. print(p)     # E:\Python\练习\path对象.xlsx

  12. # 获取当前工作目录cwd()函数,获取当前用户文件夹的绝对路径home()
  13. pd = Path.cwd()
  14. py = Path.home()
  15. print(pd)   # C:\Users\Administrator\PycharmProjects\pythonProject1
  16. print(py)   # C:\Users\Administrator

  17. # 分解路径——parts属性
  18. p_part = p.parts     # 属性值是元组对象
  19. for pt in p_part:
  20.     print(pt)
  21. print(p_part)    # ('E:\\', 'Python', '练习', 'path对象.xlsx')

  22. # parent与parents属性提取指定路径的上级路径
  23. prt = pd.parent
  24. prts = pd.parents
  25. print(prt)        # C:\Users\Administrator\PycharmProjects
  26. for pts in prts:
  27.     print(pts)

  28. # 获取文件全名,文件主名和文件夹名(name属性和stem属性)
  29. fn = p.name
  30. sn = p.stem
  31. print(fn)      # path对象.xlsx
  32. print(sn)      # path对象
  33. print(p.parent.name)      # 练习
  34. print(p.parent.stem)      # 练习

  35. # 获取文件扩展名——suffix属性和suffixes属性
  36. kn = p.suffix
  37. kns = p.suffixes
  38. print(kn)      # .xlsx   生成的是字符串
  39. print(kns)     # ['.xlsx']  生成的是列表

  40. # 更改文件夹名、文件名、扩展名——with_name()函数和with_suffix()函数
  41. p1 = p.with_name("Pathlib中的path对象.xlsx")
  42. p2 = p.with_suffix('.xls')
  43. # p3 = p.with_name('对象')
  44. print(p1)     # E:\Python\练习\Pathlib中的path对象.xlsx
  45. print(p2)     # E:\Python\练习\path对象.xls
  46. # print(p3)   # E:\Python\练习\对象

  47. # 判断路径是否为绝对路径——is_absolute()函数
  48. f = p.is_absolute()
  49. print(f)     # True

  50. # 文件和文件夹的操作
  51. # 判断文件或文件是否存在——exists()函数
  52. ff = p.exists()
  53. print(ff)        # False
  54. fj = pd.exists()
  55. print(fj)        # True
  56. # 判断是文件夹还是文件:is_dir()和is_file()
  57. print(pd.is_dir())
  58. print(pd.is_file())
  59. ppp = pd / '文件操作.py'
  60. print(ppp.is_dir())
  61. print(ppp.is_file())

  62. # 新建和删除文件夹(mkdir()和rmdir())
  63. # 表达式.mkdir(parents,exist_ok)
  64. # 表达式是一个路径对象,指向要新建的文件夹
  65. # parents参数为False或省略时,如果找不到要新建的文件夹的上级路径,会报错,当为True时,则会自动新建任何不存在的上级路径
  66. # exist_ok参数为False或省略时,如果要新建的文件夹已经存在,则会报错;如果为True时,则不会报错。
  67. p.mkdir(parents=True, exist_ok=True)
  68. print(p.is_dir())
  69. p.rmdir()     # 要删除的文件夹必须是空的,否则报错
  70. p1 = Path('E:\\Python\\练习')
  71. p1.rmdir()

  72. # 新建和删除文件(touch()和unlink())
  73. ps = Path('E:\\Python\\新建文件.xlsx')
  74. ps.touch(exist_ok=True)   # 如果新建的文件已经存在,exist_ok为False时报错,
  75. ps.unlink(missing_ok=True)  # 如果要删除的文件不存在,missing_ok为False时报错
  76. # 所以新建或删除文件或文件夹,参数都设置为真,就不会报错
  77. # 整体思路:先选择,后操作的思路

  78. # 列举文件夹中的内容(包括文件和文件夹)

  79. pth = Path(r'E:\Python\练习2')
  80. pth.mkdir(parents=True, exist_ok=True)   # 新建文件夹
  81. ptf = Path(Path('E:\\Python\\练习2\\新建文件.xlsx'))
  82. ptf.touch(True)     # 在新建的文件夹中新建一个Excel文件
  83. ptf1 = Path('E:\\Python\\测试.txt')
  84. ptf1.touch(True)    # 在新建文件夹的父文件中新建一个txt文本文件
  85. pp = Path('E:\\Python')
  86. wjr = pp.iterdir()     # 列举文件夹内容(包含文件或子文件夹),但不列举子文件夹的内容
  87. for wj in wjr:
  88.     print(wj)

  89. # 判断文件夹是否为空
  90. def is_dir_empty(s):
  91.     if not list(s.iterdir()):
  92.         return True
  93.     else:
  94.         return False

  95. t = is_dir_empty(pth)
  96. print(t)
  97. ps = Path(r'E:\新建文件夹2')
  98. s = is_dir_empty(ps)
  99. print(s)

  100. # 罗列并筛选文件夹的内容
  101. '''路径对象的glob()函数rglob()函数不仅像iterdir()函数那样罗列文件夹内容,而且还能对罗列结果进行筛选,只返回符合条件的文件
  102. 和子文件夹路径。
  103. 表达式.glob/rglob(pattern)
  104. 其中表达式是一个路径对象,指向一个文件夹
  105. pattern:一个字符串,代表筛选条件。筛选条件中可以使用通配符“*”和“?”来进行模糊筛选。
  106. “*”:匹配多个任意字符(0——+∞)
  107. “?”:匹配单个任意字符
  108. glob()函数和rglob()函数的区别:
  109. glob()函数和iterdir()函数只进行一级罗列,如果在筛选条件加上“**/*”(注意前面是两个*)才会递归罗列
  110. rglob()函数始终进行递归罗列
  111. '''
  112. pts = Path(r'E:\Python')
  113. lst = pts.glob("**/*.txt")
  114. for ws in lst:
  115.     print(ws)
  116. ls = pts.rglob("*.*")
  117. for wt in ls:
  118.     print(wt)
复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-19 16:42 | 显示全部楼层
本帖最后由 ctp_119 于 2024-1-20 07:13 编辑

Pathlib模块综合应用——删除文件夹

  1. from pathlib import Path

  2. def sch(s):
  3.     if s.is_dir():   # 判断是否是文件夹,是文件夹为真,否则为假
  4.         lst = s.iterdir()   # 罗列文件夹的内容,可迭代对象
  5.         for w in lst:     # 循环可迭代对象
  6.             if w.is_file():
  7.                 w.unlink()     # 判断是文件,直接删除文件
  8.             else:
  9.                 sch(w)       # 如果是文件夹,就回溯
  10.         if not list(s.iterdir()):  # 在删除子项后再次检查是否为空
  11.             s.rmdir()         # 删除空文件夹

  12. pt = Path(r'E:\文件夹')
  13. sch(pt)
复制代码


TA的精华主题

TA的得分主题

发表于 2024-1-20 07:31 | 显示全部楼层
前两天刚刚下载了ANACONDA,还不知道从何学起呢,版主有推荐的学习教程吗,
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-10 00:21 , Processed in 0.039498 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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