1. 程式人生 > 其它 >HTTP 長連線與短連線

HTTP 長連線與短連線

環境安裝:

  • 模組官網:https://pypi.org/project/openpyxl/

  • pip install -U openpyxl3.0.7 / pip install openpyxl3.0.7

  • 三方支援:

    • pip install lxml
    • pip install pillow
  • 首先,讓我們來看一些基本定義:

    • 工作簿:一個 Excel 電子表格文件稱為一個工作簿,一個 工作簿儲存在副檔名為.xlsx 的檔案中
    • sheet表:每個工作簿可以包含多個表(也稱為工作表)
    • 活動表:使用者當前檢視的表(或關閉 Excel 前最後檢視的表),稱為活動表
    • 單元格:每個表都有一些列(地址是從 A 開始的字母)和一些行(地址是從 1 開始的數 字)。在特定行和列的方格稱為單元格。每個單元格都包含一個數字或文字值。

讀取Excel表格

#用 openpyxl 模組開啟 Excel 文件
import openpyxl

#建立了一個指定的工作簿物件
wb = openpyxl.load_workbook(filename='./data/test.xlsx')

#獲取工作簿的sheet表的名稱
wb.get_sheet_names()   #['Sheet']

#獲取指定的sheet物件
sheet = wb.get_sheet_by_name('基本資訊')

#獲取活動表
wb.get_active_sheet() #<Worksheet "職位資訊">

"""
從表中取得單元格
有了 Worksheet 物件後,就可以按名字訪問 Cell 物件
屬性:
  value:cell中儲存的值
  row:行索引
  column:列索引
  coordinate:座標
"""

cell = sheet['A2']
cell.value
cell.row
cell.column
cell.coordinate

#用字母來指定列,這在程式中可能有點奇怪,特別是在 Z 列之後,列開時使用 兩個字母:AA、AB、AC 等。作為替代,在呼叫表的 cell()方法時,可以傳入整數 作為 row 和 column 關鍵字引數,也可以得到一個單元格。第一行或第一列的整數 是 1,不是 0。

sheet.cell(row=1,column=2).value

#從工作表中取得行和列
#可以將 Worksheet 物件進行切片操作,從而取得電子表格中一行、一列或一個矩形區域中的所有 Cell 物件。
for cell_row in sheet['A2':'E6']:
    for cell in cell_row:
        print(cell.coordinate,cell.value)

#要訪問特定行或列的單元格的值,也可以利用 Worksheet 物件的 rows 和 columns屬性。        
sheet.columns[0]


import openpyxl, pprint
print('Opening workbook...')
wb = openpyxl.load_workbook('data/censuspopdata.xlsx')
sheet = wb.get_sheet_by_name('Population by Census Tract')
#countyData將包含你計算的每個縣的總人口和普查區數目。但在它裡面儲存任何東西之前,你應該確定它內部的資料結構。
countyData = {}
print('Reading rows...')
for row in range(2, sheet.get_highest_row() + 1):
    state = sheet['B' + str(row)].value
    county = sheet['C' + str(row)].value 
    pop = sheet['D' + str(row)].value
    countyData.setdefault(state, {})  #{state:{}}
    countyData[state].setdefault(county, {'tracts': 0, 'pop': 0}) #{state:{county:{'tracts': 0, 'pop': 0}}}
    countyData[state][county]['tracts'] += 1
    countyData[state][county]['pop'] += int(pop)
print('Writing results...')
resultFile = open('census2010.py', 'w')
#使用 pprint.pformat()函式,將變數字典的值作為一個巨大的字串, 寫入檔案 census2010.py
resultFile.write('allData = ' + pprint.pformat(countyData)) 
resultFile.close()
print('Done.')


# 將countyData輸出到文字檔案 census2010.py,你就通過 Python 程式生成了一個 Python 程式!這樣做的好處是現在可以匯入 census2010.py,就像任何其他 Python 模組一樣

import os
import census2010
#檢視AK州Anchorage縣的人口普查資料
census2010.allData['AK']['Anchorage']

寫入Excel文件

#呼叫 openpyxl.Workbook()函式,建立一個新的空 Workbook 物件
import openpyxl

