Django / python以及xlwt语言环境格式的问题

问题描述 投票:4回答:2

我正在使用django-excel-view,它使用django-excel-response,后者又使用xlwt。我有一个场景,用户可以切换区域设置,让他们查看带有标准小数点的浮点数,或者在某些语言中查看逗号小数点。

将视图导出为带有标准小数点区域设置的xls时,它可以正常工作,但使用逗号小数使xls文件将float存储为文本,并在数字前添加撇号(例如'123,45)。我有一种感觉,ExcelResponse(https://djangosnippets.org/snippets/1151/)没有正确处理浮动(参见代码片段的第43行)。

使用逗号小数正确保存xls的正确xlwt样式是什么?检查值是否为逗号小数并应该应用该样式的好方法是什么?换一种说法:

styles = {'datetime': xlwt.easyxf(num_format_str='yyyy-mm-dd hh:mm:ss'),
          'date': xlwt.easyxf(num_format_str='yyyy-mm-dd'),
          'time': xlwt.easyxf(num_format_str='hh:mm:ss'),
          'default': xlwt.Style.default_style,
          'comma_decimal': xlwt.easyxf('????????')}

for rowx, row in enumerate(data):
    for colx, value in enumerate(row):
        if isinstance(value, datetime.datetime):
            cell_style = styles['datetime']
        elif isinstance(value, datetime.date):
            cell_style = styles['date']
        elif isinstance(value, datetime.time):
            cell_style = styles['time']
        elif isinstance(value, ?????????????):
            cell_style = styles['comma_decimal']
        else:
            cell_style = styles['default']
        sheet.write(rowx, colx, value, style=cell_style)

解:

我最后在django-excel-response中添加了一个额外的检查,它对逗号浮点值进行了一些正则表达式检查(由django locale添加它们应该是这样)然后用小数点替换逗号。

elif (re.compile("^[0-9]+([,][0-9]+)?$")).match(u"{}".format(value)):
    value = float(value.replace(',', '.'))

jmcnamara帮我指出了这个方向,而不是搞乱locales和xlwt格式。

python django excel xlwt
2个回答
4
投票

我有一个场景,用户可以切换区域设置,让他们查看带有标准小数点的浮点数,或者在某些语言中查看逗号小数点。

这里要注意的重要一点是,语言环境的千位/小数分隔符是Windows设置而不是Excel设置。它在控制面板/区域和语言选项/格式或类似设置中设置。

因此,如果在一个区域设置中,数字格式在Excel中显示为1,234.56,而在另一个区域设置中,它显示为1.234,56,在这两种情况下,格式都以Excel格式存储在Excel中:0,000.00

因此,在使用xlwt或任何其他电子表格编写模块时,您应该使用美式样式格式选项(逗号为千和。十进制)。然后,它将根据Windows设置显示在用户区域设置中。


2
投票

您可以使用easyxf但也可以使用xwlt样式,如:

# You can change the format to more or less decimals
decimal_style.num_format_str = '0.0000'  


sheet.write(0, 0, 3.18526119, decimal_style)  # Example to write
sheet.write(0, 1, 1.11, decimal_style)  # Another example

如果你想使用easyxf你可以做类似的事情:

decimal_style = easyxf(num_format_str='0.00')
sheet.write(0, 0, '999.99', decimal_style)

您可以查看此示例以获取更多信息Python: Writing xlwt files

© www.soinside.com 2019 - 2024. All rights reserved.