python自动填表格_Python读写Excel自动填表
前面一篇文章提到: Excel復雜排序和不同表復制數(shù)據(jù)業(yè)務實戰(zhàn)
對于非程序員來說,基本也只能這樣操作了,對于希望實現(xiàn)程序自動化的筆者來說,寫個小工具不成問題,這里用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格式的,需要轉(zhuǎn)成xls格式然后改為demo1.xls,demo2是分攤表,建議去掉多余的數(shù)據(jù),否則會報錯
# -*- 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 #行數(shù)
ncols = sheet1.ncols #列數(shù)
#搜索電信公司賬單行列 字符串為 業(yè)務號碼 實收
flag = False #判斷搜索完成的標志
buss_num_col = 0
real_pay_col = 0
start_row = 0
for i in range(nrows):
rowi_value = sheet1.row_values(i) #得到一行數(shù)據(jù)
for j in range(ncols):
cellij_value = rowi_value[j]
if isinstance(cellij_value, basestring):
if cellij_value ==u'業(yè)務號碼':
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'賬單號碼個數(shù)' + 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 #行數(shù)
ncols = sheet2.ncols #列數(shù)
#搜索分攤表行列 字符串為 電話號碼 話費,這里的電話號碼占兩行,話費占一行,起始行以話費為準
flag = False
buss_num_col = 0
real_pay_col = 0
start_row = 0
for i in range(nrows):
rowi_value = sheet2.row_values(i) #得到一行數(shù)據(jù)
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))
#這里電話號碼有可能出現(xiàn)重復,按理說應該是不重復的,重復就寫到日志,這里懶得寫了
#程序里行數(shù)和列數(shù)從0開始,但是用戶看到的excel表格打開是從1開始,為了方便用戶查看就加1
if row_data.has_key(cell_num):
print u'號碼在分攤表中出現(xiàn)重復!'+ u'號碼為:' + str(cell_num) + u'上一次出現(xiàn)的行:'+ str(row_data[cell_num]+1) + u'本次次出現(xiàn)的行:'+ str(i+1)
#存到字典里
row_data[cell_num] = i
print u'分攤表號碼(去重)個數(shù)' + str(len(row_data)) #分攤表總計那一個單元格是空,已經(jīng)被if排除掉了
#在原有excel上寫數(shù)據(jù)并保留格式,后來發(fā)現(xiàn)保留格式太難了,有特殊字體和跨列合并單元格出現(xiàn)的基本就沒法保留
oldWb = xlrd.open_workbook('demo2.xls', formatting_info=True); #刪除多余數(shù)據(jù),調(diào)好格式可以保留,最后再粘貼回去就好了,保留格式主要為了方便粘貼合并的單元格,實際保留的效果并不很好很差
print oldWb; #
newWb = copy(oldWb);
print newWb; #
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'成功寫入新數(shù)據(jù)'
newWb.save('demo2.xls')
print u'成功寫入同名文件'結果截圖
總結
以上是生活随笔為你收集整理的python自动填表格_Python读写Excel自动填表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【自考】-计算机网络原理
- 下一篇: 生成函数学习笔记心得