#建立一個新的工作簿物件
wb = openpyxl.Workbook()

#獲取工作表名稱
wb.get_sheet_names()

#給工作表設定名稱
sheet = wb.get_active_sheet()
sheet.title = '跟進記錄表'

wb.get_sheet_names()  #['跟進記錄表']

#儲存工作表
wb.save('./data/第一個工作簿.xlsx')

"""
建立和刪除工作表
利用 create_sheet() and remove_sheet()方法,可以在工作簿中新增或刪除工作表
create_sheet()方法返回一個新的 Worksheet 物件,名為 SheetX,它預設是工作 簿的最後一個工作表。可以利用 index 和 title 關鍵字引數,指定新工作表的 索引或名稱。
remove_sheet()方法接受一個 Worksheet 物件作為其引數,而不是工作表名稱的字串。如果你只知道要刪除的工作表的名稱,就呼叫 get_sheet_by_name(),將它的返回值傳入 remove_sheet()。
在工作簿中新增或刪除工作表之後,記得呼叫 save()方法來儲存變更。
"""

#建立sheet
wb = openpyxl.Workbook()

wb.create_sheet(title='銷售記錄')
wb.create_sheet(index=1,title='養殖技術')
wb.get_sheet_names()  # ['Sheet', '養殖技術', '銷售記錄']

#刪除sheet
r_sheet = wb.get_sheet_by_name('養殖技術')
wb.remove_sheet(r_sheet)
wb.get_sheet_names()  #['Sheet', '銷售記錄']

# 將值寫入單元格
# 將值寫入單元格,很像將值寫入字典中的鍵
# 如果你有單元格座標的字串,可以像字典的鍵一樣,將它用於 Worksheet 對 象,指定要寫入的單元格。
sheet = wb.get_active_sheet()
sheet['A1'] = 'hello'
sheet['B2'] = 'world'
wb.save('./data/第二個工作簿.xlsx')
import openpyxl
wb = openpyxl.load_workbook('./data/produceSales.xlsx')
sheet = wb.get_sheet_by_name('Sheet')
PRICE_UPDATES = {'Garlic': 3.07,
                 'Celery': 1.19,
                 'Lemon': 1.27}
for rowNum in range(2, sheet.get_highest_row()+1): 
    produceName = sheet.cell(row=rowNum, column=1).value
    if produceName in PRICE_UPDATES:
        sheet.cell(row=rowNum, column=2).value = PRICE_UPDATES[produceName]
wb.save('./data/updatedProduceSales.xlsx')

設定單元格的字型風格

  • 設定某些單元格行或列的字型風格,可以幫助你強調電子表格中重點的區域。 例如,在這個產品電子表格中,程式可以對 產品的名稱 等行使用粗體。 或者也許你希望對每公斤價格超過5元的行使用斜體。手工為大型電子表格的某些部分設定字型風格非常令人厭煩,但程式可以馬上完成。
  • 為了定義單元格的字型風格,需要從 openpyxl.styles 模組匯入 Font和 Style。
  • Font引數:
from openpyxl.styles import Font,Style
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.get_active_sheet()
sheet['A3'] = 'hello bobo'
wb.save('./data/Styles.xlsx')

sheet['A3'].style #返回當前單元格的預設風格  Style(number_format='General')

#可以呼叫 Font()來建立一個 Font 物件,並將這個 Font 物件儲存在一個變數中。 然後將它傳遞給 Style(),得到 的 Style 物件儲存在一個變數中,並將該變數賦給 Cell 物件的 style 屬性。

f = Font(sz=50,b=True,i=True)
s = Style(font=f)
sheet['A3'].style = s
wb.save('./data/Styles.xlsx')

公式

  • 利用 openpyxl 模組,用程式設計的方式在單元格中新增公式,就像 新增普通的值一樣。例如:
    • sheet['B9'] = '=SUM(B1:B8)'
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.get_active_sheet()
sheet['A1'] = 200
sheet['A2'] = 300
sheet['A3'] = '=SUM(A1:A2)'
wb.save('./data/sum.xlsx')

