Python使用openpyxl讀寫excel文件

来源:http://www.cnblogs.com/sun-haiyu/archive/2017/06/29/7096423.html
-Advertisement-
Play Games

Python使用openpyxl讀寫excel文件 這是一個第三方庫,可以處理 格式的Excel文件。 安裝。如果使用Aanconda,應該自帶了。 讀取Excel文件 需要導入相關函數。 預設打開的文件為可讀寫,若有需要可以指定參數 為`True`。 獲取工作表 Sheet 獲取單元格 返回 , ...


Python使用openpyxl讀寫excel文件

這是一個第三方庫,可以處理xlsx格式的Excel文件。pip install openpyxl安裝。如果使用Aanconda,應該自帶了。

讀取Excel文件

需要導入相關函數。

from openpyxl import load_workbook

# 預設可讀寫,若有需要可以指定write_only和read_only為True
wb = load_workbook('mainbuilding33.xlsx')

預設打開的文件為可讀寫,若有需要可以指定參數read_onlyTrue

獲取工作表--Sheet

# 獲得所有sheet的名稱
print(wb.get_sheet_names())
# 根據sheet名字獲得sheet
a_sheet = wb.get_sheet_by_name('Sheet1')
# 獲得sheet名
print(a_sheet.title)
# 獲得當前正在顯示的sheet, 也可以用wb.get_active_sheet()
sheet = wb.active 

獲取單元格

# 獲取某個單元格的值,觀察excel發現也是先字母再數字的順序,即先列再行
b4 = sheet['B4']
# 分別返回
print(f'({b4.column}, {b4.row}) is {b4.value}')  # 返回的數字就是int型

# 除了用下標的方式獲得,還可以用cell函數, 換成數字,這個表示B2
b4_too = sheet.cell(row=4, column=2)
print(b4_too.value)

b4.column返回B, b4.row返回4, value則是那個單元格的值。另外cell還有一個屬性coordinate, 像b4這個單元格返回的是坐標B4

獲得最大行和最大列

# 獲得最大列和最大行
print(sheet.max_row)
print(sheet.max_column)

獲取行和列

  • sheet.rows為生成器, 裡面是每一行的數據,每一行又由一個tuple包裹。
  • sheet.columns類似,不過裡面是每個tuple是每一列的單元格。
# 因為按行,所以返回A1, B1, C1這樣的順序
for row in sheet.rows:
    for cell in row:
        print(cell.value)

# A1, A2, A3這樣的順序
for column in sheet.columns:
    for cell in column:
        print(cell.value)

上面的代碼就可以獲得所有單元格的數據。如果要獲得某行的數據呢?給其一個索引就行了,因為sheet.rows是生成器類型,不能使用索引,轉換成list之後再使用索引list(sheet.rows)[2]這樣就獲取到第二行的tuple對象。

for cell in list(sheet.rows)[2]:
    print(cell.value)

如何獲得任意區間的單元格?

可以使用range函數,下麵的寫法,獲得了以A1為左上角,B3為右下角矩形區域的所有單元格。註意range從1開始的,因為在openpyxl中為了和Excel中的表達方式一致,並不和編程語言的習慣以0表示第一個值。

for i in range(1, 4):
    for j in range(1, 3):
        print(sheet.cell(row=i, column=j))
        
# out
<Cell mainbuilding33.A1>
<Cell mainbuilding33.B1>
<Cell mainbuilding33.A2>
<Cell mainbuilding33.B2>
<Cell mainbuilding33.A3>
<Cell mainbuilding33.B3>

還可以像使用切片那樣使用。sheet['A1':'B3']返回一個tuple,該元組內部還是元組,由每行的單元格構成一個元組。

for row_cell in sheet['A1':'B3']:
    for cell in row_cell:
        print(cell)
        

for cell in sheet['A1':'B3']:
    print(cell)

# out
(<Cell mainbuilding33.A1>, <Cell mainbuilding33.B1>)
(<Cell mainbuilding33.A2>, <Cell mainbuilding33.B2>)
(<Cell mainbuilding33.A3>, <Cell mainbuilding33.B3>)

