日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python openpyxl打开有公式的excel表取值错误的解决办法,Python openpyxl获取excel有公式的单元格的数值错误,Python操作excel(.xlsx)封装类

發(fā)布時(shí)間:2025/3/11 python 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python openpyxl打开有公式的excel表取值错误的解决办法,Python openpyxl获取excel有公式的单元格的数值错误,Python操作excel(.xlsx)封装类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Python openpyxl打開有公式的表格,如果直接讀取,會(huì)出現(xiàn)有公式的單元格為空或零的情況。
參見:
https://blog.csdn.net/weixin_45903952/article/details/105073611?utm_medium=distribute.wap_relevant.none-task-blog-title-3

wb = openpyxl.load_workbook(‘test.xlsx’, data_only=True)
當(dāng)’test.xlsx’被生成并在Excel程序中打開并保存之后(這個(gè)過程Excel會(huì)把公式結(jié)果計(jì)算出來),該文件附帶有兩套值,一套是公式全都沒有計(jì)算的(data_only=False(默認(rèn))),一套是公式計(jì)算了結(jié)果的(data_only=True)。(如果沒有被Excel打開并保存,則只有一套值(data_only=False的那套,公式?jīng)]有計(jì)算結(jié)果的)。
此時(shí),以data_only=True或默認(rèn)data_only=False打開會(huì)得到兩種不同的結(jié)果,各自獨(dú)立,即data_only=True狀態(tài)下打開的,會(huì)發(fā)現(xiàn)公式結(jié)果為None(空值)或者一個(gè)計(jì)算好的常數(shù),而不會(huì)看到它原本的公式是如何。而data_only=False則只會(huì)顯示公式而已。因此,data_only=True狀態(tài)下打開,如果最后用save()函數(shù)保存了,則原xlsx文件中,公式會(huì)被替換為常數(shù)結(jié)果或空值。而data_only=False狀態(tài)下打開,最后用save()函數(shù)保存了的話,原xlsx文件也會(huì)只剩下data_only=False的那套值(即公式),另一套(data_only=True)的值會(huì)丟失,如想重新獲得兩套值,則仍舊需要用Excel程序打開該文件并保存。

def justOpen(strFileName):"""模擬手工打開excel表:param strFileName: 打開的excel文件名(后綴.xlsx格式)"""try:xlApp = Dispatch("Excel.Application")xlApp.Visible = FalsexlBook = xlApp.Workbooks.Open(os.path.join(os.getcwd(), strFileName))xlBook.Save()xlBook.Close()except:print("請(qǐng)手工打開 %s 后,隨便修改一個(gè)空值并保存" % strFileName)

**

我的完整測(cè)試代碼如下:

**

""" ================================================ Python模塊:Python操作excel(.xlsx)封裝類MyPyExcel ================================================ """import openpyxl from openpyxl.worksheet.worksheet import Worksheet import os from win32com.client import Dispatchclass MyPyExcel:"""Python操作excel(.xlsx)封裝類MyPyExcel"""def __init__(self, strOpenFilePath, data_only=True):"""初始化功能,加載excel文件: strOpenFilePath: 要打開的excel(.xlsx)文件路徑"""self.strOpenFilePath = strOpenFilePath # 工作簿路徑self.workbook = None # 工作簿對(duì)象self.worksheet = None # 工作表對(duì)象path = os.path.join(os.getcwd() + "\\" + strOpenFilePath)# 文件存在就加載,不存在就創(chuàng)建工作簿。if os.path.exists(path):# 文件存在就加載,加載失敗就報(bào)錯(cuò)。try:self.workbook = openpyxl.load_workbook(strOpenFilePath, data_only=data_only)except:print("加載excel文件失敗!請(qǐng)檢查!")raiseelse:print("加載excel文件不存在!自動(dòng)創(chuàng)建文件!")self.workbook = openpyxl.Workbook() # 創(chuàng)建工作簿def openWorkSheet(self, strSheetName) -> Worksheet: # 表示此函數(shù)的返回值,是一個(gè)這樣的類型,函數(shù)注解"""打開工作表功能:param strSheetName: 要打開的工作表名稱:return: 返回打開的工作表Worksheet對(duì)象"""if strSheetName in self.workbook.sheetnames:self.worksheet = self.workbook[strSheetName]else:print("表單名稱在當(dāng)前excel文件中不存在,請(qǐng)檢查表單名稱!")return self.worksheetdef getDataByCell(self, nRow, nColumn):"""讀取一個(gè)單元格的數(shù)據(jù)功能:param nRow: 行號(hào)1,2,...:param nColumn: 列號(hào)1,2,...:return: 指定單元格數(shù)值"""# 判斷行號(hào)、列號(hào)有效if self.isCheckNumValid(nRow, self.worksheet.max_row) is True and \self.isCheckNumValid(nColumn, self.worksheet.max_column) is True:return self.worksheet.cell(nRow, nColumn).valuedef putDataByCell(self, nRow, nColumn, value):"""寫入一個(gè)單元格數(shù)據(jù)功能:param nRow: 行號(hào)1,2,...:param nColumn: 列號(hào)1,2,...:param value: 寫入指定單元格的數(shù)值"""self.worksheet.cell(nRow, nColumn).value = valuedef saveWorkBookData(self, strSaveFilePath):"""保存工作簿數(shù)據(jù)功能:param strSaveFilePath: 保存或另存工作簿的路徑"""try:self.workbook.save(strSaveFilePath)except PermissionError:print("要操作的文件,沒有寫入權(quán)限,請(qǐng)檢查權(quán)限!")raiseexcept FileNotFoundError:print("文件路徑不存在,請(qǐng)確保路徑正確!")raiseexcept:print("保存寫入的數(shù)據(jù)失敗!請(qǐng)檢查異常!")raisedef closeWorkBook(self):"""關(guān)閉工作簿功能"""self.workbook.close()@staticmethoddef isCheckNumValid(cur_num, max_num):"""檢測(cè)數(shù)據(jù)是否有效功能:param cur_num: 當(dāng)前指定的行號(hào)或列號(hào)1,2...:param max_num: 當(dāng)前工作表的最大行號(hào)或最大列號(hào)1,2...:return: True表示數(shù)據(jù)有效,否則反"""# 類型檢測(cè)if type(cur_num) is not int and type(cur_num) is not str:print("cur_num 數(shù)據(jù)類型錯(cuò)誤!請(qǐng)確認(rèn)為整數(shù)類型,或者為字符串類型!")return False# 數(shù)字檢測(cè)if type(cur_num) is str:try:cur_num = int(cur_num)except:print("cur_num參數(shù)非法!請(qǐng)確認(rèn)是輸入數(shù)據(jù)為整數(shù)數(shù)字!")return False# 數(shù)字是否出范圍if cur_num in range(1, max_num + 1):return Trueelse:print("行號(hào)或者列號(hào),超出了目前最大行號(hào),或者最大列號(hào)!!")return False@staticmethoddef justOpen(strFileName):"""模擬手工打開excel表:param strFileName: 打開的excel文件名(后綴.xlsx格式)"""try:xlApp = Dispatch("Excel.Application")xlApp.Visible = FalsexlBook = xlApp.Workbooks.Open(os.path.join(os.getcwd(), strFileName))xlBook.Save()xlBook.Close()except:print("請(qǐng)手工打開 %s 后,隨便修改一個(gè)空值并保存" % strFileName)""" ======================================== 主函數(shù)功能測(cè)試 ======================================== """ if __name__ == '__main__':# 對(duì)自己定義的功能類進(jìn)行測(cè)試# 正常功能測(cè)試myExcel = MyPyExcel("test.xlsx") # 加載文件myExcel.openWorkSheet("Sheet") # 選擇工作表myExcel.putDataByCell(1, 1, 100) # 寫入一個(gè)單元格數(shù)據(jù)myExcel.putDataByCell(2, 1, 400) # 寫入一個(gè)單元格數(shù)據(jù)myExcel.putDataByCell(3, 1, "=SUM(A1:A2)") # 寫入一個(gè)單元格公式myExcel.saveWorkBookData("test.xlsx") # 保存數(shù)據(jù)myExcel.closeWorkBook() # 關(guān)閉工作簿myExcel.justOpen("test.xlsx") # 模擬手工打開excel表"""讀取單元格的數(shù)值。data_only=True"""myExcel2 = MyPyExcel("test.xlsx") # 加載文件myExcel2.openWorkSheet("Sheet") # 選擇工作表print(myExcel2.getDataByCell(3, 1)) # 讀取某一個(gè)單元格數(shù)據(jù)myExcel2.closeWorkBook() # 關(guān)閉工作簿"""讀取單元格的公式。data_only=False"""myExcel3 = MyPyExcel("test.xlsx", False) # 加載文件myExcel3.openWorkSheet("Sheet") # 選擇工作表print(myExcel3.getDataByCell(3, 1)) # 讀取某一個(gè)單元格公式myExcel3.closeWorkBook() # 關(guān)閉工作簿

輸出結(jié)果如下:

總結(jié)

以上是生活随笔為你收集整理的Python openpyxl打开有公式的excel表取值错误的解决办法,Python openpyxl获取excel有公式的单元格的数值错误,Python操作excel(.xlsx)封装类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。