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]]
如果我在每个单元格中保存了以下带有 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]]