使用xlwt格式化数字,使零变为破折号(-)

0 投票
1 回答
3049 浏览
提问于 2025-04-17 11:14

我正在用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 个回答

0

这里有一些简单的代码示例。在输出的电子表格中,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,接着就跟着提示走就行了。

撰写回答