Python3讀寫 EXCEL文檔


XlsxWriter 只寫

基本介紹

XlsxWriter 是在 Python 下操作 EXCEL 文檔的利器

100% 支持 Excel XLSX 文件, 支持 Excel 2003、Excel 2007 等版本

支持所有 Excel 單元格的數據格式

包括:

  • 合並單元格、批注、自動篩選、豐富多格式字符串等
  • 支持工作表PNG / JPEG / BMP / WMF / EMF圖像。
  • 用於寫入大文件的內存優化模式。

官方文檔 https://xlsxwriter.readthedocs.io/

安裝

pip install XlsxWriter 

基本使用示例

import xlsxwriter

# 創建一個新的 Excel 文件,並添加一個工作表
workbook = xlsxwriter.Workbook('demo.xlsx')
worksheet = workbook.add_worksheet()

# 設置第一列(A) 單元格寬度為 20
worksheet.set_column('A:A', 20)

# 定義一個加粗的格式對象
bold = workbook.add_format({'bold': True})

# 在 A1 單元格處寫入字符串 'Hello'
worksheet.write('A1', 'Hello')

# 在 A2 單元格處寫入中文字符串,並加粗字體
worksheet.write('A2', '千鋒教育', bold)

# 利用 行和列的索引號方式,寫入數字,索引號是從 0 開始的
worksheet.write(2, 0, 100)  # 3 行 1列
worksheet.write(3, 0, 35.8)

# 計算 A3 到 A4 的結果
worksheet.write(4, 0, '=SUM(A3:A4)')

# 在 B5 單元格處插入一個圖片
worksheet.insert_image('B5', 'logo.png')

# 關閉 Excel 文件
workbook.close()

完成圖

 

 

 

方法解析

行和列的表示方法

XlsxWriter支持兩種表示法來指定單元格的位置: 行列符和A1符號。

行列符號 表示法是 對行和列都使用基於零的索引號表示。

而A1符號表示法是 使用標准Excel中的字母表示列,基於1的數字表示行。例如:

# 下面兩個都表示為 第一行的第一列
(0, 0)      
('A1') 

# 下面兩個都表示為 第七行的第三列
(6, 2) 
('C7')      

如果您以編程方式引用單元格,則行列符號表示法很有用:

for row in range(0, 5):
    worksheet.write(row, 0, 'Hello')

如何表示行列范圍

XlsxWriter支持Excel的工作表限制1,048,576行16,384列。

# 用 A1 符號表示法
worksheet.print_area('A1:XFD1')      # Same as 1:1
worksheet.print_area('A1:A1048576')  # Same as A:A

這些范圍也可以使用行列符號指定:

worksheet.print_area(0, 0,       0, 16383)  # Same as 1:1
worksheet.print_area(0, 0, 1048575,     0)  # Same as A:A
Workbook 類

用於創建一個新的 Excel 文件

workbook = xlsxwriter.Workbook('demo.xlsx')

注意: 和文件的打開模式 w 一樣,會把原來的內容清空。所以只能新建文件。

他會返回一個 Workbook 的實例對象,代表了整個 Excel 文件,並且會把這個文件存儲在磁盤上。

最后要記得關閉這個文件

workbook.close()

當然建議使用 with 管理上下文,這樣就可以不用顯示的調用 workboo.close()

with xlsxwriter.Workbook('hello_world.xlsx') as workbook:
    worksheet = workbook.add_worksheet()

    worksheet.write('A1', 'Hello world')

我們通過這個實例的方法來操作 Excel 文件,具體有以下方法:

  • add_worksheet([sheetname]) 方法

    用於創建一個新的工作表

sheet_shee1 = workbook.add_worksheet() # 工作表名: Shee1 sheet_qf01 = workbook.add_worksheet('qf01') # 工作表名: qf01 sheet_shee3 = workbook.add_worksheet() # 工作表名: Shee3 

它會返回一個表的對象,可以通過這個對象對表里的內容和樣式來進行具體的操作。

  • add_format([properties]) 方法

    用於創建一個格式化對象,使用這個對象可以對任意一個單元格進行格式化

    properties 是一個字典類型的參數,里邊定義具體的格式

字體加粗格式

bold = workbook.add_format({'bold': True})

日期格式

 date_format = workbook.add_format({'num_format': 'yyyy-mm-dd'})

更多的日期格式

示例演練

假設有如下數據主機 IP 信息,需要轉化成 Excel 文件來展示

import xlsxwriter

host_ip = (
    ["server1",'192.168.1.101','2018-06-11'],
    ["server2",'192.168.1.102','2018-06-11'],
    ["server3",'192.168.1.103','2018-06-11'],
    ["server4",'192.168.1.104','2018-06-11']
)

示例代碼