根據字母獲得列號,根據列號返回字母

需要導入, 這兩個函數存在於openpyxl.utils

from openpyxl.utils import get_column_letter, column_index_from_string

# 根據列的數字返回字母
print(get_column_letter(2))  # B
# 根據字母返回列的數字
print(column_index_from_string('D'))  # 4

將數據寫入Excel

工作表相關

需要導入WorkBook

from openpyxl import Workbook

wb = Workbook()

這樣就新建了一個新的工作表(只是還沒被保存)。

若要指定只寫模式,可以指定參數write_only=True。一般預設的可寫可讀模式就可以了。

print(wb.get_sheet_names())  # 提供一個預設名叫Sheet的表,office2016下新建提供預設Sheet1
# 直接賦值就可以改工作表的名稱
sheet.title = 'Sheet1'
# 新建一個工作表,可以指定索引,適當安排其在工作簿中的位置
wb.create_sheet('Data', index=1)  # 被安排到第二個工作表,index=0就是第一個位置

# 刪除某個工作表
wb.remove(sheet)
del wb[sheet]

寫入單元格

還可以使用公式哦

# 直接給單元格賦值就行
sheet['A1'] = 'good'
# B9處寫入平均值
sheet['B9'] = '=AVERAGE(B2:B8)'

但是如果是讀取的時候需要加上data_only=True這樣讀到B9返回的就是數字,如果不加這個參數,返回的將是公式本身'=AVERAGE(B2:B8)'

append函數

可以一次添加多行數據,從第一行空白行開始(下麵都是空白行)寫入。

# 添加一行
row = [1 ,2, 3, 4, 5]
sheet.append(row)

# 添加多行
rows = [
    ['Number', 'data1', 'data2'],
    [2, 40, 30],
    [3, 40, 25],
    [4, 50, 30],
    [5, 30, 10],
    [6, 25, 5],
    [7, 50, 10],
]

由於append函數只能按行寫入。如果我們想按列寫入呢。append能實現需求麽?如果把上面的列表嵌套看作矩陣。只要將矩陣轉置就可以了。使用zip()函數可以實現,不過內部的列表變成了元組就是了。都是可迭代對象,不影響。

list(zip(*rows))

# out
[('Number', 2, 3, 4, 5, 6, 7),
 ('data1', 40, 40, 50, 30, 25, 50),
 ('data2', 30, 25, 30, 10, 5, 10)]

解釋下上面的list(zip(*rows))首先*rows將列表打散,相當於填入了若幹個參數,zip從某個列表中提取第1個值組合成一個tuple,再從每個列表中提取第2個值組合成一個tuple,一直到最短列表的最後一個值提取完畢後結束,更長列表的之後的值被捨棄,換句話,最後的元組個數是由原來每個參數(可迭代對象)的最短長度決定的。比如現在隨便刪掉一個值,最短列表長度為2,data2那一列(豎著看)的值全部被捨棄。

rows = [
    ['Number', 'data1', 'data2'],
    [2, 40],
    [3, 40, 25],
    [4, 50, 30],
    [5, 30, 10],
    [6, 25, 5],
    [7, 50, 10],
]
# out
[('Number', 2, 3, 4, 5, 6, 7), ('data1', 40, 40, 50, 30, 25, 50)]

最後zip返回的是zip對象,看不到數據的。使用list轉換下就好了。使用zip可以方便實現將數據按列寫入。

保存文件

所有的操作結束後,一定記得保存文件。指定路徑和文件名,尾碼名為xlsx

wb.save(r'D:\example.xlsx')

設置單元格風格--Style

先導入需要的類from openpyxl.styles import Font, colors, Alignment

分別可指定字體相關,顏色,和對齊方式。

字體

bold_itatic_24_font = Font(name='等線', size=24, italic=True, color=colors.RED, bold=True)

sheet['A1'].font = bold_itatic_24_font

上面的代碼指定了等線24號加粗斜體,字體顏色紅色。直接使用cell的font屬性,將Font對象賦值給它。

