第一步:安裝openyxl模塊
pip install openyxl
第二步:讀寫數據
from openpyxl import load_workbook
# 工作簿 workbook 表單 sheet 單元格 cell
#打開指定工作簿
wb=load_workbook('test_data.xlsx')
# 定位到指定的表單
sheet=wb['test_data']
#讀取指定單元格
cell_values = sheet.cell(2,3).value
print(cell_values)
# 寫入單元格
sheet.cell(2,3).value = '賦值給單元格'
#獲取最大的行數
row=sheet.max_row
# 獲取最大列數
col=sheet.max_column
print(row,col)
# 修改Excel之后,保存
wb.save('test_data.xlsx')
注意:
1.from 它只能識別xlsx結尾的Excel
2.盡量不要直接修改文件后綴名
3.避免直接在pycham里面新建后綴名為xlsx的文件,防止出錯
4.最好就是新建好xlsx文件,直接拖進pycharm
5.excel表中的行列數,從1開始計數
6.保存之前,要刪除excle下面的空白行,肉眼看不到,但是程序有時候會把空白的行算進去。
=====================================================================================================
創建一個工作簿
- 使用openpyxl沒有必要先在系統中新建一個.xlsx,我們需要做的只需要引入Workbook這個類,接着開始調用它。
>>> from openpyxl import Workbook >>> wb = Workbook()
- 一個工作簿(workbook)在創建的時候同時至少也新建了一張工作表(worksheet)。你可以通過openpyxl.workbook.Workbook.active()調用得到正在運行的工作表。
>>> ws = wb.active
注意:該函數調用工作表的索引(_active_sheet_index),默認是0。除非你修改了這個值,否則你使用該函數一直是在對第一張工作表進行操作。
- 使用openpyxl.workbook.Workbook.create_sheet()新建一張表
>>> ws1 = wb.create_sheet() #默認插在工作簿末尾 # or >>> ws2 = wb.create_sheet(0) # 插入在工作簿的第一個位置
- 在創建工作表的時候系統自動命名。他們按照序列依次命名 (Sheet, Sheet1, Sheet2, ...)。你可以通過調用下面的屬性修改工作表的名稱:
ws.title = "New Title"
- 標簽欄的背景色默認為白色。你可以通過提供一個RRGGBB顏色碼改變標簽欄的字體顏色:
ws.sheet_properties.tabColor = "1072BA"

