鱼C论坛

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

[已解决]为什么openpyxl处理生成的excel文件是未保存状态?

[复制链接]
发表于 2021-8-18 17:22:58 | 显示全部楼层 |阅读模式

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

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

x
从视觉上来说,跟处理后的效果一模一样,但是实际上openpyxl生成的Excel文件是未保存的
如果excel处于未保存状态的话,用openpyxl去读其公式的结果值,要么是公式本身,要么是none
这时进行数据处理就得绕一下,有些不方便,请教一下大神有没有解决办法。
最佳答案
2021-8-18 20:38:35
本帖最后由 阿奇_o 于 2021-8-18 20:41 编辑

这的确有点鸡肋啊,无论openpyxl,还是 xlwings , 本质上都需要"打开"Excel文件,才能获取到公式的计算结果。。
  
# 参考:
# https://stackoverflow.com/questions/28517508/read-excel-cell-value-and-not-the-formula-computing-it-openpyxl
# https://groups.google.com/g/openpyxl-users/c/GbBOnOa8g7Y
# https://stackoverflow.com/questions/28517508/read-excel-cell-value-and-not-the-formula-computing-it-openpyxl
# https://stackoverflow.com/questions/23350581/openpyxl-1-8-5-reading-the-result-of-a-formula-typed-in-a-cell-using-openpyxl/23362361
from openpyxl import Workbook, load_workbook
# wb = Workbook()

# sh1 = wb['Sheet']
# sh1['A1'] = 100
# sh1['B1'] = 200
# sh1['C1'] = '=A1+B1'

# wb.save('openpyxl_formula_test.xlsx')

# 解决办法:让公式先计算出结果
from win32com.client import Dispatch
import os 
def just_open(filename):
    '''利用用微软的Excel不显示地打开,让公式得以计算'''
    xlApp = Dispatch("Excel.Application")
    xlApp.Visible = False
    xlBook = xlApp.Workbooks.Open(os.path.abspath(filename)) # 需要决定路径哦
    xlBook.Save()
    xlBook.Close()

just_open(filename="openpyxl_formula_test.xlsx")  
# wb2 = load_workbook('openpyxl_formula_test.xlsx', data_only=False) # 默认读取数据和公式

wb2 = load_workbook('openpyxl_formula_test.xlsx', data_only=True) # 只读取"数据"
# 注:对于公式,若没有经过计算的公式,将识别为 None; 
#     计算过的公式(如用Excel打开一次),则读取公式计算的结果值。

print(wb2['Sheet']['C1'])
# print(wb2['Sheet']['C1'].internal_value) # 据说有些版本用这个读取
print(wb2['Sheet']['C1'].value) 

# ws2 = wb2['Sheet']
# for row in ws2.values:
#     for v in row:
#         print(v)
# 那 用 xlwings 试试?
import xlwings as xw 
# xw.App().visible = True 
with xw.App(visible=False) as xapp:   # 隐藏(不显示)打开的Excel 
    wb3 = xw.Book("openpyxl_formula_test.xlsx") # 会直接打开Excel。。
    # wb3 = xw.Book("test.xlsx") # 注:若不加上面的 visible参数 会直接打开Excel;
    # 不加with语句需要自己关闭Excel应用,否则再次打开时多个Excel并存可能冲突
    # s = xw.sheets  # 居然用 xw的sheets方法,也行
    print(wb3.sheets)
    print(xw.sheets['Sheet'].range('C1').value)
    print(wb3.sheets['Sheet'].range('C1').value) 
    # wb3.close()


# 参考:
# https://www.geeksforgeeks.org/working-with-excel-files-in-python-using-xlwings/
# https://stackoverflow.com/questions/38995281/open-a-workbook-with-xlwings-without-making-it-visible
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-18 17:53:57 | 显示全部楼层
处理 excel 还是建议用 pandas 和 xlwings 这两个库

pandas 太出名了就不多说了,xlwings 也是我认为众多 excel 库中最好用的之一,因为封装了 win32 的接口,所以几乎可以做到你想做的所有 excel 操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-18 20:38:35 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_o 于 2021-8-18 20:41 编辑

这的确有点鸡肋啊,无论openpyxl,还是 xlwings , 本质上都需要"打开"Excel文件,才能获取到公式的计算结果。。
  
# 参考:
# https://stackoverflow.com/questions/28517508/read-excel-cell-value-and-not-the-formula-computing-it-openpyxl
# https://groups.google.com/g/openpyxl-users/c/GbBOnOa8g7Y
# https://stackoverflow.com/questions/28517508/read-excel-cell-value-and-not-the-formula-computing-it-openpyxl
# https://stackoverflow.com/questions/23350581/openpyxl-1-8-5-reading-the-result-of-a-formula-typed-in-a-cell-using-openpyxl/23362361
from openpyxl import Workbook, load_workbook
# wb = Workbook()