import xlsxwriter

host_ip = (
    ["server1",'192.168.1.101','2018-06-11'],
    ["server2",'192.168.1.102','2018-06-11'],
    ["server3",'192.168.1.103','2018-06-11'],
    ["server4",'192.168.1.104','2018-06-11']
)

# 創建一個新的文件
with xlsxwriter.Workbook('host_ip.xlsx') as  workbook:

    # 添加一個工作表
    worksheet = workbook.add_worksheet('ip信息')

    # 設置一個加粗的格式
    bold = workbook.add_format({"bold": True})

    # 設置一個日期的格式
    date_format = workbook.add_format(
        {'num_format': 'yyyy-mm-dd'})

    # 分別設置一下 A 和 B 列的寬度
    worksheet.set_column('A:A', 10)
    worksheet.set_column('B:B', 15)
    worksheet.set_column('C:C', 18)

    # 先把表格的抬頭寫上,並設置字體加粗
    worksheet.write('A1', '主機名',  bold)
    worksheet.write('B1', 'IP 地址', bold)
    worksheet.write(0,2, '統計日期', bold)

    # 設置數據寫入文件的初始行和列的索引位置
    row = 1
    col = 0

    # 迭代數據並逐行寫入文件
    for name, ip,date in (host_ip):
        worksheet.write(row, col,                    name)
        worksheet.write(row, col + 1,                  ip)
        worksheet.write(row, col + 2,   date, date_format)
        row += 1

示例文檔的樣子

 

 

openpyxl 讀寫

安裝

pip install openpyxl

基本使用

在內存中創建一個新文檔

>>> from openpyxl import Workbook
>>> wb = Workbook()

一個新文檔中必須至少有一個工作表

創建一個新工作表

>>> ws = wb.active

# 或者
>>> ws1 = wb.create_sheet() # 默認在結尾創建一個工作表

>>> ws2 = wb.create_sheet("date1", 0) # 指定在開頭創建一個工作表

在創建表格時,假如不指定名稱,則表格會自動命名。(Sheet1,Sheet2)

工作表的名稱可以更改

ws.title = 'New Title'

可以在一個文件中對某一個工作表進行復制操作

qf_copy = wb.copy_worksheet(ws2)
qf_copy.title = 'date1_copy'

注意:

只有單元格(包括值,樣式,超鏈接和注釋)和某些工作表屬性(包括尺寸,格式和屬性)被復制。所有其他工作簿/工作表屬性不會被復制 - 例如圖像,圖表。

查看當前文件中所有的工作表對象

print(wb.worksheets)

# 輸出結果:
[<Worksheet "date1">, <Worksheet "New Title">, <Worksheet "Sheet1">, <Worksheet "date1_copy">]

當然也可以循環這些工作表名稱

for sheet in wb:
    print(sheet.title)

# 輸出結果
date1
New Title
Sheet1

訪問單元格

當工作表在內存中創建時,它不包含單元格。它們在第一次訪問時創建。

單元格可以作為工作表的鍵直接訪問

# 存在則獲取值,不存在則創建
>>> c= ws['A4']

# 賦值操作,不存在則直接創建
>>> ws['A4'] = 4

這使用行和列表示法提供對單元格的訪問權限:

>>> d = ws.cell(row=4, column=2, value=10)

警告

由於這個特性,即使沒有為它們賦值,通過滾動單元格而不是直接訪問它們也會在內存中創建它們。就像是

>>> for i in range(1,101):
       for j in range(1,101):
           ws.cell(row=i, column=j)

將在內存中創建100x100的單元格,無需任何操作。

單元格的范圍操作

同樣支持 A1 表示法的切片操作

>>> cell_range = ws['A1':'C2']

還可以用以下方法獲取

ws[1:4]  # 獲取到第一列的第一行到第四行

循環單元格以行為單位返回

for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
    print(row)  # 每一行
    for cell in row:
       print(cell)  # 每一行中的每一列

循環單元格以列為單位返回

for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
     for cell in col:
        print(cell)

給單元格賦值

從以上知識點中我們得到了具體的單元格對象,此時我們就可對他們進行賦值的操作了

# 可以這樣賦值
ws.cell(row=1, column=2, value='sharkyun')  # 對第一行的第二列進行賦值

# 還可以這樣
for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
     for cell in col:
            cell.value = 'sharkyun'

獲取單元格的值

# 方式一 指定獲取第 4 行的第 3 列
 cell_val = ws.cell(row=4,column=3).value
 print(cell_val)

# 方式二 循環得到每個單元格的值
for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
     for cell in col:
            print(cell.value)

設置單元格的字體樣式

from openpyxl.styles import Font
from openpyxl.styles import colors