操作數據-使用一個單元格
c = ws.cell('A4')
d = ws.cell(row = 4, column = 2)
使用多個單元格
cell_range = ws['A1':'C2']
數據存儲
>>> wb = Workbook(guess_types=True) >>> c.value = '12%' >>> print(c.value) 0.12 >>> import datetime >>> d.value = datetime.datetime.now() >>> print d.value datetime.datetime(2010, 9, 10, 22, 25, 18) >>> c.value = '31.50' >>> print(c.value) 31.5
保存到文件
>>> wb = load_workbook('document.xlsx') >>> wb.save('document_template.xltx', as_template=True)
從文件中導入
>>> from openpyxl import load_workbook >>> wb2 = load_workbook('test.xlsx') >>> print wb2.get_sheet_names() ['Sheet2', 'New Title', 'Sheet1']
===============================================================================================================
代碼:
from openpyxl import load_workbook
from openpyxl.styles import Font
from openpyxl.styles.colors import BLACK
from collections import namedtuple
class ParseExcel(object):
"""解析excel文件"""
def __init__(self, filename):
try:
self.filename = filename
self.__wb = load_workbook(self.filename) #打開excel
except FileNotFoundError as e:
raise e
def get_max_row_num(self, sheet_name):
"""獲取最大行號"""
max_row_num = self.__wb[sheet_name].max_row
return max_row_num
def get_max_column_num(self, sheet_name):
"""獲取最大列號"""
max_column = self.__wb[sheet_name].max_column
return max_column
def get_cell_value(self, sheet_name, coordinate=None, row=None, column=None):
"""獲取指定單元格的數據"""
if coordinate is not None:
try:
return self.__wb[sheet_name][coordinate].value
except Exception as e:
raise e
elif coordinate is None and row is not None and column is not None:
if isinstance(row, int) and isinstance(column, int):
return self.__wb[sheet_name].cell(row=row, column=column).value
else:
raise TypeError('row and column must be type int')
else:
raise Exception("Insufficient Coordinate of cell!")
def get_row_value(self, sheet_name, row):
"""獲取某一行的數據"""
column_num = self.get_max_column_num(sheet_name)
row_value = []
if isinstance(row, int):
for column in range(1, column_num + 1):
values_row = self.__wb[sheet_name].cell(row, column).value
row_value.append(values_row)
return row_value
else:
raise TypeError('row must be type int')
def get_column_value(self, sheet_name, column):
"""獲取某一列數據"""
row_num = self.get_max_column_num(sheet_name)
column_value = []
if isinstance(column, int):
for row in range(1, row_num + 1):
values_column = self.__wb[sheet_name].cell(row, column).value
column_value.append(values_column)
return column_value
else:
raise TypeError('column must be type int')
def get_all_value_1(self, sheet_name):
"""獲取指定表單的所有數據(除去表頭)"""
max_row_num = self.get_max_row_num(sheet_name)
max_column = self.get_max_column_num(sheet_name)
values = []
for row in range(2, max_row_num + 1):
value_list = []
for column in range(1, max_column + 1):
value = self.__wb[sheet_name].cell(row, column).value
value_list.append(value)
values.append(value_list)
return values
def get_all_value_2(self, sheet_name):
"""獲取指定表單的所有數據(除去表頭)"""
rows_obj = self.__wb[sheet_name].iter_rows(min_row=2, max_row=self.__wb[sheet_name].max_row, values_only=True)
values = []
for row_tuple in rows_obj:
value_list = []
for value in row_tuple:
value_list.append(value)
values.append(value_list)
return values
def get_excel_title(self, sheet_name):
"""獲取sheet表頭"""
title_key = tuple(self.__wb[sheet_name].iter_rows(max_row=1, values_only=True))[0]
return title_key
def get_listdict_all_value(self, sheet_name):
"""獲取所有數據,返回嵌套字典的列表"""
sheet_title = self.get_excel_title(sheet_name)
all_values = self.get_all_value_2(sheet_name)
value_list = []
for value in all_values:
value_list.append(dict(zip(sheet_title, value)))
return value_list
def get_list_nametuple_all_value(self, sheet_name):
"""獲取所有數據,返回嵌套命名元組的列表"""
sheet_title = self.get_excel_title(sheet_name)
values = self.get_all_value_2(sheet_name)
excel = namedtuple('excel', sheet_title)
value_list = []
for value in values:
e = excel(*value)
value_list.append(e)
return value_list
def write_cell(self, sheet_name, row, column, value=None, bold=True, color=BLACK):
if isinstance(row, int) and isinstance(column, int):
try:
cell_obj = self.__wb[sheet_name].cell(row, column)
cell_obj.font = Font(color=color, bold=bold)
cell_obj.value = value
self.__wb.save(self.filename)
except Exception as e:
raise e
else:
raise TypeError('row and column must be type int')
if __name__ == '__main__':
pe = ParseExcel('sheet1.xlsx')
print(pe.get_all_value_2('division'))
print(pe.get_list_nametuple_all_value('division'))
column_row = pe.get_max_column_num('division')
print('最大列號:', column_row)
max_row = pe.get_max_row_num('division')
print('最大行號:', max_row)
cell_value_1 = pe.get_cell_value('division', row=2, column=3)
print('第%d行, 第%d列的數據為: %s' % (2, 3, cell_value_1))
cell_value_2 = pe.get_cell_value('division', coordinate='A5') #coordinate單元格名稱
print('A5單元格的數據為: {}'.format(cell_value_2))
value_row = pe.get_row_value('division', 3)
print('第{}行的數據為:{}'.format(3, value_row))
value_column = pe.get_column_value('division', 2)
print('第{}列的數據為:{}'.format(2, value_column))
values_1 = pe.get_all_value_1('division')
print('第一種方式獲取所有數據\n', values_1)
values_2 = pe.get_all_value_2('division')
print('第二種方式獲取所有數據\n', values_2)
title = pe.get_excel_title('division') #顯示所有的title
print('表頭為\n{}'.format(title))
dict_value = pe.get_listdict_all_value('division')
print('所有數據組成的嵌套字典的列表:\n', dict_value)
namedtuple_value = pe.get_list_nametuple_all_value('division') #顯示元祖列表
print('所有數據組成的嵌套命名元組的列表:\n', namedtuple_value)
pe.write_cell('division', 1, 2, 'Tc_title') #更換excel中的title
轉載自:https://www.cnblogs.com/victory-0315/p/12739013.html