調整行和列

  • 在 Excel 中,調整行和列的大小非常容易,只要點選並拖動行的邊緣,或列的 頭部。但如果你需要根據單元格的內容來設定行或列的大小,或者希望設定大量電子表格檔案中的行列大小,編寫 Python 程式來做就要快得多。

  • 設定行高和列寬

    • Worksheet 物件有 row_dimensions 和 column_dimensions 屬性,控制行高和列寬。
  • 注意:

    • 行的高度可以設定為 0 到 409 之間的整數或浮點值。這個值表示高度的點數。
      • 一點等於 1/72 英寸。預設的行高是 12.75。
    • 列寬可以設定為 0 到 255 之間的整數或浮點數。
      • 預設的列寬是 8.43 個字元。列寬為零或行高為零,將使單元格隱藏。
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.get_active_sheet()
sheet['A1'] = 'Tall row'
sheet['B2'] = 'Wide column'
wb.save('./data/dimensions.xlsx')

sheet.row_dimensions  
#{1: <openpyxl.worksheet.dimensions.RowDimension at 0x108af1f98>,2: <openpyxl.worksheet.dimensions.RowDimension at 0x108af1dd8>}

sheet.column_dimensions
#DimensionHolder([('A',<openpyxl.worksheet.dimensions.ColumnDimension at 0x108af1c88>),('B',<openpyxl.worksheet.dimensions.ColumnDimension at 0x108af1978>)])

#設定行高
sheet.row_dimensions[2].height = 50

#設定列寬
sheet.column_dimensions['A'].width = 80

wb.save('./data/dimensions.xlsx')

合併和拆分單元格

  • 利用 merge_cells()工作表方法,可以將一個矩形區域中的單元格合併為一個單元格。
  • 要拆分單元格,就呼叫 unmerge_cells()工作表方法。
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.get_active_sheet()
sheet.merge_cells('A1:D7') #合併
sheet['A1'] = 'hello bobo'
wb.save('./data/merged.xlsx')

#拆分單元格
sheet.unmerge_cells('A1:D7')

凍結窗格

  • 對於太大而不能一屏顯示的電子表格,“凍結”頂部的幾行或最左邊的幾列,是很有幫助的。在 OpenPyXL 中,每個 Worksheet 物件都有一個 freeze_panes 屬性,可以設定為一個 Cell 物件或一個單元格座標的字串。
    • 請注意,單元格上邊的所有行和左邊的所有列都會凍結,但單元格所在的行和列不會凍結。
  • 要解凍所有的單元格,就將 freeze_panes 設定為 None 或'A1'
#凍結
import openpyxl
wb = openpyxl.load_workbook('./data/produceSales.xlsx')
sheet = wb.get_active_sheet()
sheet.freeze_panes = 'A2'
wb.save('./data/produceSales.xlsx')

#解凍結
sheet.freeze_panes = None
wb.save('./data/produceSales.xlsx')

繪製圖表

  • openpyxl 支援利用工作表中單元格的資料,建立條形圖、折線圖、散點圖和餅圖。要建立圖表,需要做下列事情:

    • 1.從一個矩形區域選擇的單元格,建立一個 Reference 物件。
    • 2.通過傳入 Reference 物件,建立一個 Series 物件。
    • 3.建立一個 Chart 物件。
    • 4.將 Series 物件新增到 Chart 物件。
    • 5.可選地設定Chart 物件的drawing.top、drawing.left、drawing.width 和drawing.height變數用來設定圖表的位置和大小。
    • 6.將 Chart 物件新增到 Worksheet 物件。
  • Reference 物件需要一些解釋。Reference 物件表示圖表要引用的資料區域。是通過呼叫 openpyxl.charts.Reference()函式並傳入 3 個引數建立的:

    • 1.包含圖表資料的 Worksheet 物件。
    • 2.兩個整數的元組,代表矩形選擇區域的左上角單元格,該區域包含圖表資料:元組中第一個整數是行,第二個整數是列。請注意第一行是 1,不是 0。
    • 3.兩個整數的元組,代表矩形選擇區域的右下角單元格,該區域包含圖表資料:元組中第一個整數是行,第二個整數是列。
  • 我們可以呼叫 openpyxl.charts.BarChart(),建立一個條形圖。也可以呼叫openpyxl.charts.LineChart()、openpyxl.charts.ScatterChart()和 openpyxl.charts.PieChart(),建立折線圖、散點圖和餅圖。

