使用xlwt格式化数字,使零变为破折号(-)
我正在用xlwt写Excel表格,效果很好,除了一个小问题。我想把数字零显示为一个破折号(-),就像会计格式那样。不过,我不想在每个数字前面加上美元符号$,也不想在千位数上加逗号。
我以为这个问题应该很好解决,我只需要在Excel里设置我想要的格式,然后查看“格式 -> 自定义格式”来获取确切的格式字符串。这样我得到了_(* (#,##0);_(* "-"_);_(@_)
这个格式(虽然这没有处理逗号,但确实把零显示为破折号,并去掉了$符号)。不幸的是,当我在xlwt中使用这个字符串时,它似乎又恢复到了会计默认格式:_($* #,##0_);_($* (#,##0);_($* "-"_);_(@_)
。我觉得这可能是xlwt的一个bug,但有没有人知道有没有办法解决这个问题,让我实现我想要的效果?
编辑: 我不知道为什么这样做有效,但我的问题似乎通过去掉字符串中的逗号解决了。也就是说,把:
'_(* #,##0_);_(* (#,##0);_(* "-");(@)' 改成 '(* ###0_);_(* (###0);_(* "-");(@_)'
我认为这样有效是因为xlwt在你去掉$符号时并不把它视为自定义格式,而是写成会计默认格式,但当你同时去掉$和逗号时,它就会进入自定义格式的方法,这正是我想要的。
回应John,我是用tablestyle.numformat属性来实现这些的。基本代码如下:
style = xlwt.xlwt.XFStyle()
style.num_format_str = '_(* ###0_);_(* (###0);_(* "-"_);_(@_)'
我现在唯一想改变的就是让负数显示为-5,而不是会计格式的(5),不过我想我可以接受现在的样子。如果有人能解释一下Excel格式字符串是怎么回事就太好了,我能看到其中有点规律,但这些长长的数字字符串让我有点困惑,我只是简单地复制粘贴进来。
1 个回答
这里有一些简单的代码示例。在输出的电子表格中,A列使用的是你最初的格式,B列是你最开始想要的格式(会计格式),而C列则是非会计格式。
import xlwt
custom_fmts = (
'_(* (#,##0);_(* "-");(@)',
'_(#0_);(#0);"-"_)', # positive;negative;zero
'#0;-#0;"-"', # positive;negative;zero
)
xfs = [xlwt.easyxf('', fmt) for fmt in custom_fmts]
wb = xlwt.Workbook()
ws = wb.add_sheet('x')
for colx, xf in enumerate(xfs):
for rowx, value in enumerate((1234567, 0, -1234567)):
ws.write(rowx, colx, value, xf)
wb.save('demo_custom_format.xls')
你可以通过这个链接阅读相关的教程。
如果有人能解释一下Excel格式字符串是怎么工作的,那就太好了。
告诉你去看手册也没什么用,因为自从Excel 5.0之后就没有手册了。不过你可以随时按F1键,然后在搜索框里输入custom formats
,接着就跟着提示走就行了。