openpyxl Worksheet

小吉猫發表於2024-05-20

worksheet 說明

Worksheet 代表一個 Excel 工作表。

worksheet 初始化

from openpyxl import Workbook

# 建立一個新的Excel工作簿
wb = Workbook()

# 獲取第一個工作表
worksheet = wb.active

# 儲存工作簿到指定的檔名
wb.save("execl_test.xlsx")

# 關閉工作簿
wb.close()

worksheet 屬性

title: 返回工作表的標題。

max_row: 返回工作表中最大的行數。

max_column: 返回工作表中最大的列數。

columns: 訪問工作表中的所有列。這個屬性返回一個生成器,允許迭代每一列以訪問其中的單元格。

rows: 訪問工作表中的所有行。這個屬性返回一個生成器,允許迭代每一行以訪問其中的單元格。

sheet_format:設定工作表的格式,如列寬、行高等。
   base_col_width: 用於設定基礎列寬度。預設值:10。
   default_row_height: 設定預設行高度。預設值:12.75。
   
row_dimensions: 設定每行行高。

column_dimensions: 設定每列列寬。

freeze_panes: 用於凍結工作表中的特定行或列,使其在滾動時始終可見。
  worksheet.freeze_panes = 'A2'  # 凍結第一行
  worksheet.freeze_panes = 'B1'  # 凍結第一列
  worksheet.freeze_panes = 'C2'  # 凍結前兩列和第一行
  worksheet.freeze_panes = None  # 取消所有凍結窗格

index(worksheet): 用於獲取工作表在工作簿中的位置索引。位置索引從0開始,這意味著第一個工作表的索引是0。
from openpyxl import Workbook

# 建立一個新的Excel工作簿
wb = Workbook()

# 獲取第一個工作表
worksheet = wb.active

# 獲取工作表的名稱
print(type(worksheet.title), worksheet.title)   # 輸出: <class 'str'> Sheet

# 獲取工作表的最大行數
print(type(worksheet.max_row), worksheet.max_row)   # 輸出: <class 'int'> 1

# 獲取工作表的最大列數
print(type(worksheet.max_column), worksheet.max_column) # 輸出: <class 'int'> 1

# 設定基礎列寬度
worksheet.sheet_format.base_col_width = 15

# 設定預設行高度
worksheet.sheet_format.default_row_height = 50

# 設定第一行的行高為30
worksheet.row_dimensions[1].height = 30

# 設定第一列(列A)的列寬為20
worksheet.column_dimensions['A'].width = 20

# 設定凍結窗格:凍結第一行
ws.freeze_panes = 'A2'

# 設定凍結窗格:凍結第一列
ws.freeze_panes = 'B1'

# 設定凍結窗格:凍結第一行和第一列
ws.freeze_panes = 'B2'

# 取消凍結窗格
ws.freeze_panes = None  # 取消凍結窗格

# 儲存工作簿到指定的檔名
wb.save("execl_test.xlsx")

# 關閉工作簿
wb.close()
from openpyxl import load_workbook

workbook = load_workbook('execl_test.xlsx')

worksheet = workbook.worksheets[0]
print(workbook.index(worksheet), worksheet.title)    # 輸出: 0 Sheet

# 儲存工作簿到指定的檔名
workbook.save("execl_test.xlsx")

# 關閉工作簿
workbook.close()
from openpyxl import load_workbook

# 載入現有的工作簿
wb = load_workbook('example.xlsx')

# 獲取活動的工作表
ws = wb.active

# 遍歷並列印每行的值
for row in ws.rows:
    for cell in row:
        print(cell.value)
        
# 遍歷並列印每列的值
for column in ws.columns:
    for cell in column:
        print(cell.value)
        
# 儲存工作簿
wb.save('unmerged_cells_example.xlsx')

worksheet 方法

append(rows)

功能: 在工作表末尾附加一行或多行資料。
引數: rows - 要新增的行資料。
from openpyxl import Workbook