import openpyxl
wb = openpyxl.load_workbook(filename='./data/sampleChart.xlsx')
sheet = wb.get_active_sheet()

    
refObj = openpyxl.charts.Reference(sheet, (1, 2),(10,2))
seriesObj = openpyxl.charts.Series(refObj, title='First series')
chartObj = openpyxl.charts.BarChart()
chartObj.append(seriesObj)
chartObj.drawing.top = 200 # set the position
chartObj.drawing.left = 200
chartObj.drawing.width = 300 # set the size
chartObj.drawing.height = 200
sheet.add_chart(chartObj)
wb.save('./data/sampleChart.xlsx')
import openpyxl
from openpyxl.charts import Reference,BarChart,Series
import os
for file_name in os.listdir('./data/Bobo公司2020-2030年營收報表'):
    if file_name != '.DS_Store':
        file_name = os.path.join('./data/Bobo公司2020-2030年營收報表',file_name)
        ex_file = openpyxl.load_workbook(file_name)
        sheet_names = ex_file.get_sheet_names()
        for sheet_name in sheet_names:
            sheet_file = ex_file.get_sheet_by_name(sheet_name)
            
            data1 = Reference(sheet_file, (2, 2),(32,2))
            data2 = Reference(sheet_file, (2, 3),(32,3))
            data3 = Reference(sheet_file, (2, 4),(32,4))
            seriesObj1 = Series(data1,title='手機')
            seriesObj2 = Series(data2,title='彩妝')
            seriesObj3 = Series(data3,title='電腦')
            
            bc = BarChart()
            bc.title = sheet_name
            bc.x_axis.title = '日期'
            bc.y_axis.title = '營收額'
            bc.append(seriesObj1)
            bc.append(seriesObj2)
            bc.append(seriesObj3)
            
            bc.drawing.top = 200 # set the position
            bc.drawing.left = 400
            bc.drawing.width = 600 # set the size
            bc.drawing.height = 400
            sheet_file.add_chart(bc)
    ex_file.save(file_name)           

5.Excel格式檔案

Python內部未提供處理Excel檔案的功能,想要在Python中操作Excel需要按照第三方的模組。

pip install openpyxl

此模組中集成了Python操作Excel的相關功能,接下來我們就需要去學習該模組提供的相關功能即可。

