前言
在中文支票上经常会遇到大写数字格式, 如果有一堆账本记录在Excel文档里, 需要转换格式成带小数点的阿拉伯数字.
需求
比如转化如下的数字成小数
代码
import xlrd
from word2number import w2n
file = 'bills.xlsx' # change filename
CN_NUM = {
'〇' : 0, '一' : 1, '二' : 2, '三' : 3, '四' : 4, '五' : 5, '六' : 6, '七' : 7, '八' : 8, '九' : 9, '零' : 0,
'壹' : 1, '贰' : 2, '叁' : 3, '肆' : 4, '伍' : 5, '陆' : 6, '柒' : 7, '捌' : 8, '玖' : 9, '貮' : 2, '两' : 2,
}
CN_UNIT = {
'元' : 1,
'十' : 10,
'拾' : 10,
'百' : 100,
'佰' : 100,
'千' : 1000,
'仟' : 1000,
'万' : 10000,
'萬' : 10000,
'亿' : 100000000,
'億' : 100000000,
'兆' : 1000000000000,
'角' : 0.1,
'分' : 0.01
}
def cn2num(cn:str) -> float:
ans = 0.0
length = len(cn)
start = 0
if cn[0] in CN_UNIT:
ans += CN_UNIT[cn[0]]
start = 1
for i in range(start, length, 1):
if cn[i] in CN_NUM and cn[i + 1] in CN_UNIT:
val, unit = CN_NUM[cn[i]], CN_UNIT[cn[i + 1]]
ans += val * unit
else: continue
return ans
def read_excel():
global sheet1, wb
wb = xlrd.open_workbook(filename=file) # 打开文件
print(wb.sheet_names()) # 获取所有表格名字
sheet1 = wb.sheet_by_index(0) # 通过索引获取表格
print(sheet1)
print(sheet1.name,sheet1.nrows,sheet1.ncols)
# rows = sheet1.row_values(0)#获取行内容
'''
# test:
print(rows)
print(cols)
print(sheet1.cell(1,0).value)#获取表格里的内容,三种方式
print(sheet1.cell_value(1,0))
print(sheet1.row(1)[0].value)
'''
if __name__ == '__main__':
read_excel()
'''
# test:
print(cn2num('拾捌元零捌分'))
print(cn2num('伍拾壹元肆角伍分'))
print(cn2num('陆分'))
print(cn2num('壹元柒角'))
print(cn2num('贰角柒分'))
print(cn2num('拾玖元伍角肆分'))
'''
# calculate sum of number
ncols = sheet1.ncols
nrows = sheet1.nrows
ans = 0.0
for i in range(1, nrows):
rows = sheet1.row_values(i)#获取行内容
temp = cn2num(rows[0])
ans += temp * float(rows[1])
print(ans)
print('%.2f' %ans)