Django/python 和 xlwt 语言环境格式问题

Posted

技术标签:

【中文标题】Django/python 和 xlwt 语言环境格式问题【英文标题】:Django/python and issues with xlwt locale formatting 【发布时间】:2014-08-09 09:48:51 【问题描述】:

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

当将视图导出为具有标准小数点语言环境的 xls 时,它可以正常工作,但使用逗号小数会使 xls 文件将浮点数存储为文本并在数字前添加撇号(例如 '123,45)。我感觉 ExcelResponse (https://djangosnippets.org/snippets/1151/) 没有正确处理浮点数(参见 sn-p 之后的第 43 行)。

什么是正确的 xlwt 样式来申请使用逗号小数正确保存的 xls,以及检查一个值是否是逗号小数并且应该应用该样式的好方法是什么?换句话说:

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 语言环境添加的),然后用小数点替换逗号。

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

jmcnamara 帮助我指出了这个方向,而不是搞乱语言环境和 xlwt 格式。

【问题讨论】:

【参考方案1】:

您可以使用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

【讨论】:

【参考方案2】:

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

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

因此,如果在一种语言环境中,数字格式在 Excel 中显示为 1,234.56,而在另一种语言环境中,则在两种情况下都显示为 1.234,56格式存储在 Excel 中作为美国风格:0,000.00.

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

【讨论】:

以上是关于Django/python 和 xlwt 语言环境格式问题的主要内容,如果未能解决你的问题,请参考以下文章

python如何对excel数据进行处理

ngnix+uwsgi+django+python+mysql环境部署

ngnix+uwsgi+django+python+mysql环境部署

Python安装xlrd和xlwt的步骤以及使用报错的解决方法

Windows下搭建Apache+Django+Python Web服务环境

Nginx+uwsgi+Django (Python web环境)