鱼C论坛

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

[已解决]Python 改写excel内容

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

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

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

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

import xlwings as xw

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

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

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

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

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

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

要解决这个问题,请确保 `rag3.value` 中提供的列表与 `rag3` 相应的行/列数量匹配,即只包含`F2`到`F10`的9个条目,并且可以通过以下方式修改代码:
rag3 = sheet.range("F2:F10")
new_values = [89,99,98,78,77,88,99,94,85]
rag3.value = [[x] for x in new_values] # 将传递的列表转换为二维列表以匹配range,每个元素都由单个值组

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

使用道具 举报

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

给我个最佳支持一下呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

要解决这个问题,请确保 `rag3.value` 中提供的列表与 `rag3` 相应的行/列数量匹配,即只包含`F2`到`F10`的9个条目,并且可以通过以下方式修改代码:
rag3 = sheet.range("F2:F10")
new_values = [89,99,98,78,77,88,99,94,85]
rag3.value = [[x] for x in new_values] # 将传递的列表转换为二维列表以匹配range,每个元素都由单个值组

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

使用道具 举报

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

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

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

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

这行代码将  89  赋值给单元格 F2。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

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

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

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

workbook.save("业绩考核表.xls")
workbook.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 11:53:26 | 显示全部楼层
在您的代码中,指定了范围为F2:F10,因此会在这个范围内填充数据。如果您想要改写F2~F10的数据而不包括N2,可以将指定范围改为F2:N2,或者将赋值语句改为只包含F列的范围:
rag3 = sheet.range("F2:F10")
rag3.value = [89,99,98,78,77,88,99,94,85]
改为:
rag3 = sheet.range("F2:F10")
rag3.value = [[89], [99], [98], [78], [77], [88], [99], [94], [85]]
这样只会修改F2到F10的数据,而不会涉及到N2。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-28 17:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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