鱼C论坛

 找回密码
 立即注册
查看: 2592|回复: 7

[已解决]Python 改写excel内容

[复制链接]
发表于 2023-5-2 11:51:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我要改写F2~F10的数据,为何写到了F2~N2?


  1. import xlwings as xw

  2. app = xw.App(visible =  True, add_book = False)
  3. workbook = app.books.add()
  4. sheet = workbook.sheets.add ("1月份考核表")

  5. str1 = [
  6.     ["序号","姓名","性别","年龄","职业","业绩"],
  7.     [1,"小鱼","女",22,"导师",78],
  8.     [2,"菲菲","男",21,"讲师",45],
  9.     [3,"茉莉","女",23,"管理员",78],
  10.     [4,"嘻嘻","女",22,"网站设计",77],
  11.     [5,"星星","男",23," UI 设计",78],
  12.     [6,"乐乐","女",22,"教育达人",90],
  13.     [7,"朱朱","女",21,"学生",29],
  14.     [8,"皮皮","男",24,"班主任",56],
  15.     [9,"东东","男",21,"形象设计师",99]
  16.     ]

  17. rag = sheet.range ("A1:F10")
  18. rag.value = str1

  19. rag3 = sheet.range("F2:F10")

  20. rag3.value = [89,99,98,78,77,88,99,94,85]

  21. workbook.save("业绩考核表.xls")
  22. workbook.close()
复制代码
最佳答案
2023-5-2 12:18:53
这可能是由于在 `rag3` 的赋值语句中,提供了一个带有9个条目的单行列表。当指定范围时,它实际上是试图将其放置在F2到N2上,从而导致了数据溢出。

要解决这个问题,请确保 `rag3.value` 中提供的列表与 `rag3` 相应的行/列数量匹配,即只包含`F2`到`F10`的9个条目,并且可以通过以下方式修改代码:

  1. rag3 = sheet.range("F2:F10")
  2. new_values = [89,99,98,78,77,88,99,94,85]
  3. rag3.value = [[x] for x in new_values] # 将传递的列表转换为二维列表以匹配range,每个元素都由单个值组
复制代码


这将创建带有 9 行和1列的二维列表,其中每个值都在对应的单元格中存储。现在修改后的代码应该可以完美运行,并将所需的数据写入只覆盖 `F2` 到 `F10` 单元格。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-2 12:31:40 | 显示全部楼层
isdkz 发表于 2023-5-2 12:22
给我个最佳支持一下呗

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 12:22:00 | 显示全部楼层
horacepython 发表于 2023-5-2 12:06
谢谢,问题已解决。
还想问下,为什么每个数据都要加中括号,这是什么原理?
或者不加中括号,直接用那 ...

给我个最佳支持一下呗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 12:18:53 | 显示全部楼层    本楼为最佳答案   
这可能是由于在 `rag3` 的赋值语句中,提供了一个带有9个条目的单行列表。当指定范围时,它实际上是试图将其放置在F2到N2上,从而导致了数据溢出。

要解决这个问题,请确保 `rag3.value` 中提供的列表与 `rag3` 相应的行/列数量匹配,即只包含`F2`到`F10`的9个条目,并且可以通过以下方式修改代码:

  1. rag3 = sheet.range("F2:F10")
  2. new_values = [89,99,98,78,77,88,99,94,85]
  3. rag3.value = [[x] for x in new_values] # 将传递的列表转换为二维列表以匹配range,每个元素都由单个值组
复制代码


这将创建带有 9 行和1列的二维列表,其中每个值都在对应的单元格中存储。现在修改后的代码应该可以完美运行,并将所需的数据写入只覆盖 `F2` 到 `F10` 单元格。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 12:07:04 | 显示全部楼层
horacepython 发表于 2023-5-2 12:06
谢谢,问题已解决。
还想问下,为什么每个数据都要加中括号,这是什么原理?
或者不加中括号,直接用那 ...

加上中括号的作用是将整数包装成一个列表。因为  xlwings  中的单元格值必须是列表或元组形式,所以需要将单个整数转换成一个列表。这样才能与单元格范围对应的多个单元格的 values 相对应。

如果直接用整数赋值,会得到 TypeError 错误。因此需要将整数用中括号包装成一个包含单个元素的列表。

如果你确信只需要赋值一个整数,并且确定它只需要赋给一个单元格,可以不用中括号:

  1. rag3.value = 89
复制代码


这行代码将  89  赋值给单元格 F2。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-2 12:06:13 | 显示全部楼层
isdkz 发表于 2023-5-2 11:53
需要修改的是F列的数据,可以将 F2:F10 的单元格范围来指定。下面是修改后的代码:

谢谢,问题已解决。
还想问下,为什么每个数据都要加中括号,这是什么原理?
或者不加中括号,直接用那个整型数据列表赋值可行吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 11:53:43 | 显示全部楼层
需要修改的是F列的数据,可以将 F2:F10 的单元格范围来指定。下面是修改后的代码:

  1. import xlwings as xw

  2. app = xw.App(visible=True, add_book=False)
  3. workbook = app.books.add()
  4. sheet = workbook.sheets.add("1月份考核表")

  5. str1 = [
  6.     ["序号", "姓名", "性别", "年龄", "职业", "业绩"],
  7.     [1, "小鱼", "女", 22, "导师", 78],
  8.     [2, "菲菲", "男", 21, "讲师", 45],
  9.     [3, "茉莉", "女", 23, "管理员", 78],
  10.     [4, "嘻嘻", "女", 22, "网站设计", 77],
  11.     [5, "星星", "男", 23, " UI 设计", 78],
  12.     [6, "乐乐", "女", 22, "教育达人", 90],
  13.     [7, "朱朱", "女", 21, "学生", 29],
  14.     [8, "皮皮", "男", 24, "班主任", 56],
  15.     [9, "东东", "男", 21, "形象设计师", 99]
  16. ]

  17. rag = sheet.range("A1:F10")
  18. rag.value = str1

  19. rag3 = sheet.range("F2:F10")
  20. rag3.value = [[89], [99], [98], [78], [77], [88], [99], [94], [85]]

  21. workbook.save("业绩考核表.xls")
  22. workbook.close()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 11:53:26 | 显示全部楼层
在您的代码中,指定了范围为F2:F10,因此会在这个范围内填充数据。如果您想要改写F2~F10的数据而不包括N2,可以将指定范围改为F2:N2,或者将赋值语句改为只包含F列的范围:
  1. rag3 = sheet.range("F2:F10")
  2. rag3.value = [89,99,98,78,77,88,99,94,85]
复制代码

改为:
  1. rag3 = sheet.range("F2:F10")
  2. rag3.value = [[89], [99], [98], [78], [77], [88], [99], [94], [85]]
复制代码

这样只会修改F2到F10的数据,而不会涉及到N2。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 14:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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