# 建立一個新的Excel工作簿
wb = Workbook()

# 獲取第一個工作表
worksheet = wb.active

# 新增一行資料
worksheet.append(['Alice', 30, 'Engineer'])

# 多行資料
data = [
    ['Bob', 25, 'Male'],
    ['Charlie', 35, 'Male']
]

# 逐行新增資料
for row in data:
    worksheet.append(row)

# 列印工作表中資料
for row in worksheet.iter_rows(values_only=True):
    print(type(row), row)

# 輸出: <class 'tuple'> ('Alice', 30, 'Engineer')
# 輸出: <class 'tuple'> ('Bob', 25, 'Male')
# 輸出: <class 'tuple'> ('Charlie', 35, 'Male')

# 儲存工作簿到指定的檔名
wb.save("execl_test.xlsx")

# 關閉工作簿
wb.close()

iter_rows()

iter_rows(): 用於迭代工作表中的行,返回每一行的單元格物件。
iter_rows(min_row=1, max_row=None, min_col=1, max_col=None, values_only=False):
  min_row (可選): 起始行號,預設為1;
  max_row (可選): 結束行號,預設為工作表中的最大行號;
  min_col (可選): 起始列號,預設為1;
  max_col (可選): 結束列號,預設為工作表中的最大列號;
  values_only (可選): 如果設定為 True,則只返回單元格的值,而不是單元格物件。
返回值: 返回一個生成器,用於迭代工作表中符合條件的行。
from openpyxl import Workbook

# 建立一個新的Excel工作簿
wb = Workbook()

# 獲取第一個工作表
worksheet = wb.active

# 新增一行資料
worksheet.append(['Alice', 30, 'Engineer'])

# 遍歷工作表的每一行
for row in worksheet.iter_rows(values_only=True):
    print(type(row), row)
# 輸出: <class 'tuple'> ('Alice', 30, 'Engineer')

# 儲存工作簿到指定的檔名
wb.save("execl_test.xlsx")

# 關閉工作簿
wb.close()

iter_cols

iter_cols(): 用於迭代工作表中的列,返回每一列的單元格物件。
iter_cols(min_row=1, max_row=None, min_col=1, max_col=None, values_only=False):
  min_row (可選): 起始行號,預設為1;
  max_row (可選): 結束行號,預設為工作表中的最大行號;
  min_col (可選): 起始列號,預設為1;
  max_col (可選): 結束列號,預設為工作表中的最大列號;
  values_only (可選): 如果設定為 True,則只返回單元格的值,而不是單元格物件。
返回值: 返回一個生成器,用於迭代工作表中符合條件的行。
from openpyxl import Workbook

# 建立一個新的Excel工作簿
wb = Workbook()

# 獲取第一個工作表
worksheet = wb.active

# 新增一行資料
worksheet.append(['Alice', 30, 'Engineer'])

# 遍歷工作表的每一列
for cols in worksheet.iter_cols(values_only=True):
    print(type(cols), cols)
# 輸出: <class 'tuple'> ('Alice',)
# 輸出: <class 'tuple'> (30,)
# 輸出: <class 'tuple'> ('Engineer',)

# 儲存工作簿到指定的檔名
wb.save("execl_test.xlsx")

# 關閉工作簿
wb.close()

insert_cols()

insert_cols(): 用於插入指定列索引開始的指定數量的列。

insert_cols(idx, amount=1):
  idx: 要插入的列的起始索引。
  amount: 要插入的列的數量,預設為1。可選。
from openpyxl import Workbook

# 建立一個新的 Excel 工作簿
wb = Workbook()
ws = wb.active

# 填充示例資料
for row in range(1, 6):
    ws.append([f'Data {row}{col}' for col in range(1, 6)])

# 儲存初始的工作簿(可選)
wb.save('before_insert_columns.xlsx')

# 在第2列位置插入1列
ws.insert_cols(2, amount=1)

# 在第2列位置插入3列
ws.insert_cols(2, amount=3)

