win32com Excel 舍入货币和会计格式,但不舍入一般或数字格式 (Python)

win32com Excel rounds currency and accounting formats but not general or number formats (Python)

如果我在每个单元格中保存了以下带有 26007.930562 的 Excel 文档,其中列名代表我对给定单元格使用的 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 = [] # 
  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)

我确定有比这更快/更有效的方法,但我不知道它是什么。

使用.Value2代替.Value

listVals = [[*row] for row in excelRange.Value2]

结果:

[['general', 'currency', 'accounting', 'number'], [26007.93056, 26007.93056, 26007.93056, 26007.93056]]