使用Python处理excel表格(openpyxl)教程
2017-07-12 22:38
976 查看
现在有个小任务,需要处理excel中的数据。其实就是简单的筛选,excel玩的不熟练,而且需要处理的表有70多个,于是想着写个脚本处理一下吧。python中的openpyxl包可以轻松实现读写excel文件,下面简单介绍一下过程。1.安装openpyxl通过pip或者easy_install均可安装openpyxl。openpyxl官网:https://openpyxl.readthedocs.org/en/latest/安装命令:pipinstallopenpyxl (在线安装)或者 easy_installopenpyxl 即可。2.使用openpyxl读xlsx加载workbook,注意,openpyxl只支持xlsx格式,老版的xls格式需要其他方法去加载。 被马赛克涂抹的左边A列是名称,首行则是业务列别。可见数据则是汇总金额。如果我不用脚本处理的话,每次利用excel进行手动操作,那么需要对每个大项的小项进行汇总,然后用手动粘贴到一个新表中(自己的EXCEL不是很熟,然后对每一行都要进行一个绘图操作,算下来花的时间很多哦)而现在,只是花了时间写了一段代码,然后以后的以后,只要表格格式不变,我只需要运行py文件即可!~花的时间就1s吧。下篇会介绍xlsxwriter这个库,因为我写到这里的时候想用openpyxl来进行绘图,发现openpyxl实现不了自己的需求,于是找到了这个写数据和画图都很强的xlsxwriter!而且文档也更加完善,有很多例子!!!通过这次这个例子,自己以后也会更加学习如何善于发现,善于思考,如何运用自己以前所学的知识将它运用新的岗位上。----------------------------------------------------------------------------------------------------------------------------------------------------------------【附录】openpyxl库学习1、wb=Workbook()2、获取sheet工作区间1)#激活worksheet,得到一个worksheet,默认得到sheet1 ws=wb.active2)#命名sisilast格式,插入到最后 ws2=wb.create_sheet("sisilast")3)#命名sisilast格式,插入到最开始的位置 ws3=wb.create_sheet("sisifrist",0)3、给指定单元格赋值1)直接写数据到指定的单元格中 >>>ws['A1']=1002)使用 3.也可以使用 4.也可以使用 10、使用公式 --------------------------------------------------------------------------------------http://www.python-excel.org/(翻墙后的页面,直接贴出来,主要是可以用Python来操作excel表格的一系列工具家族。)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354WorkingwithExcelFilesinPython
wb=load_workbook(filename=r'tj.xlsx')获取每个sheet的名称
sheetnames=wb.get_sheet_names()获得第一个sheet
ws=wb.get_sheet_by_name(sheetnames[0])获取一个单元格的数据
c=ws['A4']或者
c=ws.cell('A4')或者
d=ws.cell(row=4,column=2)一次获取多个单元格的数据
cell_range=ws['A1':'C2']或者
tuple(ws.iter_rows('A1:C2'))或者
forrowinws.iter_rows('A1:C2'): forcellinrow: <spanstyle="white-space:pre"></span>printcell或者
data_dic=[] forrxinrange(0,ws.get_highest_row()): temp_list=[] money=ws.cell(row=rx,column=1).value kind=ws.cell(row=rx,column=2).value temp_list=[money,kind] #printtemp_list data_dic.append(temp_list) forlindata_dic: printl[0],l[1]3.写入xlsx比如数据存在上边定义的data_dic中out_filename=r'result.xlsx'outwb=Workbook()ew=ExcelWriter(workbook=outwb)ws=outwb.worksheets[0]ws.title="res"i=1fordata_lindata_dic:forxinrange(0,len(data_l)):#col=get_column_letter(x)ws.cell(column=x+1,row=i,value="%s"%data_l[x])i+=1ew.save(filename=out_filename)再增加一个sheet写内容
ws2=outwb.create_sheet(title='s2') fordata_lindata_dic: forxinrange(0,len(data_l)): ws2.cell(column=x+1,row=i,value="%s"%data_l[x]) i+=1 ew.save(filename=out_filename)4.中文编码问题表格中的值,openpyxl会自动转换为不同的类型,有些表格中会有中文出现,就需要进行相应的转码。可以写一个函数专门处理转码,需要时调用
defgbk2utf(in_data,tag): if1==tag: returnin_data.encode('gbk').decode('gbk') elif0==tag: returnin_data.encode('gbk').decode('gbk').encode('utf8')当原始的excel文件是gbk编码时,就需要tag=0的方式去处理,因为读入后是gbk的编码,需要先encode为gbk再decode为unicode,再encode为utf8,就可以显示了。【实战】介绍下自己需要处理的表格情况,这是一个关于酬金的表格,每月都有,它的格式都是固定的,所以完全可以利用Python写一个脚本,来实现自己的需求,这样一来,每月只需敲击一个命令行,就能生成自己想要的表格,节约不少时间!~因为酬金分为很多大项,大项中又有很多小项,而我要做的就是把大项中的小项进行金额汇总,然后在写入一个新的表格,表格中是每个大项汇总的数据,以此生成我们需要进行绘图的数据。这里直接粘贴源代码,因为可能涉及敏感信息,故有XXXX出现以代替原始注释,图片还有马赛克出现:
fromopenpyxlimportWorkbook fromopenpyxlimportload_workbook wb=load_workbook("C:/Users/Administrator/Desktop/酬金.xlsx") ws=wb.get_sheet_by_name('酬金明细') ws_rows_len=len(ws.rows)#行数 ws_columns_len=len(ws.columns)#列数 #xxxxxxx shop_name_column=5 #xxxxx user_start=8 user_end=23 #xxxxx terminal_start=24 terminal_end=35 #xxxxx infomation_start=36 infomation_end=42 #xxxx group_start=43 group_end=45 #xxxx commission_start=46 commission_end=60 #xxxx stimulate_start=61 stimulate_end=65 #xxxx net_start=66 net_end=67 #xxxxxxx agreement_start=68 agreement_end=70 #数据有效行从第四行开始 start_row=4 temp_data=[] forrowinrange(start_row,ws_rows_len+1): t=0 temp_data.append(ws.cell(row=row,column=shop_name_column).value) #计算xxxxxx总金额 forcolumninrange(user_start,user_end+1): t+=ws.cell(row=row,column=column).value temp_data.append(t) t=0 #计算xxxx总金额 forcolumninrange(terminal_start,terminal_end+1): t+=ws.cell(row=row,column=column).value temp_data.append(t) t=0 #计算xxxx发展总金额 forcolumninrange(infomation_start,infomation_end+1): t+=ws.cell(row=row,column=column).value temp_data.append(t) t=0 #计算xxxx总金额 forcolumninrange(group_start,group_end+1): t+=ws.cell(row=row,column=column).value temp_data.append(t) t=0 #计算xxxxx总金额 forcolumninrange(commission_start,commission_end+1): t+=ws.cell(row=row,column=column).value temp_data.append(t) t=0 #计算xxxxx总金额 forcolumninrange(stimulate_start,stimulate_end+1): t+=ws.cell(row=row,column=column).value temp_data.append(t) t=0 #计算xxxxx总金额 forcolumninrange(net_start,net_end+1): t+=ws.cell(row=row,column=column).value temp_data.append(t) t=0 #计算xxxxxxxx总金额 forcolumninrange(agreement_start,agreement_end+1): t+=ws.cell(row=row,column=column).value temp_data.append(t) #以上代码为获取酬金原始数据进行汇总 #下面将汇总得到的数据插入到一个新的数据表中 reward_ws_hearder=['xxxx','xxxxx','xxxx','xxxxx','xxxxxx','xxxx','xxxx','xxxx','xxxx'] reward_ws=wb.create_sheet(title='酬金分析') reward_ws.append(reward_ws_hearder) start_list=0 list_step=9 end_list=start_list+list_step foriinrange(0,ws_rows_len-start_row+1): reward_ws.append(temp_data[start_list:end_list]) start_list+=list_step end_list=start_list+list_step wb.save("C:/Users/Administrator/Desktop/酬金1.xlsx")#另存为另一个表,防止意外破坏原始数据。123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106代码写得有点乱,仅供学习openpyxl参考。通过上述的代码,实现了一个新表存放了汇总的数据(原始数据有很多列,现在汇总到一起了)
openpyxl.worksheet.Worksheet.cell()方法操作某行某列的某个值:>>>ws.cell(row=6,column=5,value='kaixin')注意:当worksheet在内存中被创建时,是没有包含cells的,cells是在首次访问时创建.可以循环在内存中创建cells,这时不指定他们的值也会创建该cells些:(创建8x8cells) >>>foriinrange(1,9): forjinrange(1,9):ws.cell(row=i,column=j,value=i*j)
openpyxl.worksheet.Worksheet.iter_rows()方法:(需要指定行->行,截止列)
openpyxl.worksheet.Worksheet.iter_cols()方法:(需要指定列->列,截止行) 5.如果你需要遍历所有文件的行或列,可以使用
openpyxl.worksheet.Worksheet.rows()属性:>>>tuple(ws.rows) or openpyxl.worksheet.Worksheet.columns() 属性:>>>tuple(ws.columns)4、#附加一行,从第一列开始附加 ws.append([1,2,3])5、#保存文件到指定位置 wb.save("D:/test/test.xlsx")6、修改sheet名称创建的sheet的名称会自动创建,按照sheet,sheet1,sheet2自动增长,通过title属性可以修改其名称。>>>fromopenpyxlimportWorkbook>>>wb=Workbook()>>>ws=wb.create_sheet("haha")>>>ws.title="heihei">>>wb.save("D:/test/heihei.xlsx")7、查看workbook中的所有worksheets名称:
openpyxl.workbook.Workbook.get_sheet_names()>>>print(wb.sheetnames)['Sheet','heihei']8、直接访问单元格>>>value1=ws['A3']9、openpyxl.load_workbook()已经存在的workbook:
【openpyxl的基本使用教程】
python操作excel方法
1)自身有Win32COM操作office但讲不清楚,可能不支持夸平台,linux是否能用不清楚,其他有专业处理模块,如下 2)xlrd:(读excel)表,xlrd读大表效率高于openpyxl 3)xlwt:(写excel)表, xlrd和xlwt对版本上兼容不太好,很多新版excel有问题。
新版excel处理:
openpyxl(可读写excel表)专门处理Excel2007及以上版本产生的xlsx文件,xls和xlsx之间转换容易 注意:如果文字编码是“gb2312”读取后就会显示乱码,请先转成Unicode
安装openpyxl
1)下载openpyxl模块:https://pypi.python.org/pypi/openpyxl 2)解压到指定文件目录:tar-xzvfopenpyxl.tar.gz 3)进入目录,找到setup.py文件,执行命令:pythonsetup.pyinstall 如果报错Nomodulenamedsetuptools就使用命令“easy_installopenpyxl”,easy_installforwin32,会自动安装setuptools。 这里注意,如果不能自动安装,基本上python的模块都通过命令python模块名.pyinstall来安装,如果setuptools模块没有,直接去官网下载,然后前面命令安装就可以了 4)处理图片还需要安装pillow(PIL) Tobeabletoincludeimages(jpeg,png,bmp,...)intoanopenpyxlfile,youwillalsoneedthe“pillow”librarythatcanbeinstalledwith: pipinstallpillow
pthon学习资料
python学习小组http://www.thinksaas.cn/group/show/368/page/4 官网:https://pypi.python.org/pypi/openpyxlhttp://openpyxl.readthedocs.io/en/default/ good: http://blog.csdn.net/suofiya2008/article/details/6284208http://blog.csdn.net/zzukun/article/details/49946147 http://www.thinksaas.cn/topics/0/501/501962.html
openpyxl的使用
openpyxl定义多种数据格式
最重要的三种: NULL空值:对应于python中的None,表示这个cell里面没有数据。 numberic:数字型,统一按照浮点数来进行处理。对应于python中的float。 string:字符串型,对应于python中的unicode。
Excel文件三个对象
workbook:工作簿,一个excel文件包含多个sheet。 sheet:工作表,一个workbook有多个,表名识别,如“sheet1”,“sheet2”等。 cell:单元格,存储数据对象1)导入
fromopenpyxlimportWorkbook fromopenpyxlimportload_workbook fromopenpyxl.stylesimportPatternFill,Border,Side,Alignment,Protection,Font,Color,Fill fromopenpyxl.stylesimportcolors fromopenpyxl.stylesimportFill,fills fromopenpyxl.formatting.ruleimportColorScaleRule2)打开workbook:
wb=load_workbook('file_name.xlsx')3)opensheet:
通过名字 ws=wb["frequency"] 等同于ws2=wb.get_sheet_by_name('frequency') 验证命令wsisws2isws3输出True 不知道名字用index sheet_names=wb.get_sheet_names() ws=wb.get_sheet_by_name(sheet_names[index])#index为0为第一张表 或者 ws=wb.active 等同于ws=wb.get_active_sheet()#通过_active_sheet_index设定读取的表,默认0读第一个表 活动表表名wb.get_active_sheet().title4)建新表
ws1=wb.create_sheet()#默认插在最后 ws2=wb.create_sheet(0)#插在开头 建表后默认名按顺序,如sheet1,sheet2... ws.title="NewTitle"#修改表名称 简化ws2=wb.create_sheet(title="Pi")5)backgroudcoloroftab(bewhitebydefault)
ws.sheet_properties.tabColor="1072BA"#setwithRRGGBBcolorcode6)单元格使用
c=ws['A4']#read等同于c=ws.cell('A4') ws['A4']=4#write #ws.cell有两种方式,行号列号从1开始 d=ws.cell(row=4,column=2)#行列读写 d=ws.cell('A4') 写入cell值 ws.cell(row=4,column=2).value='test' ws.cell(row=4,column=2,value='test')7)访问多个单元格
cell_range=ws['A1':'C2'] 读所有单元格数据 get_cell_collection()8)按行操作,按列操作
a)逐行读 ws.iter_rows(range_string=None,row_offset=0,column_offset=0):range-string(string)-单元格的范围:例如('A1:C4')row_offset-添加行column_offset-添加列 返回一个生成器,注意取值时要用value,例如: forrowinws.iter_rows('A1:C2'): forcellinrow: printcell 读指定行、指定列: rows=ws.rows#row是可迭代的 columns=ws.columns#column是可迭代的 打印第n行数据 printrows #不需要用.value printcolumns #不需要用.value b)逐行写 (http://openpyxl.readthedocs.io/en/default/_modules/openpyxl/worksheet/worksheet.html#Worksheet.append) ws.append(iterable) 添加一行到当前sheet的最底部iterable必须是list,tuple,dict,range,generator类型的。1,如果是list,将list从头到尾顺序添加。2,如果是dict,按照相应的键添加相应的键值。 append([‘ThisisA1’,‘ThisisB1’,‘ThisisC1’]) append({‘A’:‘ThisisA1’,‘C’:‘ThisisC1’}) append({1:‘ThisisA1’,3:‘ThisisC1’})8)#显示有多少张表
wb.get_sheet_names() #显示表名,表行数,表列数 printws.title printws.max_row printws.max_column ws.get_highest_row()#UserWarning:Calltodeprecatedfunction ws.get_highest_column()#UserWarning:Calltodeprecatedfunction9)获得列号x的字母col=get_column_letter(x),x从1开始
fromopenpyxl.utilsimportget_column_letter forxinrange(1,len(record)+1): col=get_column_letter(x) ws.cell('%s%s'%(col,i)).value=x 通过列字母获取多个excel数据块 cell_range="E3:{0}28".format(get_column_letter(bc_col)) ws["A1"]="=SUM(%s)"%cell_range10)excel文件是gbk编码,读入时需要先encode为gbk,再decode为unicode,再encode为utf8
cell_value.encode('gbk').decode('gbk').encode('utf8')11)公式计算formulae
ws["A1"]="=SUM(1,1)" ws["A1"]="=SUM(B1:C1)"
代码实例实例(直接修改使用)
fromopenpyxlimportWorkbook fromopenpyxl.compatimportrange fromopenpyxl.cellimportget_column_letter dest_filename='empty_book.xlsx' wb=Workbook() ws1=wb.active ws1.title="rangenames" forrowinrange(1,40): ws1.append(range(600)) ws3=wb.create_sheet(title="Data") forrowinrange(10,20): forcolinrange(27,54): _=ws3.cell(column=col,row=row,value="%s"%get_column_letter(col)) print(ws3['AA10'].value) wb.save(filename=dest_filename) sheet_ranges=wb['rangenames'] print(sheet_ranges['D18'].value) ws['A1']=datetime.datetime(2010,7,21) ws['A1'].number_format#输出'yyyy-mm-ddh:mm:ss' rows=[ ['Number','Batch1','Batch2'], [2,40,30], [3,40,25], [4,50,30], [5,30,10], [6,25,5], [7,50,10], ] rows=[ ['Date','Batch1','Batch2','Batch3'], [date(2015,9,1),40,30,25], [date(2015,9,2),40,25,30], [date(2015,9,3),50,30,45], [date(2015,9,4),30,25,40], [date(2015,9,5),25,35,30], [date(2015,9,6),20,40,35], ] forrowinrows: ws.append(row)12345678910111213141516171819202122232425262728293031323334353637383940414243444546471234567891011121314151617181920212223242526272829303132333435363738394041424344454647
excel中图片的处理,PIL模块
try: fromopenpyxl.drawingimportimage importPIL exceptImportError,e: print"[ERROR]",e report_file=self.excel_path+"/frquency_report_%d.xlsx"%id shutil.copyfile(configs.PATTEN_FILE,report_file) ifnotos.path.exists(report_file): print"generatefilefailed:",report_file sys.exit(1) wb=load_workbook(report_file) ws=wb.get_sheet_by_name('frequency') img_f=configs.IMAGE_LOGO ifos.path.exists(img_f): try: img=image.Image(img_f) ws.add_image(img,'A1') exceptException,e: print"[ERROR]%s:%s"%(type(e),e) ws['A1']="程序化营销平台" else: ws['A1']="程序化营销平台" font1=Font(size=22) ws['A1'].font=font1 ws['B4']=ad_plan#等同ws.cell('B4')=ad_plan ws['B5']=ad_names ws['B6']=str(start_d)+'to'+str(end_d) wb.save(report_file) try: wb=load_workbook(report_file) ws=wb.get_sheet_by_name('frequency') row=9 foritinquery_result: one_row=it.split('\t') printone_row if'10'==one_row[0]: one_row[0]='10+' col=1 forone_cellinone_row: ws.cell(row=row,column=col).value=one_cell col=col+1 row=row+1 exceptThrift.TException,tx: print'[ERROR]%s'%(tx.message) else: wb.save(report_file) finally: pass
Thissitecontainspointerstothebestinformationavailableaboutworkingwith ThePackagesTherearepythonpackagesavailabletoworkwithExcelfilesthatwillrunonanyPythonplatformandthatdonotrequireeitherWindowsorExceltobeused.Theyarefast,reliableandopensource:openpyxlTherecommendedpackageforreadingandwritingExcel2010files(ie:.xlsx)xlsxwriterAnalternativepackageforwritingdata,formattinginformationand,inparticular,chartsintheExcel2010format(ie:.xlsx)
|
相关文章推荐
- 使用Python处理excel表格(openpyxl)及表格中的中文处理
- 零基础使用Python读写处理Excel表格
- python使用openpyxl库修改excel表格数据
- 在Python中处理列表之reverse()方法的使用教程
- xlrd-使用python处理Excel表格
- 使用Python与openpyxl进行表格处理(一)——读取数据
- Python_openpyxl处理Excel表格
- 使用python处理excel表格
- 使用Python对EXCEL表格进行处理
- 在Python中使用PIL模块对图片进行高斯模糊处理的教程
- 使用Python处理Excel表格
- Python_使用csv模块解析csv文件(处理Excel表格)
- python使用openpyxl库修改excel表格数据方法
- python 使用openpyxl来写数据到excel表格
- 在Python中使用base64模块处理字符编码的教程
- 在Python中使用PIL模块处理图像的教程
- 使用Python处理Excel表格的简单方法
- 使用Python处理Excel表格
- Python中音频处理库pydub的使用教程
- 在Python中处理列表之reverse()方法的使用教程