# 儲存工作簿
wb.save('after_insert_columns.xlsx')

delete_cols()

delete_cols(): 用於刪除指定列索引開始的指定數量的列。

delete_cols(idx, amount=1):
  idx: 要刪除的列的起始索引。
  amount: 要刪除的列的數量,預設為1。可選。
from openpyxl import Workbook

# 建立一個新的Excel工作簿
wb = Workbook()

# 獲取第一個工作表
worksheet = wb.active

# 新增一行資料
worksheet.append(['Alice', 30, 'Engineer', '2024'])

# 刪除第1列
worksheet.delete_cols(1)

# 刪除從第2列開始的3列
worksheet.delete_cols(2, 3)

# 遍歷工作表的每一列
for row in worksheet.iter_rows(values_only=True):
    print(type(row), row)

# 輸出: <class 'tuple'> (30,)

# 儲存工作簿到指定的檔名
wb.save("execl_test.xlsx")

# 關閉工作簿
wb.close()

insert_rows()

insert_rows(): 用於插入指定行索引開始的指定數量的行。

insert_rows(idx, amount=1):
  idx: 要插入的行的起始索引。
  amount: 要插入的行的數量,預設為1。可選。
from openpyxl import Workbook

# 建立一個新的 Excel 工作簿
wb = Workbook()
ws = wb.active

# 填充示例資料
for row in range(1, 6):
    ws.append([f'Data {row}{col}' for col in range(1, 6)])

# 儲存初始的工作簿(可選)
wb.save('before_insert_rows.xlsx')

# 在第3行位置插入1行
ws.insert_rows(3, amount=1)

# 在第3行位置插入3行
ws.insert_rows(3, amount=3)

# 儲存工作簿
wb.save('after_insert_rows.xlsx')

print("A row has been inserted at the third position.")

delete_rows()

delete_rows(idx, amount=1): 用於刪除指定行索引開始的指定數量的行。

delete_rows(idx, amount=1):
  idx: 要刪除的列的起始索引。
  amount: 要刪除的列的數量,預設為1。可選。
from openpyxl import Workbook

# 建立一個新的Excel工作簿
wb = Workbook()

# 獲取第一個工作表
worksheet = wb.active

# 多行資料
data = [
    ['Bob', 25, 'Male'],
    ['Charlie', 35, 'Male'],
    ['Alice', 30, 'Engineer'],
    ['Bob01', 25, 'Male']
]

# 逐行新增資料
for row in data:
    worksheet.append(row)

# 刪除第3行
worksheet.delete_rows(3)

# 刪除從第2行開始的3行
worksheet.delete_rows(2, 3)

# 列印工作表中資料
for row in worksheet.iter_rows(values_only=True):
    print(type(row), row)

# 輸出: <class 'tuple'> ('Bob', 25, 'Male')

# 儲存工作簿到指定的檔名
wb.save("execl_test.xlsx")

# 關閉工作簿
wb.close()

merge_cells()

merge_cells(): 方法用於合併指定區域的單元格。合併單元格時,合併後的單元格值將僅儲存在左上角的單元格中,其餘單元格將顯示為空。
merge_cells(range_string=None, start_row=None, start_column=None, end_row=None, end_column=None):
  range_string (可選): 合併單元格的區域字串,例如 "A1:D1" 表示從單元格 A1 到 D1 的範圍。
  start_row (可選): 起始行號。
  start_column (可選): 起始列號。
  end_row (可選): 結束行號。
  end_column (可選): 結束列號。
from openpyxl import Workbook

# 建立一個新的Excel工作簿
wb = Workbook()

# 獲取第一個工作表
worksheet = wb.active

# 合併單元格 A1 到 D1
worksheet.merge_cells('A1:D1')

# 設定合併單元格的值
worksheet['A1'] = 'Merged Cell A1 to D1'

# 合併單元格從第2行第1列(A2)到第2行第5列(E2)
worksheet.merge_cells(start_row=2, start_column=1, end_row=2, end_column=5)