5.1 讀Excel

  • 讀sheet

    from openpyxl import load_workbook
    
    wb = load_workbook("files/p1.xlsx")
    
    # sheet相關操作
    
    # 1.獲取excel檔案中的所有sheet名稱
    """
    print(wb.sheetnames) # ['資料匯出', '使用者列表', 'Sheet1', 'Sheet2']
    """
    
    # 2.選擇sheet,基於sheet名稱
    """
    sheet = wb["資料匯出"]
    cell = sheet.cell(1, 2)
    print(cell.value)
    """
    
    # 3.選擇sheet,基於索引位置
    """
    sheet = wb.worksheets[0]
    cell = sheet.cell(1,2)
    print(cell.value)
    """
    
    # 4.迴圈所有的sheet
    """
    for name in wb.sheetnames:
        sheet = wb[name]
        cell = sheet.cell(1, 1)
        print(cell.value)
    """
    """
    for sheet in wb.worksheets:
        cell = sheet.cell(1, 1)
        print(cell.value)
    """
    """
    for sheet in wb:
        cell = sheet.cell(1, 1)
        print(cell.value)
    """
    
  • 讀sheet中單元格的資料

    from openpyxl import load_workbook
    
    wb = load_workbook("files/p1.xlsx")
    sheet = wb.worksheets[0]
    
    # 1.獲取第N行第N列的單元格(位置是從1開始)
    """
    cell = sheet.cell(1, 1)
    
    print(cell.value)
    print(cell.style)
    print(cell.font)
    print(cell.alignment)
    """
    
    # 2.獲取某個單元格
    """
    c1 = sheet["A2"]
    print(c1.value)
    
    c2 = sheet['D4']
    print(c2.value)
    """
    
    # 3.第N行所有的單元格
    """
    for cell in sheet[1]:
        print(cell.value)
    """
    
    # 4.所有行的資料(獲取某一列資料)
    """
    for row in sheet.rows:
        print(row[0].value, row[1].value)
    """
    
    # 5.獲取所有列的資料
    """
    for col in sheet.columns:
        print(col[1].value)
    """
    
  • 讀合併的單元格

    from openpyxl import load_workbook
    
    wb = load_workbook("files/p1.xlsx")
    sheet = wb.worksheets[2]
    
    # 獲取第N行第N列的單元格(位置是從1開始)
    c1 = sheet.cell(1, 1)
    print(c1)  # <Cell 'Sheet1'.A1>
    print(c1.value) # 使用者資訊
    
    c2 = sheet.cell(1, 2)
    print(c2)  # <MergedCell 'Sheet1'.B1>
    print(c2.value) # None
    
    
    from openpyxl import load_workbook
    
    wb = load_workbook('files/p1.xlsx')
    sheet = wb.worksheets[2]
    for row in sheet.rows:
        print(row)
    
    >>> 輸出結果
    (<Cell 'Sheet1'.A1>, <MergedCell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>)
    (<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>)
    (<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.C3>)
    (<MergedCell 'Sheet1'.A4>, <Cell 'Sheet1'.B4>, <Cell 'Sheet1'.C4>)
    (<Cell 'Sheet1'.A5>, <Cell 'Sheet1'.B5>, <Cell 'Sheet1'.C5>)
    

1.Excel格式檔案

Python內部未提供處理Excel檔案的功能,想要在Python中操作Excel需要按照第三方的模組。

pip install openpyxl

此模組中集成了Python操作Excel的相關功能,接下來我們就需要去學習該模組提供的相關功能即可。

5.1 讀Excel

  • 讀sheet

    from openpyxl import load_workbook
    
    wb = load_workbook("files/p1.xlsx")
    
    # sheet相關操作
    
    # 1.獲取excel檔案中的所有sheet名稱
    """
    print(wb.sheetnames) # ['資料匯出', '使用者列表', 'Sheet1', 'Sheet2']
    """
    
    # 2.選擇sheet,基於sheet名稱
    """
    sheet = wb["資料匯出"]
    cell = sheet.cell(1, 2)
    print(cell.value)
    """
    
    # 3.選擇sheet,基於索引位置
    """
    sheet = wb.worksheets[0]
    cell = sheet.cell(1,2)
    print(cell.value)
    """
    
    # 4.迴圈所有的sheet
    """
    for name in wb.sheetnames:
        sheet = wb[name]
        cell = sheet.cell(1, 1)
        print(cell.value)
    """
    """
    for sheet in wb.worksheets:
        cell = sheet.cell(1, 1)
        print(cell.value)
    """
    """
    for sheet in wb:
        cell = sheet.cell(1, 1)
        print(cell.value)
    """
    
  • 讀sheet中單元格的資料

    from openpyxl import load_workbook
    
    wb = load_workbook("files/p1.xlsx")
    sheet = wb.worksheets[0]
    
    # 1.獲取第N行第N列的單元格(位置是從1開始)
    """
    cell = sheet.cell(1, 1)
    
    print(cell.value)
    print(cell.style)
    print(cell.font)
    print(cell.alignment)
    """
    
    # 2.獲取某個單元格
    """
    c1 = sheet["A2"]
    print(c1.value)
    
    c2 = sheet['D4']
    print(c2.value)
    """
    
    # 3.第N行所有的單元格
    """
    for cell in sheet[1]:
        print(cell.value)
    """
    
    # 4.所有行的資料(獲取某一列資料)
    """
    for row in sheet.rows:
        print(row[0].value, row[1].value)
    """
    
    # 5.獲取所有列的資料
    """
    for col in sheet.columns:
        print(col[1].value)
    """
    
  • 讀合併的單元格

    from openpyxl import load_workbook
    
    wb = load_workbook("files/p1.xlsx")
    sheet = wb.worksheets[2]
    
    # 獲取第N行第N列的單元格(位置是從1開始)
    c1 = sheet.cell(1, 1)
    print(c1)  # <Cell 'Sheet1'.A1>
    print(c1.value) # 使用者資訊
    
    c2 = sheet.cell(1, 2)
    print(c2)  # <MergedCell 'Sheet1'.B1>
    print(c2.value) # None
    
    
    from openpyxl import load_workbook
    
    wb = load_workbook('files/p1.xlsx')
    sheet = wb.worksheets[2]
    for row in sheet.rows:
        print(row)
    
    >>> 輸出結果
    (<Cell 'Sheet1'.A1>, <MergedCell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>)
    (<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>)
    (<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.C3>)
    (<MergedCell 'Sheet1'.A4>, <Cell 'Sheet1'.B4>, <Cell 'Sheet1'.C4>)
    (<Cell 'Sheet1'.A5>, <Cell 'Sheet1'.B5>, <Cell 'Sheet1'.C5>)
    

