为什么openpyxl处理生成的excel文件是未保存状态?
从视觉上来说,跟处理后的效果一模一样,但是实际上openpyxl生成的Excel文件是未保存的如果excel处于未保存状态的话,用openpyxl去读其公式的结果值,要么是公式本身,要么是none
这时进行数据处理就得绕一下,有些不方便,请教一下大神有没有解决办法。 处理 excel 还是建议用 pandas 和 xlwings 这两个库
pandas 太出名了就不多说了,xlwings 也是我认为众多 excel 库中最好用的之一,因为封装了 win32 的接口,所以几乎可以做到你想做的所有 excel 操作 本帖最后由 阿奇_o 于 2021-8-18 20:41 编辑
这的确有点鸡肋啊,无论openpyxl,还是 xlwings , 本质上都需要"打开"Excel文件,才能获取到公式的计算结果。。
{:10_284:}
# 参考:
# 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
louxinghao 发表于 2021-8-18 17:53
处理 excel 还是建议用 pandas 和 xlwings 这两个库
pandas 太出名了就不多说了,xlwings 也是我认为众 ...
好,后面我试试 阿奇_o 发表于 2021-8-18 20:38
这的确有点鸡肋啊,无论openpyxl,还是 xlwings , 本质上都需要"打开"Excel文件,才能获取到公式的计算结果 ...
Dispatch方法我昨天试过,当时的情况是,我手动保存的excel能正常读结果值,但是openpyxl直接生成的则一直提示我找不到文件。刚刚我又重新试了一下,发现未保存的excel也可以读值了。。。无语。感觉像玄学 一身腱子肉 发表于 2021-8-19 09:55
Dispatch方法我昨天试过,当时的情况是,我手动保存的excel能正常读结果值,但是openpyxl直接生成的则一 ...
一开始我用相对路径,也找不到。win32.client.Dispatch的应用它有自己的默认工作目录(好像是C盘的那个Documents目录),
这就大概率造成和你当前程序的工作目录存在不一致,所以最好用绝对路径,才行。 阿奇_o 发表于 2021-8-19 10:47
一开始我用相对路径,也找不到。win32.client.Dispatch的应用它有自己的默认工作目录(好像是C盘的那个 ...
我用的就是绝对路径,直接从盘符开始手敲的,还是说找不到,我自己在对应的文件夹下手动新建一个excel能正常读取。然后今天来,又试了一下,结果又可以了{:10_262:}
我代码都是昨天保存的,一点都没动,不知道为什么,只能是玄学 一身腱子肉 发表于 2021-8-19 16:22
我用的就是绝对路径,直接从盘符开始手敲的,还是说找不到,我自己在对应的文件夹下手动新建一个excel能 ...
不太清楚你的具体情况。不过我认为计算机和数学应该是离"玄学"最远的领域。。
页:
[1]