# 設置字體樣式
ft = Font(bold=True,  # 加粗
          size=20,    # 大小
          color=colors.RED,  # 顏色
          # color='FFBB00'   # 顏色
          )

# 使用字體樣式到單元格
ws["A1"].font = ft
ws["B1"].font = ft
ws["C1"].font = ft

設置列寬

ws.column_dimensions['A'].width = 18

迭代所有的行和列

迭代所有的行

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

# 假如循環的是新創建的工作表, 那么初始時工作表中是沒有單元格的,
# 所以需要先在工作表中創建出一些單元格
ws['C4'] = "Hello"

# ws.rows 是一個生成器對象,可以迭代它,每次迭代會返回工作表中的一行
for row in ws.rows:
    print(row)
 
# 以下是輸出結果
(<Cell 'Sheet3'.A1>, <Cell 'Sheet3'.B1>, <Cell 'Sheet3'.C1>)
(<Cell 'Sheet3'.A2>, <Cell 'Sheet3'.B2>, <Cell 'Sheet3'.C2>)
(<Cell 'Sheet3'.A3>, <Cell 'Sheet3'.B3>, <Cell 'Sheet3'.C3>)
(<Cell 'Sheet3'.A4>, <Cell 'Sheet3'.B4>, <Cell 'Sheet3'.C4>)

迭代所有的列

此示例的數據對象,沿用了上面的示例

for col in ws.columns:
    print(col)
    
# 以下是輸出結果   
(<Cell 'Sheet3'.A1>, <Cell 'Sheet3'.A2>, <Cell 'Sheet3'.A3>, <Cell 'Sheet3'.A4>)
(<Cell 'Sheet3'.B1>, <Cell 'Sheet3'.B2>, <Cell 'Sheet3'.B3>, <Cell 'Sheet3'.B4>)
(<Cell 'Sheet3'.C1>, <Cell 'Sheet3'.C2>, <Cell 'Sheet3'.C3>, <Cell 'Sheet3'.C4>)

保存數據

要把內存的數據保存到硬盤中,使用 wb.save() 方法即可

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

ws["A1"] = "hello"

wb.save("one.xlsx")

# 注意文件的后綴名 *.xlsx
示例演練

假設有如下數據主機 IP 信息,需要轉化成 Excel 文件來展示

import xlsxwriter

host_ip = (
    ["server1",'192.168.1.101','2018-06-11'],
    ["server2",'192.168.1.102','2018-06-11'],
    ["server3",'192.168.1.103','2018-06-11'],
    ["server4",'192.168.1.104','2018-06-11']
)

aa

from openpyxl import Workbook
from openpyxl.styles import Font
from openpyxl.styles import colors

# 定制一個字體樣式對象
ft = Font(bold=True, size=20,
          color=colors.RED,
          # color='FFBB00'
          )

host_ip = (
    ["server1", '192.168.1.101', '2018-06-11'],
    ["server2", '192.168.1.102', '2018-06-11'],
    ["server3", '192.168.1.103', '2018-06-11'],
    ["server4", '192.168.1.104', '2018-06-11']
)

# 創建 Excel 文件對象
wb = Workbook()

ws1 = wb.active

# 更改工作表標簽的背景色,值是RRGGBB顏色代碼
# http://www.sioe.cn/yingyong/yanse-rgb-16/
ws1.sheet_properties.tabColor = "DC143C"

# 設置標題的內容和字體樣式
ws1.cell(row=1,column=1,value="主機名").font = ft
ws1.cell(row=1,column=2,value="IP 地址").font = ft
ws1.cell(row=1,column=3,value="統計時間").font = ft

# 設置列寬
ws1.column_dimensions['A'].width = 16
ws1.column_dimensions['B'].width = 22
ws1.column_dimensions['C'].width = 22

# 獲取到所有的行以及每行的所有列
rows = ws1.iter_rows(min_row=2, max_col=len(host_ip[0]),max_row=len(host_ip))

for row,items in zip(rows, host_ip):
    for cell, item in zip(row, items):
        cell.value = item
        cell.font = Font(size=18)
        # print(cell.value, item)

# 定義文件名
dest_filename = 'empty_book.xlsx'

# 保存文件到硬盤
wb.save(filename = dest_filename)

讀取一個已存在的 Excel 文件

from openpyxl import load_workbook

# 獲取文件對象
wb2 = load_workbook('empty_book.xlsx')

# 查看文件中所有的工作表名
wb2.get_sheet_names()

# 通過工作表名獲取到工作表對象
 ws = wb2.get_sheet_by_name('Sheet')

# 同樣可以安裝上面提到的方法訪問這個工作表中的行和列
# 比如循環每一行
for row in ws.rows:
    print(row)

原文地址:https://www.jianshu.com/p/6c229d2663b2?from=timeline&isappinstalled=0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM