如果我在每個單元格中都有以下保存的 Excel 檔案,其中包含 26007.930562,其中列名代表我用于給定單元格的 Excel 格式:

我運行以下 Python 代碼:
from openpyxl.utils import get_column_letter, column_index_from_string
import win32com.client # https://www.youtube.com/watch?v=rh039flfMto
ExcelApp = win32com.client.GetActiveObject('Excel.Application')
wb = ExcelApp.Workbooks('test.xlsx')
ws = wb.Worksheets(1)
excelRange = ws.Range(ws.Cells(1, 1), ws.Cells(2, 4))
listVals = [[*row] for row in excelRange.Value]
print(listVals)
我得到以下輸出:
[['general', 'currency', 'accounting', 'number'], [26007.930562, Decimal('26007.9306'), Decimal('26007.9306'), 26007.930562]]
請注意“貨幣”和“會計”格式的精度損失。它們變成了一些小數,將后面的幾個小數位四舍五入。是否可以在保持完全精度的同時讀取貨幣和會計格式的單元格?如果是這樣,怎么做?
這就是我說“貨幣格式”時的意思:

編輯:
BigBen 的解決方案適用于本示例。但是,如果您有日期,Value2 不會將它們視為日期,這會導致 Python 中的錯誤,您打算將它們視為日期。我最終不得不寫這個:
listVals = [] # https://stackoverflow.com/a/71375004
for rowvalue, rowvalue2 in zip([[*row] for row in excelRange.Value], [[*row] for row in excelRange.Value2]):
rowlist = []
for value, value2 in zip(rowvalue, rowvalue2):
if type(value) == pywintypes.TimeType:
rowlist.append(value)
else:
rowlist.append(value2)
listVals.append(rowlist)
我確信有比這更快/更有效的方法,但我不知道它是什么。
uj5u.com熱心網友回復:
使用.Value2代替.Value:
listVals = [[*row] for row in excelRange.Value2]
結果:
[['general', 'currency', 'accounting', 'number'], [26007.93056, 26007.93056, 26007.93056, 26007.93056]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/439906.html
