前面一篇文章提到:
Excel复杂排序和不同表复制数据业务实战
对于非程序员来说,基本也只能这样操作了,对于希望实现程序自动化的笔者来说,写个小工具不成问题,这里用Python写个Excel账单自动填表,可以省掉很多事
需要准备的Python库
xlrd读Excel
xlwt写Excel
xlutils是Excel工具库,安装这个库的前提是安装了xlrd和xlwt,安装很简单Python2.7下三个pip命令搞定
对于非程序员来说,基本也只能这样操作了,对于希望实现程序自动化的笔者来说,写个小工具不成问题,这里用Python写个Excel账单自动填表,可以省掉很多事
需要准备的Python库
xlrd读Excel
xlwt写Excel
xlutils是Excel工具库,安装这个库的前提是安装了xlrd和xlwt,安装很简单Python2.7下三个pip命令搞定
pip install xlrd
pip install xlwt
pip install xlutils
下面直接给出Python2.7的代码,demo1是电信公司账单,最初可能是csv格式的,需要转成xls格式然后改为demo1.xls,demo2是分摊表,建议去掉多余的数据,否则会报错
# -*- coding: UTF-8 -*-
import xlrd
import xlwt
from xlutils.copy import copy;
workbook = xlrd.open_workbook('demo1.xls')
sheet1 = workbook.sheets()[0]
nrows = sheet1.nrows #行数
ncols = sheet1.ncols #列数
#搜索电信公司账单行列 字符串为 业务号码 实收
flag = False #判断搜索完成的标志
buss_num_col = 0
real_pay_col = 0
start_row = 0
for i in range(nrows):
rowi_value = sheet1.row_values(i) #得到一行数据
for j in range(ncols):
cellij_value = rowi_value[j]
if isinstance(cellij_value, basestring):
if cellij_value ==u'业务号码':
buss_num_col = j
start_row = i
elif cellij_value ==u'实收':
real_pay_col = j
flag = True
if flag:
break
data = {} #初始化字典
for i in range(start_row+1,nrows):
cell_num = sheet1.cell(i,buss_num_col).value
cell_pay = sheet1.cell(i,real_pay_col).value
cell_num = cell_num.replace('0731-','') #去掉前缀0731-
#存到字典里
data[cell_num] = cell_pay
print u'账单号码个数' + str(len(data)-1) #因为把最后一列总计也算进去了,所以减1
#下面操作新工作簿,写工作簿之前先读工作簿里的工作表
#先读取所有号码
workbook2 = xlrd.open_workbook('demo2.xls')
sheet_names = workbook2.sheet_names()
index = sheet_names.index(u'7月')
sheet2 = workbook2.sheet_by_index(index)
nrows = sheet2.nrows #行数
ncols = sheet2.ncols #列数
#搜索分摊表行列 字符串为 电话号码 话费,这里的电话号码占两行,话费占一行,起始行以话费为准
flag = False
buss_num_col = 0
real_pay_col = 0
start_row = 0
for i in range(nrows):
rowi_value = sheet2.row_values(i) #得到一行数据
for j in range(ncols):
cellij_value = rowi_value[j]
if isinstance(cellij_value, basestring):
if cellij_value ==u'电话号码':
buss_num_col = j
elif cellij_value ==u'话费':
real_pay_col = j
start_row = i
flag = True
if flag:
break
#读取号码所在行
row_data = {} #初始化字典
for i in range(start_row+1,nrows):
cell_num = sheet2.cell(i,buss_num_col).value
cell_pay = sheet2.cell(i,real_pay_col).value
if cell_num:
cell_num = str(int(cell_num))
#这里电话号码有可能出现重复,按理说应该是不重复的,重复就写到日志,这里懒得写了
#程序里行数和列数从0开始,但是用户看到的excel表格打开是从1开始,为了方便用户查看就加1
if row_data.has_key(cell_num):
print u'号码在分摊表中出现重复!'+ u'号码为:' + str(cell_num) + u'上一次出现的行:'+ str(row_data[cell_num]+1) + u'本次次出现的行:'+ str(i+1)
#存到字典里
row_data[cell_num] = i
print u'分摊表号码(去重)个数' + str(len(row_data)) #分摊表总计那一个单元格是空,已经被if排除掉了
#在原有excel上写数据并保留格式,后来发现保留格式太难了,有特殊字体和跨列合并单元格出现的基本就没法保留
oldWb = xlrd.open_workbook('demo2.xls', formatting_info=True); #删除多余数据,调好格式可以保留,最后再粘贴回去就好了,保留格式主要为了方便粘贴合并的单元格,实际保留的效果并不很好很差
print oldWb; #<xlrd.book.Book object at 0x0000000003C09BE0>
newWb = copy(oldWb);
print newWb; #<xlwt.Workbook.Workbook object at 0x0000000003D7D550>
sheet_names = oldWb.sheet_names()
index = sheet_names.index(u'7月')
newWs = newWb.get_sheet(index);
#遍历写入
for cell_num in row_data.keys():
if data.has_key(cell_num):
newWs.write(row_data[cell_num], real_pay_col, data[cell_num])
else:
print u"原账单不存在此号码:" + cell_num + u'号码所在行为:'+ str(row_data[cell_num]+1)
newWs.write(row_data[cell_num], real_pay_col, 0.0)
print u'成功写入新数据'
newWb.save('demo2.xls')
print u'成功写入同名文件'
结果截图