转载本文请联系AirPython公众号.一、前言在日常工作中,我们经常会用到Word、Excel、PPT、PDF等办公软件,然而,我们经常会遇到一些重复、繁琐的事情。这时候,人工操作是极其低效的;通过Python实现办公自动化成为下一个系列文章非常有必要的,我将带大家对Python办公自动化做一个全面的总结,绝对的干货!2、准备用Python操作Excel文件,常用的方式如下:xlrd/xlwtopenpyxlPandasxlsxwriterxlwingspywin32xlrd和xlwt是操作Excel文件最多的两个依赖库。其中xlrd负责读取Excel文件,xlwt可以向Excel文件写入数据。我们安装这两个依赖库#InstallDependentLibrariespip3installxlrdpip3installxlwt3。open_workbook(filepath)打开一个本地Excel文件importxlrd#打开文件返回一个workbook对象wb=xlrd.open_workbook(file_path)workbook对象的nsheets属性获取Sheets的个数,sheet_names()方法返回一个列表allSheetnames#统计sheet数量sheets_num,sheets_names=wb.nsheets,wb.sheet_names()print('总张数:',sheets_num)print('sheetnamesare:',sheets_names)过滤出某个Sheet在工作簿中,有2种方法是:通过Sheet名称使用位置索引,从0开始#获取某张Sheet#Getsheet=wb.sheet_by_index(0)#sheet=wb.sheet_by_name('第一个Sheet')print(sheet)每个sheet对象可以通过name、nrows、ncols获取Sheet名称、行数、列数。另外,row_values(index)和col_values(index)分别用于获取某行或某列的数据列表#获取某个ssheet中的行数和列数包括sheet_name,sheet_row_count,sheet_column_count=sheet.name,sheet.nrows,sheet.ncolsprint('当前sheet名称为:',sheet_name,",共有:",sheet_row_count,"rows;有:",sheet_column_count,"column")#分别获取一行数据,索引从0开始#例如:获取第二行数据row_datas=sheet.row_values(1)print('第二个rowofdatais:',row_datas)#分别获取一列数据,索引从0开始#例如:获取第二列数据column_datas=sheet.col_values(1)print('第二列数据为:',column_datas)单元格可以通过行索引,列索引,调用cell(row_index,column_index)函数获取需要注意的是行索引和列索引都是从0开始的,即:0表示第一个row在xlrd中,cell的数据类型包括6种,ctype属性对应关系如下:0--empty(空)1--string(string)2--数字(number)3--日期(date)4--boolean(布尔)5--error(错误)#获取某个Cell数据#例如:获取第2行单元格的数据andcolumn1one_cell=sheet.cell(1,0)#单元格的值cell_value=one_cell.valueprint("单元格的值为:",cell_value)#单元格数据类型cell_type=one_cell.print("单元格datatypeis:",cell_type)最后,如果想获取当前Sheet所有单元格中的数据,可以通过遍历所有行和列进行操作#获取所有单元格的格子的值print('所有数据表格中如下:')forrinrange(sheet.nrows):foriinrange(sheet.ncols):print(sheet.cell(r,i).value)4.xlwt转Excel如果要将数据写入Excel,xlwt很方便。首先,使用xlwt的Workbook()方法创建一个workbook对象。然后,使用工作簿对象的add_sheet(sheetname)方法添加Sheetimportxlwtsheetname='FirstSheet'#创建工作簿对象wb=xlwt.Workbook()#添加Sheet,通过工作表名称sheet=wb.add_sheet(sheetname)然后,通过sheet对象的write()方法,根据行索引和列索引,将数据写入对应的cell#将数据写入Sheet#3个参数分别是:行索引(从0开始),列index(从0开始),cellvalue#first行的第一列,写一个数据#writetitleforindex,titleinenumerate(self.titles):sheet.write(0,index,title)#writevalueforindex_row,row_valuesinenumerate(self.values):forindex_column,column_valueinenumerate(row_values):sheet.write(index_row+1,index_column,column_value)需要注意的是最后一定要调用workbook的save(filepath)在本地生成Excel文件#Save文件#Finally保存文件wb.save(filepath)5.高级用法接下来说说一些常用的高级用法1.获取所有可见的Sheet在读取Sheet数据的时候,往往需要过滤掉隐藏的Sheet。当一个sheet对象的visibility属性值为0时,工作簿中显示ThisSheet;否则它是隐藏的defget_all_visiable_sheets(self,wb):"""Getallvisiblesheets:paramwb::return:"""returnlist(filter(lambdaitem:item.visibility==0,wb.sheets()))#1。获取所有可见的sheetsheet_visiable=self.get_all_visiable_sheets(wb)print('Allvisiblesheetsinclude:',sheet_visiable)2.获取Sheet的可见行或列。在某个Sheet中,某些行和列可能被隐藏defget_all_visiable_rows(self,sheet):"""获取sheet中的可见行:paramsheet::return:"""result=[indexforindexinrange(sheet.nrows)ifsheet.rowinfo_map[index].hidden==0]returnresultdefget_all_visiable_columns(self,sheet):"""获取某个sheet中的可见列:paramsheet::return:"""result=[indexforindexinrange(sheet.ncols)ifsheet.colinfo_map[index].hidden==0]returnresult3.获取单元格的样式获取单元格字体以颜色和背景为例defget_cell_bg_color(self,wb,sheet,row_index,col_index):"""获取某个单元格的背景颜色:paramwb::paramsheet::paramrow_index::paramcol_index::return:"""xfx=sheet.cell_xf_index(row_index,col_index)xf=wb.xf_list[xfx]#字体颜色font_color=wb.font_list[xf.font_index].colour_index#backgroundcolorbg_c??olor=xf.background.pattern_colour_indexreturnfont_color,bg_c??olor需要注意的是,使用xlrd读取单元格的样式,需要在打开工作簿时显式定义formating_info=True,否则会抛出异常#Note注意:必须设置Formatting_info=True才能正常获取属性wb=xlrd.open_workbook(file_path,formatting_info=True)sheet=wb.sheet_by_index(06.最后,xlrd和xlwt一起使用,基本可以完成大部分工作。对于一些复杂的功能,如:copy、split、filter等功能,可以使用xlutils的依赖库,需要指出的是,这种组合对xlsx的兼容性不是很好;如果需要操作xlsx文件,需要转换他们先到xls,然后再继续
