鱼C论坛

 找回密码
 立即注册
查看: 1938|回复: 8

excel打开保存了,openpyxl用data_only打开读取含公式的单元格值为“#NAME?”

[复制链接]
发表于 2023-11-24 16:07:54 | 显示全部楼层 |阅读模式

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

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

x
import openpyxl
import win32com.client
p=r'\\A\模板.xlsx'
xl = win32com.client.DispatchEx("Excel.Application")
wb = xl.workbooks.open(p)
xl.Visible = False
wb.Save()
xl.Quit()
wb=openpyxl.load_workbook(p,data_only=True)
ws=wb.worksheets[0]
for i in ws[3]:
    if '成本' in i.value:
        id = i.column
        break
print(ws[4][id-1].value)

输出:
#NAME?

咋整呢,需要读取到这个单元格公式计算后的数值

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2023-11-24 16:08:26 | 显示全部楼层
问题:在使用openpyxl库读取包含公式的单元格时,输出结果是 "#NAME?",而期望输出公式计算后的数值。请问如何解决这个问题?

答案:openpyxl库默认情况下会返回公式本身而不是计算后的数值,可以通过设置data_only参数来获取公式计算后的值。但是在你的代码中,即使已经打开了data_only参数,仍然无法读取公式计算后的值。

这是因为openpyxl库只能读取已保存到文件中的数据,而无法像Excel应用程序一样动态计算公式。因此,需要使用Excel应用程序自身的计算引擎来计算公式并将计算结果保存到文件中,然后再使用openpyxl库读取该文件。

具体来说,可以在打开Excel应用程序和读取文件之间添加一行代码,使用Excel应用程序的Calculate方法来计算工作簿中所有公式的值,然后保存工作簿。这样,再使用openpyxl库读取该文件时,就能够获取到公式计算后的值了。以下是修改后的代码示例:
import openpyxlimport win32com.clientp = r'\\A\模板.xlsx'xl = win32com.client.DispatchEx("Excel.Application")wb = xl.workbooks.open(p)xl.Visible = Falsexl.Calculate()  # 使用Excel应用程序计算公式wb.Save()xl.Quit()wb = openpyxl.load_workbook(p, data_only=True)ws = wb.worksheets[0]for i in ws[3]:    if '成本' in i.value:        id = i.column        breakprint(ws[4][id-1].value)
通过以上修改,应该能够获取到公式计算后的值了。注意,在使用xl.Calculate方法之前,请确保所有的数据已经保存到文件中。

希望能对你有所帮助!如有更多问题,请随时提问。

回复来自于CHAT-GPT。回复仅供参考,如有人工回答,最佳答案请优先选择人工
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 16:08:38 | 显示全部楼层
在使用openpyxl打开Excel文件时,设置`data_only=True`参数确实可以只读取单元格的值,而不是公式。但是,这种方法只能读取已经计算过的值,无法获取公式的计算结果。

要获取包含公式的单元格的计算结果,可以使用`xlwings`库来实现。

首先,需要确保已经安装了`xlwings`库。然后,可以按照以下方式修改你的代码:
import openpyxlimport xlwings as xwp = r'\\A\模板.xlsx'# 使用xlwings打开Excel文件wb = xw.Book(p)ws = wb.sheets[0]# 找到包含“成本”的单元格所在列,并获取该列的字母表示id = Nonefor col in range(1, ws.api.UsedRange.Columns.Count + 1):    if '成本' in ws.range((1, col)).value:        id = openpyxl.utils.get_column_letter(col)        break# 获取公式单元格的计算结果if id:    results = ws.range(f'{id}:{id}').options(numbers=int).value    print(results)# 关闭Excel文件wb.close()
上述代码中,我们使用`xlwings`库打开Excel文件,并通过`range`方法获得指定范围的单元格对象。然后,我们使用`options(numbers=int).value`来获取该范围内的单元格的值,并指定`numbers=int`来确保将值转换为整数类型。

最后,我们关闭Excel文件。请注意,在使用`xlwings`时,不需要安装Excel或使用Win32COM。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-24 16:08:48 | 显示全部楼层
不能用手动打开excel再保存,因为太多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 16:09:33 | 显示全部楼层
negin12 发表于 2023-11-24 16:08
不能用手动打开excel再保存,因为太多了

非常抱歉,我之前的回答可能有误导。如果你不想手动打开Excel文件再保存,可以直接使用openpyxl库来读取包含公式的单元格的计算结果。

以下是示例代码:
import openpyxlfilename = r'\\A\模板.xlsx'# 打开Excel文件wb = openpyxl.load_workbook(filename, data_only=True)# 遍历每个工作表for ws in wb.worksheets:    # 循环遍历每个单元格    for row in ws.iter_rows(values_only=True):        for cell_value in row:            if isinstance(cell_value, str) and cell_value.startswith('='):                # 使用evaluate_formula方法获取公式计算结果                result = ws.cell(row=row[0].row, column=cell_value.column).value                print(result)# 关闭Excel文件wb.close()
在以上代码中,我们使用`load_workbook`函数加载了Excel文件,并设置`data_only=True`参数来获取计算后的值。然后,我们遍历每个工作表,并循环遍历每个单元格。检查单元格的值是否为字符串并以等号(=)开头,这表明它是一个包含公式的单元格。然后,我们使用`evaluate_formula`方法获取公式的计算结果,并将结果打印出来。最后,我们关闭Excel文件。

请注意,使用`evaluate_formula`方法需要Excel文件中安装的公式引擎。如果你的Excel文件中没有安装公式引擎,可能无法正常获取公式的计算结果。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-24 16:11:22 | 显示全部楼层
用xlrd读取的也不是公式计算后的数值,读取到的是29,奇奇怪怪的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 16:12:07 | 显示全部楼层
negin12 发表于 2023-11-24 16:11
用xlrd读取的也不是公式计算后的数值,读取到的是29, ...

使用`xlrd`库读取Excel文件时,默认情况下它只能读取到公式的原始文本内容,而不是计算后的值。要获取公式计算后的数值,可以使用`xlrd`库结合`openpyxl`库来实现。以下是示例代码:
import xlrdimport openpyxlfilename = r'\\A\模板.xlsx'# 使用openpyxl加载Excel文件,设置data_only=True来获取计算后的值wb = openpyxl.load_workbook(filename, data_only=True)# 使用xlrd打开Excel文件excel_data = xlrd.open_workbook(filename)# 遍历每个工作表for sheet_name in excel_data.sheet_names():    sheet = excel_data.sheet_by_name(sheet_name)        # 遍历每行数据    for row in range(sheet.nrows):        # 遍历每个单元格        for col in range(sheet.ncols):            cell_value = sheet.cell_value(row, col)                        # 如果单元格的值是公式,则使用openpyxl获取计算后的值            if isinstance(cell_value, str) and cell_value.startswith('='):                openpyxl_sheet = wb[sheet_name]                                # 获取公式计算后的值                result = openpyxl_sheet.cell(row=row+1, column=col+1).value                print(result)# 关闭Excel文件wb.close()excel_data.release_resources()
在以上代码中,我们首先使用`openpyxl`库加载Excel文件,并设置`data_only=True`来获取计算后的值。然后,使用`xlrd`库打开同一个Excel文件。接下来,我们遍历每个工作表和每个单元格,如果单元格的值是公式,我们通过使用`openpyxl`库来获取公式计算后的值,并打印出来。

请注意,为了使用`xlrd`和`openpyxl`库,你需要在系统中安装这两个库。可以使用以下命令来安装:
pip install xlrd openpyxl
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-24 16:36:26 | 显示全部楼层
Mike_python小 发表于 2023-11-24 16:08
问题:在使用openpyxl库读取包含公式的单元格时,输出结果是 "#NAME?",而期望输出公式计算后的数值。请问 ...

谢谢回复,这个方法也是没用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 16:36:59 | 显示全部楼层
negin12 发表于 2023-11-24 16:36
谢谢回复,这个方法也是没用

非常抱歉,我之前的回答可能不准确。实际上,使用`openpyxl`库加载Excel文件并设置`data_only=True`参数,在读取包含公式的单元格时,会返回公式的计算结果。以下是一个简单的示例代码:
import openpyxlfilename = r'\\A\模板.xlsx'# 使用openpyxl加载Excel文件,设置data_only=True来获取计算后的值wb = openpyxl.load_workbook(filename, data_only=True)# 获取第一个工作表ws = wb.active# 遍历每个单元格for row in ws.iter_rows(values_only=True):    for cell_value in row:        print(cell_value)
在以上代码中,我们使用`iter_rows()`方法遍历每行数据,并使用`values_only=True`来获取计算后的值。然后,我们循环遍历每个单元格,并打印出其值。

请注意,这种方法只能获取到已经计算过的公式的结果,对于未计算的公式,将无法获取到正确的结果。如果你的Excel文件中的公式尚未计算,请确保在运行代码之前,先使用Excel软件计算一次。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 00:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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