封装Excel操作方法:

先装openpyxl:pip install openpyxl==2.4.5(可以指定版本)

封装脚本:

#encoding=utf-8
from openpyxl import load_workbook
from openpyxl.styles import Border,Side,Font
import time
class parseExcel(object):
def __init__(self,excelPath):
self.excelPath=excelPath
self.workbook = load_workbook(excelPath)#加载excel
self.sheet=self.workbook.active#获取第一个sheet
self.font=Font(color=None)
self.colorDict={"red":'FFFF3030',"green":'FF008B00'}
#设置当前要操作的sheet对象,使用index来获取相应的sheet
def set_sheet_by_index(self,sheet_index):
sheet_name=self.workbook.get_sheet_names()[sheet_index]
self.sheet=self.workbook.get_sheet_by_name(sheet_name)
return self.sheet
#获取当前默认sheet的名字
def get_default_sheet(self):
return self.sheet.title
# 设置当前要操作的sheet对象,使用sheet名称来获取相应的sheet
def set_sheet_by_name(self,sheet_name):
sheet=self.workbook.get_sheet_by_name(sheet_name)
self.sheet=sheet
return self.sheet
#获取默认sheet中最大的行数
def get_max_row_no(self):
return self.sheet.max_row
#获取默认 sheet 的最大列数
def get_max_col_no(self):
return self.sheet.max_column
#获取默认sheet的最小(起始)行号
def get_min_row_no(self):
return self.sheet.min_row
# 获取默认sheet的最小(起始)列号
def get_min_col_no(self):
return self.sheet.min_column
# 获取默认 sheet 的所有行对象,
def get_all_rows(self):
return list(self.sheet.iter_rows())
#return list(self.rows)也可以
#获取默认sheet中的所有列对象
def get_all_cols(self):
return list(self.sheet.iter_cols())
#return list(self.sheet.columns)也可以
#从默认sheet中获取某一列,第一列从0开始
def get_single_col(self,col_no):
return self.get_all_cols()[col_no]
#从默认sheet中获取某一行,第一行从0开始
def get_single_row(self,row_no):
return self.get_all_rows()[row_no]
#从默认sheet中,通过行号和列号获取指定的单元格,注意行号和列号从1开始
def get_cell(self,row_no,col_no):
return self.sheet.cell(row=row_no,column=col_no)
# 从默认sheet中,通过行号和列号获取指定的单元格中的内容,注意行号和列号从1开始
def get_cell_content(self,row_no,col_no):
return self.sheet.cell(row=row_no,column=col_no).value
# 从默认sheet中,通过行号和列号向指定单元格中写入指定内容,注意行号和列号从1开始
# 调用此方法的时候,excel不要处于打开状态
def write_cell_content(self,row_no,col_no,content,font=None):
self.sheet.cell(row=row_no,column=col_no).value=content
self.workbook.save(self.excelPath)
return self.sheet.cell(row=row_no,column=col_no).value
# 从默认sheet中,通过行号和列号向指定单元格中写入当前日期,注意行号和列号从1开始
#调用此方法的时候,excel不要处于打开状态
def write_cell_current_time(self,row_no,col_no):
time1=time.strftime("%Y-%m-%d %H:%M:%S")
self.sheet.cell(row=row_no,column=col_no).value=str(time1)
self.workbook.save(self.excelPath)
return self.sheet.cell(row=row_no,column=col_no).value
def save_excel_file(self):
self.workbook.save(self.excelPath)
if __name__=='__main__':
p=parseExcel(u'D:\\testdata.xlsx')
print u"获取默认行:",p.get_default_sheet()
print u"设置sheet索引为1",p.set_sheet_by_index(1)
print u"获取默认行:",p.get_default_sheet()
print u"设置sheet索引为0",p.set_sheet_by_index(0)
print u"获取默认行:",p.get_default_sheet()
#for i in range(3,6):
#for j in range(3,6):
#p.write_cell_content(i,j,str((i,j)))
print u"最大行数:",p.get_max_row_no()
print u"最大列数:",p.get_max_col_no()
print u"最小起始行数:",p.get_min_row_no()
print u"最小起始列数:",p.get_min_col_no()
print u"所有行对象:",p.get_all_rows()
print u"所有列对象:",p.get_all_cols()
print u"获取某一列(2):",p.get_single_col(2)
print u"获取某一行(4):",p.get_single_row(4)
print u"取得行号和列号(2,2)单元格:",p.get_cell(2,2)
print u"取得行号和列号单元格的内容(2,2)",p.get_cell_content(2,2)
print u"行号和列号写入内容(11,11):'xiaxiaoxu'",p.write_cell_content(11,11,'xiaxiaoxu')#
print u"行号和列号写入当前日期(13,13):",p.write_cell_current_time(13,13)

testdata.xlsx运行前:


结果:

D:\test>python test2.py

获取默认行:  aone

设置sheet索引为1

获取默认行: two

设置sheet索引为0

获取默认行:  aone

最大行数: 13

最大列数: 13

最小起始行数: 3

最小起始列数: 3

所有行对象: [(, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , )]

所有列对象: [(, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , ), (, , , , , , , , , , , , )]

获取某一列(2): (, , , , , , , , , , , , )

获取某一行(4): (, , , , , , , , , , , , )

取得行号和列号(2,2)单元格:

取得行号和列号单元格的内容(2,2) None

行号和列号写入内容(11,11):'xiaxiaoxu' xiaxiaoxu

行号和列号写入当前日期(13,13): 2018-07-03 22:21:18

Testdata.xlsx运行后:


注意点:

self.sheet.active()获取第一个sheet,这个第一个指的sheet名的ascii码第一个字母排在最前的

不熟悉的话可以在命令行界面自己练习一下,用dir()命令查看workbook和sheet的常用的方法:

>>> from openpyxl import *
>>> wb=load_workbook('d:\\testdata.xlsx')
>>> wb.get_sheet_names()
[u' aone', u'two', u'sheet3']
>>> sheet1=wb.active
>>> sheet1
>>> sheet1.max_column
8
>>> sheet1.max_row
8
>>> sheet1.min_row
3
>>> sheet1.min_column
3
>>> sheet1.rows
>>> sheet1.iter_rows()
>>> sheet1.columns
>>> dir(wb)
['_Workbook__write_only', '__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__iter__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_active_sheet_index', '_add_sheet', '_alignments', '_borders', '_cell_styles', '_colors', '_data_only', '_differential_styles', '_external_links', '_fills', '_fonts', '_keep_links', '_named_styles', '_number_formats', '_protections', '_read_only', '_setup_styles', '_sheets', 'active', 'add_named_range', 'add_named_style', 'chartsheets', 'close', 'code_name', 'copy_worksheet', 'create_chartsheet', 'create_named_range', 'create_sheet', 'data_only', 'defined_names', 'encoding', 'excel_base_date', 'get_active_sheet', 'get_index', 'get_named_range', 'get_named_ranges', 'get_sheet_by_name', 'get_sheet_names', 'guess_types', 'index', 'is_template', 'keep_links', 'loaded_theme', 'mime_type', 'named_styles', 'path', 'properties', 'read_only', 'rels', 'remove', 'remove_named_range', 'remove_sheet', 'save', 'security', 'shared_strings', 'sheetnames', 'style_names', 'template', 'vba_archive', 'worksheets', 'write_only']