# sh1 = wb['Sheet']
# sh1['A1'] = 100
# sh1['B1'] = 200
# sh1['C1'] = '=A1+B1'

# wb.save('openpyxl_formula_test.xlsx')

# 解决办法:让公式先计算出结果
from win32com.client import Dispatch
import os 
def just_open(filename):
    '''利用用微软的Excel不显示地打开,让公式得以计算'''
    xlApp = Dispatch("Excel.Application")
    xlApp.Visible = False
    xlBook = xlApp.Workbooks.Open(os.path.abspath(filename)) # 需要决定路径哦
    xlBook.Save()
    xlBook.Close()

just_open(filename="openpyxl_formula_test.xlsx")  
# wb2 = load_workbook('openpyxl_formula_test.xlsx', data_only=False) # 默认读取数据和公式

wb2 = load_workbook('openpyxl_formula_test.xlsx', data_only=True) # 只读取"数据"
# 注:对于公式,若没有经过计算的公式,将识别为 None; 
#     计算过的公式(如用Excel打开一次),则读取公式计算的结果值。

print(wb2['Sheet']['C1'])
# print(wb2['Sheet']['C1'].internal_value) # 据说有些版本用这个读取
print(wb2['Sheet']['C1'].value) 

# ws2 = wb2['Sheet']
# for row in ws2.values:
#     for v in row:
#         print(v)
# 那 用 xlwings 试试?
import xlwings as xw 
# xw.App().visible = True 
with xw.App(visible=False) as xapp:   # 隐藏(不显示)打开的Excel 
    wb3 = xw.Book("openpyxl_formula_test.xlsx") # 会直接打开Excel。。
    # wb3 = xw.Book("test.xlsx") # 注:若不加上面的 visible参数 会直接打开Excel;
    # 不加with语句需要自己关闭Excel应用,否则再次打开时多个Excel并存可能冲突
    # s = xw.sheets  # 居然用 xw的sheets方法,也行
    print(wb3.sheets)
    print(xw.sheets['Sheet'].range('C1').value)
    print(wb3.sheets['Sheet'].range('C1').value) 
    # wb3.close()


# 参考:
# https://www.geeksforgeeks.org/working-with-excel-files-in-python-using-xlwings/
# https://stackoverflow.com/questions/38995281/open-a-workbook-with-xlwings-without-making-it-visible
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-19 09:40:27 | 显示全部楼层
louxinghao 发表于 2021-8-18 17:53
处理 excel 还是建议用 pandas 和 xlwings 这两个库

pandas 太出名了就不多说了,xlwings 也是我认为众 ...

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

使用道具 举报

 楼主| 发表于 2021-8-19 09:55:47 | 显示全部楼层
阿奇_o 发表于 2021-8-18 20:38
这的确有点鸡肋啊,无论openpyxl,还是 xlwings , 本质上都需要"打开"Excel文件,才能获取到公式的计算结果 ...

Dispatch方法我昨天试过,当时的情况是,我手动保存的excel能正常读结果值,但是openpyxl直接生成的则一直提示我找不到文件。刚刚我又重新试了一下,发现未保存的excel也可以读值了。。。无语。感觉像玄学
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-19 10:47:57 | 显示全部楼层
一身腱子肉 发表于 2021-8-19 09:55
Dispatch方法我昨天试过,当时的情况是,我手动保存的excel能正常读结果值,但是openpyxl直接生成的则一 ...


一开始我用相对路径,也找不到。win32.client.Dispatch的应用它有自己的默认工作目录(好像是C盘的那个Documents目录),
这就大概率造成和你当前程序的工作目录存在不一致,所以最好用绝对路径,才行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-19 16:22:12 | 显示全部楼层
阿奇_o 发表于 2021-8-19 10:47
一开始我用相对路径,也找不到。win32.client.Dispatch的应用它有自己的默认工作目录(好像是C盘的那个 ...

我用的就是绝对路径,直接从盘符开始手敲的,还是说找不到,我自己在对应的文件夹下手动新建一个excel能正常读取。然后今天来,又试了一下,结果又可以了
我代码都是昨天保存的,一点都没动,不知道为什么,只能是玄学
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-19 16:43:11 | 显示全部楼层
一身腱子肉 发表于 2021-8-19 16:22
我用的就是绝对路径,直接从盘符开始手敲的,还是说找不到,我自己在对应的文件夹下手动新建一个excel能 ...

不太清楚你的具体情况。不过我认为计算机和数学应该是离"玄学"最远的领域。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 15:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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