5.1 寫Excel

在Excel中想要寫檔案,大致要分為在:

  • 原Excel檔案基礎上寫內容。

    from openpyxl import load_workbook
    
    wb = load_workbook('files/p1.xlsx')
    sheet = wb.worksheets[0]
    
    # 找到單元格,並修改單元格的內容
    cell = sheet.cell(1, 1)
    cell.value = "新的開始"
    
    # 將excel檔案儲存到p2.xlsx檔案中
    wb.save("files/p2.xlsx")
    
  • 新建立Excel檔案寫內容。

    from openpyxl import workbook
    
    # 建立excel且預設會建立一個sheet(名稱為Sheet)
    wb = workbook.Workbook()
    
    sheet = wb.worksheets[0] # 或 sheet = wb["Sheet"]
    
    # 找到單元格,並修改單元格的內容
    cell = sheet.cell(1, 1)
    cell.value = "新的開始"
    
    # 將excel檔案儲存到p2.xlsx檔案中
    wb.save("files/p2.xlsx")
    

在瞭解瞭如何讀取Excel和建立Excel之後,後續對於Excel中的sheet和cell操作基本上都相同。

from openpyxl import workbook

wb = workbook.Workbook() # Sheet

# 1. 修改sheet名稱
"""
sheet = wb.worksheets[0]
sheet.title = "資料集"
wb.save("p2.xlsx")
"""

# 2. 建立sheet並設定sheet顏色
"""
sheet = wb.create_sheet("工作計劃", 0)
sheet.sheet_properties.tabColor = "1072BA"
wb.save("p2.xlsx")
"""

# 3. 預設開啟的sheet
"""
wb.active = 0
wb.save("p2.xlsx")
"""

# 4. 拷貝sheet
"""
sheet = wb.create_sheet("工作計劃")
sheet.sheet_properties.tabColor = "1072BA"

new_sheet = wb.copy_worksheet(wb["Sheet"])
new_sheet.title = "新的計劃"
wb.save("p2.xlsx")
"""

# 5.刪除sheet
"""
del wb["使用者列表"]
wb.save('files/p2.xlsx')
"""
from openpyxl import load_workbook
from openpyxl.styles import Alignment, Border, Side, Font, PatternFill, GradientFill


wb = load_workbook('files/p1.xlsx')

sheet = wb.worksheets[1]

# 1. 獲取某個單元格,修改值
"""
cell = sheet.cell(1, 1)
cell.value = "開始"
wb.save("p2.xlsx")
"""

# 2.  獲取某個單元格,修改值
"""
sheet["B3"] = "Alex"
wb.save("p2.xlsx")
"""

# 3. 獲取某些單元格,修改值
"""
cell_list = sheet["B2":"C3"]
for row in cell_list:
    for cell in row:
        cell.value = "新的值"
wb.save("p2.xlsx")
"""

