Python读写Excel自动填表

前面一篇文章提到:  Excel复杂排序和不同表复制数据业务实战
对于非程序员来说,基本也只能这样操作了,对于希望实现程序自动化的笔者来说,写个小工具不成问题,这里用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'成功写入同名文件'
结果截图




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值