Python操作excel表格


用Python操作Excel在工作中還是挺常用的,因為畢竟不懂Excel是一個用戶龐大的數據管理軟件

注:本篇代碼在Python3環境下運行

首先導入兩個模塊xlrd和xlwt,xlrd用來讀取Excel表格,xlwt是寫Excel表格

在命令提示行輸入命令:

  pip install xlrd

  pip install xlwt

下面我們學習一下這兩個模塊的使用

一、xlrd

1.首先導入模塊,import xlrd

2.先寫一個表用來實驗,表的內容是這樣的:

 

import xlrd

file_path = '1.xlsx'

xlrd.Book.encoding = "utf8" #設置編碼
data = xlrd.open_workbook(file_path)#打開文件
sheet_names = data.sheet_names()  #查看文件中包含sheet的名稱

獲取工作簿,有三種方式

# table = data.sheets()[0]
# table = data.sheet_by_name('Sheet1')
table = data.sheet_by_index(0) #取第一張工作簿(三種方法)

獲取總行數和總列數

rows_count = table.nrows #取總行數
cols_count = table.ncols#取總列數

 獲取第一行及第一列數據

row_data = table.row_values(0)#獲取第一行數據(數組)
col_data = table.col_values(0)#獲取第一列數據(數組)

獲取某個單元格的值

cell_data = row_data[0]  #取第0行第0列的值   戰士
cell_data_A1 = table.cell(1, 1).value  #取第1行第1列的值    李白

循環讀取所有數據

for row in range(0,rows_count):
    for col in range(0,cols_count):
        data1 = table.cell(row,col).value
        print(data1,end=' ')
    print('\n')

這是基本操作,下面擴展一點

關於時間格式:

  看一下取時間那一列數據,得到的什么 

['時間', 42993.0, '2017.01.12', 40900.0]

這並不是我們想要的,這個時間格式是Excel中,以1900年1月1日為起始時間,以天為單位的得到的數據

其實在這個模塊中,有個屬性可以顯示單元格數據的類型,ctype,有這幾種類型:

  ctype = 1 # 類型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error

 我們可以查看一下,它打印的這個是什么類型 

print(table.cell(1,6).ctype)#3
print(table.cell(2,6).ctype)#1
print(table.cell(3,6).ctype)#3

原來他能識別這是時間格式,那我們要處理一下了,讓他顯示格式化時間

可以用這條命令來轉換一下

date_value = xlrd.xldate_as_tuple(table.cell_value(1,6),data.datemode)

print(date_value)#(2017, 9, 15, 0, 0, 0)

這個格式就可以用了

from datetime import date,datetime

print(date(*date_value[:3]))#2017-09-15  

print(date(*date_value[:3]).strftime('%Y/%m/%d'))#2017/09/15

所以當我們循環讀取並打印數據的時候,可以做一個判斷,如果數據的ctype為3,就做這樣一個轉換

for row in range(0,rows_count):
    for col in range(0,cols_count):
        if (table.cell(row, col).ctype == 3):#如果讀到時間格式的數據,就轉換
            data_value = xlrd.xldate_as_tuple(table.cell_value(row, col), data.datemode)
            data1 = date(*data_value[:3]).strftime('%Y/%m/%d')
        else:
            data1 = table.cell(row,col).value
        print(data1,end=' ')
    print('\n')
戰士 刺客 法師 坦克 輔助 射手 時間 

老夫子 李白 甄姬 亞瑟 蔡文姬 魯班 2017/09/15 

楊戩 韓信 小喬 牛魔 大喬 狄仁傑 2017.01.12 

典韋 趙雲 妲己 鍾無艷 孫斌 虞姬 2011/12/23 

 

 

其實,xlrd也能實現簡單的修改數據,但是這只是臨時的修改,好像並沒有什么用

#簡單的寫入數據
row = 1
col = 0
ctype = 1 # 類型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
value = '1212'
xf = 0 # 擴展的格式化 (默認是0)
table.put_cell_unragged(row, col, ctype, value, xf)
table.put_cell(row, col, ctype, value, xf)#只是暫時的修改,而且只能是修改已有的數據

然后再讀取數據:

for row in range(0,rows_count):
    for col in range(0,cols_count):
        if (table.cell(row, col).ctype == 3):#如果讀到時間格式的數據,就轉換
            data_value = xlrd.xldate_as_tuple(table.cell_value(row, col), data.datemode)
            data1 = date(*data_value[:3]).strftime('%Y/%m/%d')
        else:
            data1 = table.cell(row,col).value
        print(data1,end=' ')
    print('\n')

拿到的結果就是修改了的,但是這只是臨時的,原表格並沒有修改

戰士 刺客 法師 坦克 輔助 射手 時間 

1212 李白 甄姬 亞瑟 蔡文姬 魯班 2017/09/15 

楊戩 韓信 小喬 牛魔 大喬 狄仁傑 2017.01.12 

典韋 趙雲 妲己 鍾無艷 孫斌 虞姬 2011/12/23 

 

關於合並的單元格的讀取

默認讀取合並的單元格的時候,只會在合並單元格出現的第一個位置有值,其他合並的位置 就是空了,我們可以拿到合並的單元格所在表中的位置

用一張新表,內容如下

 

workbook = xlrd.open_workbook('2.xlsx')
table2 = workbook.sheet_by_index(0) 
print(table2.merged_cells)#[(3, 5, 3, 4), (3, 5, 0, 1)]  讀取表中有合並單元格的位置
#merged_cells返回的這四個參數的含義是:(row,row_range,col,col_range),其中[row,row_range)
# 即(3, 5, 3, 4)的含義是:第3到4列(3,4)的第4到5行(3,5)合並,(3, 5, 0, 1)的含義是:第0到1列(0,1)的第4到5行(3,5)合並。
 





  

二、xlwt

1.導入模塊 import xlwt

2.創建工作簿,工作表

myWorkbook = xlwt.Workbook()#創建一個工作簿
mySheet = myWorkbook.add_sheet('A Test Sheet')#創建一個工作表

3.創建數據格式,寫入數據

myStyle = xlwt.easyxf('font: name Times New Roman, color-index red, bold on', num_format_str='#,##0.00')#數據格式
mySheet.write(3, 0,'abcd', myStyle)#寫數據的時候可以用這個格式,也可以不用
mySheet.write(2, 0, 1)#寫入A3,數值等於1
mySheet.write(2, 1, 1)#寫入B3,數值等於1
mySheet.write(2, 2, xlwt.Formula("A3+B3"))#寫入C3,數值等於2

4.保存

myWorkbook.save('test.xls')#保存

 


免責聲明!

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



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