# 4. 對齊方式
"""
cell = sheet.cell(1, 1)

# horizontal,水平方向對齊方式:"general", "left", "center", "right", "fill", "justify", "centerContinuous", "distributed"
# vertical,垂直方向對齊方式:"top", "center", "bottom", "justify", "distributed"
# text_rotation,旋轉角度。
# wrap_text,是否自動換行。
cell.alignment = Alignment(horizontal='center', vertical='distributed', text_rotation=45, wrap_text=True)
wb.save("p2.xlsx")
"""

# 5. 邊框
# side的style有如下:dashDot','dashDotDot', 'dashed','dotted','double','hair', 'medium', 'mediumDashDot', 'mediumDashDotDot','mediumDashed', 'slantDashDot', 'thick', 'thin'
"""
cell = sheet.cell(9, 2)
cell.border = Border(
    top=Side(style="thin", color="FFB6C1"), 
    bottom=Side(style="dashed", color="FFB6C1"),
    left=Side(style="dashed", color="FFB6C1"),
    right=Side(style="dashed", color="9932CC"),
    diagonal=Side(style="thin", color="483D8B"),  # 對角線
    diagonalUp=True,  # 左下 ~ 右上
    diagonalDown=True  # 左上 ~ 右下
)
wb.save("p2.xlsx")
"""

# 6.字型
"""
cell = sheet.cell(5, 1)
cell.font = Font(name="微軟雅黑", size=45, color="ff0000", underline="single")
wb.save("p2.xlsx")
"""

# 7.背景色
"""
cell = sheet.cell(5, 3)
cell.fill = PatternFill("solid", fgColor="99ccff")
wb.save("p2.xlsx")
"""

# 8.漸變背景色
"""
cell = sheet.cell(5, 5)
cell.fill = GradientFill("linear", stop=("FFFFFF", "99ccff", "000000"))
wb.save("p2.xlsx")
"""

# 9.寬高(索引從1開始)
"""
sheet.row_dimensions[1].height = 50
sheet.column_dimensions["E"].width = 100
wb.save("p2.xlsx")
"""

# 10.合併單元格
"""
sheet.merge_cells("B2:D8")
sheet.merge_cells(start_row=15, start_column=3, end_row=18, end_column=8)
wb.save("p2.xlsx")
"""
"""
sheet.unmerge_cells("B2:D8")
wb.save("p2.xlsx")
"""

# 11.寫入公式
"""
sheet = wb.worksheets[3]
sheet["D1"] = "合計"
sheet["D2"] = "=B2*C2"
wb.save("p2.xlsx")
"""
"""
sheet = wb.worksheets[3]
sheet["D3"] = "=SUM(B3,C3)"
wb.save("p2.xlsx")
"""

# 12.刪除
"""
# idx,要刪除的索引位置
# amount,從索引位置開始要刪除的個數(預設為1)
sheet.delete_rows(idx=1, amount=20)
sheet.delete_cols(idx=1, amount=3)
wb.save("p2.xlsx")
"""

# 13.插入
"""
sheet.insert_rows(idx=5, amount=10)
sheet.insert_cols(idx=3, amount=2)
wb.save("p2.xlsx")
"""

# 14.迴圈寫內容
"""
sheet = wb["Sheet"]
cell_range = sheet['A1:C2']
for row in cell_range:
    for cell in row:
        cell.value = "xx"

for row in sheet.iter_rows(min_row=5, min_col=1, max_col=7, max_row=10):
    for cell in row:
        cell.value = "oo"
wb.save("p2.xlsx")
"""

# 15.移動
"""
# 將H2:J10範圍的資料,向右移動15個位置、向上移動1個位置
sheet.move_range("H2:J10",rows=1, cols=15)
wb.save("p2.xlsx")
"""
"""
sheet = wb.worksheets[3]
sheet["D1"] = "合計"
sheet["D2"] = "=B2*C2"
sheet["D3"] = "=SUM(B3,C3)"
sheet.move_range("B1:D3",cols=10, translate=True) # 自動翻譯公式
wb.save("p2.xlsx")
"""

# 16.列印區域
"""
sheet.print_area = "A1:D200"
wb.save("p2.xlsx")
"""

# 17.列印時,每個頁面的固定表頭
"""
sheet.print_title_cols = "A:D"
sheet.print_title_rows = "1:3"
wb.save("p2.xlsx")
"""