# 設定合併單元格的值
worksheet.cell(row=2, column=1, value='Merged Cell A2 to E2')


# 列印工作表中資料
for row in worksheet.iter_rows(values_only=True):
    print(type(row), row)

# 輸出: <class 'tuple'> ('Merged Cell A1 to D1', None, None, None, None)
# 輸出: <class 'tuple'> ('Merged Cell A2 to E2', None, None, None, None)

# 儲存工作簿到指定的檔名
wb.save("execl_test.xlsx")

# 關閉工作簿
wb.close()

openpyxl Worksheet

unmerge_cells()

unmerge_cells(): 方法用於取消已經合併的單元格。
unmerge_cells(range_string=None, start_row=None, start_column=None, end_row=None, end_column=None):
  range_string (可選): 合併單元格的區域字串,例如 "A1:D1" 表示從單元格 A1 到 D1 的範圍。
  start_row (可選): 起始行號。
  start_column (可選): 起始列號。
  end_row (可選): 結束行號。
  end_column (可選): 結束列號。
from openpyxl import Workbook

# 建立一個新的Excel工作簿
wb = Workbook()
ws = wb.active

# 合併單元格 A1 到 D1
ws.merge_cells('A1:D1')
ws['A1'] = 'Merged Cell A1 to D1'

# 取消合併單元格 A1 到 D1
ws.unmerge_cells('A1:D1')

# 合併單元格從第2行第1列(A2)到第2行第4列(D2)
ws.merge_cells(start_row=2, start_column=1, end_row=2, end_column=4)
ws.cell(row=2, column=1, value='Merged Cell A2 to D2')

# 取消合併單元格從第2行第1列(A2)到第2行第4列(D2)
ws.unmerge_cells(start_row=2, start_column=1, end_row=2, end_column=4)

# 儲存工作簿
wb.save('unmerged_cells_example.xlsx')

print("Cells A1 to D1 have been unmerged.")

worksheet.cell()

cell() 說明

cell(): 方法用於訪問或設定工作表中特定單元格的數值。

cell(row=row_num, column=col_num, value=None):
  row: 表示要操作的單元格的行號。
  column: 表示要操作的單元格的列號。
  value (可選): 要設定的單元格的值。
 
返回值:
  該方法返回一個單元格物件(Cell 物件),您可以從該物件中獲取和設定單元格的值和屬性。

cell 物件屬性

Cell.value:獲取或設定單元格的值。
Cell.row:單元格所在的行號。
Cell.column:單元格所在的列號。
Cell.coordinate:單元格的座標,如 'A1'。
Cell.data_type:單元格的資料型別(如 shared、inlineStr、s、str、或 None)。
Cell.font: 獲取或設定單元格的字型。
Cell.fill: 獲取或設定單元格的填充樣式。

示例

from openpyxl import Workbook

# 建立一個新的Excel工作簿
wb = Workbook()

# 獲取第一個工作表
worksheet = wb.active

# 獲取第一行第一列的單元格物件
cell_A1 = worksheet.cell(row=1, column=1)
print(type(cell_A1), cell_A1)     # 輸出: <class 'openpyxl.cell.cell.Cell'> <Cell 'Sheet'.A1>

# 設定單元格的值為 'Alice'
cell_A1.value = 'Alice01'
print(cell_A1.value)   # 輸出: Alice01

# 另一種設定值的方式
cell_B1 = worksheet.cell(row=1, column=2, value=30)  # 設定第一行第二列的值為 30

print(cell_B1.value)  # 輸出:30
print(cell_B1.row)    # 輸出:1
print(cell_B1.column) # 輸出:2
print(cell_B1.coordinate) # 輸出:B1
print(cell_B1.data_type) # 輸出:n (預設)


# 儲存工作簿到指定的檔名
wb.save("execl_test.xlsx")

# 關閉工作簿
wb.close()

相關文章