對齊方式

也是直接使用cell的屬性aligment,這裡指定垂直居中和水平居中。除了center,還可以使用right、left等等參數。

# 設置B1中的數據垂直居中和水平居中
sheet['B1'].alignment = Alignment(horizontal='center', vertical='center')

設置行高和列寬

有時候數據太長顯示不完,就需要拉長拉高單元格。

# 第2行行高
sheet.row_dimensions[2].height = 40
# C列列寬
sheet.column_dimensions['C'].width = 30

合併和拆分單元格

所謂合併單元格,即以合併區域的左上角的那個單元格為基準,覆蓋其他單元格使之稱為一個大的單元格。

相反,拆分單元格後將這個大單元格的值返回到原來的左上角位置。

# 合併單元格, 往左上角寫入數據即可
sheet.merge_cells('B1:G1') # 合併一行中的幾個單元格
sheet.merge_cells('A1:C3') # 合併一個矩形區域中的單元格

合併後只可以往左上角寫入數據,也就是區間中:左邊的坐標。

如果這些要合併的單元格都有數據,只會保留左上角的數據,其他則丟棄。換句話說若合併前不是在左上角寫入數據,合併後單元格中不會有數據。

以下是拆分單元格的代碼。拆分後,值回到A1位置。

sheet.unmerge_cells('A1:C3')

這裡就拿常用的說,具體的去看openpyxl文檔


by @sunhaiyu

2017.6.29


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • /* 選擇工廠和更新工廠模式,這個模式的類(UpdateFactory和SelectionFactory類)就是用來創建SQL語句的. 因為涉及到之前學習的內容比較多,這裡就儘量將之前相關模式的示例代碼放在一起來進行學習和回顧了。 以下的代碼都是代碼片段而且涉及到連接資料庫,無法進行整體的調試(某些... ...
  • 動態規劃的演算法題往往都是各大公司筆試題的常客。在不少演算法類的微信公眾號中,關於“動態規劃”的文章屢見不鮮,都在試圖用最淺顯易懂的文字來描述講解動態規劃,甚至有的用漫畫來解釋,認真讀每一篇公眾號推送的文章實際上都能讀得懂,都能對動態規劃有一個大概瞭解。 什麼是動態規劃?通俗地理解來說,一個問題的解決辦 ...
  • 這是我寫的登陸註冊界面,使用tkinter,可以實現簡單的登陸和註冊賬號,使用的主要是Label,Entry和Button組件。 ...
  • 一、JavaCC JavaCC是java的compiler compiler。JavaCC是LL解析器生成器,可處理的語法範圍比較狹窄,但支持無限長的token超前掃描。 安裝過程: 我是從github上down下來的zip壓縮包,然後安裝了下ant, 然後通過ant安裝的javacc 1. 首先下 ...
  • 首先辨析“/”與“\” window中的路徑一般用“\”; java中的路徑一般用“/”;如果用“\”需要對其轉義成“\\” 1、絕對路徑 以根目錄作為參考點的的文件或文件夾所在的路徑,是硬碟上的真實路徑。具有唯一性的特點。 例如:C:\caosiege\python\project\C.py,代表 ...
  • 題目描述 設G為有n個頂點的有向無環圖,G中各頂點的編號為1到n,且當為G中的一條邊時有i < j。設w(i,j)為邊的長度,請設計演算法,計算圖G中<1,n>間的最長路徑。 輸入輸出格式 輸入格式: 輸入文件longest.in的第一行有兩個整數n和m,表示有n個頂點和m條邊,接下來m行中每行輸入3 ...
  • 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 鑽石 Diamond 題解 查看運行結果 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 鑽石 Diamond 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 鑽石 Diamond 時間限制: 1 ...
  • 目錄 tarnado tarnado源碼安裝 tarnado測試程式 application類的解析 一. tarnado簡介 最近在學習Python,無意間接觸到的tarnado,感覺tarnado還蠻好的那麼tarnado到底什麼呢?tarnado是由Python開發的一個非阻塞式web伺服器框 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...