Python必學模塊之xlrd、xlwt模塊 (Excel文件處理)


一、介紹

python操作excel主要用到xlrd和xlwt兩個庫,即xlrd是讀excel,xlwt是寫excel庫

xlrd模塊:可讀取.xls、.xlsx表格

xlwt模塊:可寫入.xls表格(不可寫入.xlsx文件!!!

二、安裝方法

xlrd模塊和xlwt模塊不是內置模塊需要手動安裝

pip install xlrd
pip install xlwt

三、 excel表格描述

兩個模塊對excel表格的結構定義都非常直觀,和平時使用excel表格的習慣基本一致。

總體分爲三個級別:工作簿——工作表——單元格

  • 一個工作簿就是一個以.xls/.xlsx結尾的文件
  • 一個工作簿有多個工作表(sheet),可以通過索引或者名字訪問
  • 一個工作表包含多行、多列,行列交叉位置的基本單元就是單元格(cell),內容都寫入在單元格中。單元格可通過行、列索引訪問。

在python中將 工作簿——工作表——單元格,視爲對象

  • WorkBook:工作簿對象
  • Sheet:表單對象
  • Cell:表格對象

在這裏插入圖片描述

四、xlrd讀取excel文件

4.1 獲取WorkBook對象

workbook = xlrd.open_workbook(filename=None)

參數:filename爲要打開的電子表格文件的路徑。

返回值: 是xlrd.book.Book對象

4.1 xlrd操作sheet對象

一個Excel中可能有多個Sheet,那麼可以通過以下方法來獲取想要的Sheet信息

方法 功能
workbook.sheet_names() 獲取所有的sheet的名字,以列表形式存儲
workbook.sheet_by_index(1) 根據索引獲取sheet對象
workbook.sheets() 獲取所有的sheet對象
sheet.nrows 獲取指定sheet的所有行數
sheet.ncols 獲取指定sheet的所有列數
workbook.sheet_by_name(‘sheet’) 根據sheet名字獲取sheet對象

操作文件(成績表.xlsx):

在這裏插入圖片描述

代碼實例:

import xlrd

workbook = xlrd.open_workbook("成績表.xlsx")

# ================= sheet相關操作 =================
print(type(workbook))

# 獲取所有的sheet的名字
print(workbook.sheet_names())

# 根據索引獲取sheet對象
sheet1 = workbook.sheet_by_index(1)
print(type(sheet1))  # <class 'xlrd.sheet.Sheet'>
print(sheet1.name)  # 可以調用sheet對象的name屬性得到sheet名稱

# 獲取所有的sheet對象
sheet2 = workbook.sheets()
print(type(sheet2))  # <class 'list'>
for i in sheet2:
    print(i.name)

# 獲取指定sheet的行數和列數
sheet = workbook.sheet_by_index(0)
print({"總行數":sheet.nrows,"總列數":sheet.ncols})

4.2 xlrd操作cell對象

edu.csdn.net獲取Cell及其屬性:每個Cell代表的是表格中的一格。以下方法可以方便獲取想要的cell

方法 功能
sheet.cell(row,col) 獲取指定行和列的cell對象
sheet.row_slice(row,start_col,end_col) 獲取指定行的某幾列的cell對象。
sheet.col_slice(col,start_row,end_row) 獲取指定列的某幾行的cell對象。
sheet.cell_value(row,col) 獲取指定行和列的值。
sheet.row_values(row,start_col,end_col) 獲取指定行的某幾列的值,是sheet.row_slice的高級用法。
sheet.col_values(col,start_row,end_row) 獲取指定列的某幾行的值,是sheet.col_slice的高級用法。

代碼實例:


# ================= cell相關操作 =================
from xlrd.sheet import Cell

sheet = workbook.sheet_by_index(0)  # 獲取sheet

# 獲取指定行和列的cell對象
cell = sheet.cell(0,1)
print(type(cell))  # <class 'xlrd.sheet.Cell'>
print(cell)  # text:'語文' 得到的是一個鍵值對,可以通過value屬性獲取值


# 獲取指定行的某幾列的cell對象
cells = sheet.row_slice(1, 1, 4)
for cell in cells:
    print(cell.value)


# 獲取指定行的某幾列的值
print(sheet.row_values(1, 1, sheet.nrows))


# 獲取指定列的某幾行cell對象
cells = sheet.col_slice(0, 1, 5)
print(cells)  # [text:'李思聰', text:'李健林', text:'馬風', text:'張小某']
print(type(cells))
for cell in cells:
    print(cell.value)

# 獲取指定列的某幾行的值
cells = sheet.col_values(0, 1, 5)
print(cells)  # ['李思聰', '李健林', '馬風', '張小某']

# 獲取指定行和列的值。
print(sheet.cell_value(1,2))

Cell的數據類型

方法 描述 返回值
xlrd.XL_CELL_TEXT(Text) 文本類型 1
xlrd.XL_CELL_NUMBER(Number) 數值類型 2
xlrd.XL_CELL_DATE(Date) 日期時間類型 3
xlrd.XL_CELL_BOOLEAN(Bool) 布爾類型 4
xlrd.XL_CELL_EMPTY 空白數據類型 0

代碼實例:

# ================= cell數值類型 =================

sheet = workbook.sheet_by_index(0)  # 獲取sheet

# 文本類型
cell = sheet.cell(0, 0)  # 對應1A
print(cell.ctype)   # ctype是Python的外部函數庫。它提供了C兼容的數據類型
print(xlrd.XL_CELL_TEXT)  # 返回值爲 1 


# 數值類型
cell = sheet.cell(1, 2)  # 對應2C
print(cell.ctype)   
print(xlrd.XL_CELL_NUMBER)  # 返回值爲2


# 日期時間類型
cell = sheet.cell(9, 1)  # 對應10B
print(cell.ctype)   
print(xlrd.XL_CELL_DATE)  # 3


# 布爾值類型
cell = sheet.cell(8, 1)  # 對應9B
print(cell.ctype)   
print(xlrd.XL_CELL_BOOLEAN)  # 4


# 空白數據類型
cell = sheet.cell(1, 1)  # 對應2B
print(cell.ctype)
print(xlrd.XL_CELL_EMPTY)  #返回值爲 0

五、xlwt寫入excel文件

5.1 簡單操作步驟

  1. 導入xlwt模塊。

    import xlwt
    
  2. 創建一個Workbook對象。

    workbook = xlwt.Workbook(encoding='utf-8') #創建workbook 對象
    
  3. 創建一個Sheet對象。

    mySheet = myWorkbook.add_sheet("班級1")
    
  4. 把數據寫入到Sheet下指定行和列中。如果想要在原來workbook對象上添加新的cell,那麼需 要調用put_cell來添加。

    worksheet.write(0, 0, 'hello') #往表中寫內容,第一各參數 行,第二個參數列,第三個參數內容
    
  5. 保存成Excel文件

    myWorkbook.save("成績表1.xls") # 將其命名並保存到本地
    

5.2 常用API參考

Workbook對象

xlwt.Workbook(encoding=‘ascii’, style_compression=0)

  • encoding:設置字符編碼,默認爲 ascii,替換成utf-8, excel中輸出中文 。
  • style_compression: 表示是否壓縮,不常用 。

Workbook對象常用方法

方法 參數 返回值 功能
add_sheet(sheetname,cell_overwrite_ok = False ) sheetname –用於此工作表的名稱cell_overwrite_ok 表示是否可以覆蓋單元格,默認爲False 添加到Worksheet對象中 在工作簿中創建工作表
save(filename_or_stream ) filename_or_stream –是包含文件名的字符串,將使用提供的名稱將excel文件保存(寫入)到磁盤。 將工作簿保存爲本地Excel格式的文件

Workbook屬性

屬性 功能
Owner 設置文檔所有者
country_code 國家碼
wnd_protect 窗口保護
backup_on_save 保存時備份
tabs_visible tab是否可見
dates_1904 是否使用1904日期系統
use_cell_values 單元格的值
default_style 默認樣式
colour_RGB 顏色
vscroll_visible 縱向滾動條是否可見
hscroll_visible 橫向滾動條是否可見
wnd_mini 窗口最小化
wnd_visible 窗口是否可見
tab_width tab寬度
active_sheet 活動sheet
Height 高度
Width 寬度
Hpos 橫座標
Vpos 縱座標
Protect 保護
obj_protect 對象保護

簡單實例:

'''
設置國家碼
'''
import xlwt
myWorkbook = xlwt.Workbook(encoding='utf-8')

myWorkbook.country_code = 86
ws = myWorkbook.add_sheet('CN')
myWorkbook.save('country.xls')

關於國家代碼查看 :國家代號(CountryCode)

5.3 代碼實例

#導入模塊
import xlwt

# 創建excel工作薄
myWorkbook = xlwt.Workbook()

# 添加Excel工作表
mySheet = myWorkbook.add_sheet("班級1")

# 寫入字段名
headers = ['學生','語文','英語','數學']
student_scores = [
    ('王五',98,78,67),
    ('張三',56,76,32),
    ('李四',78,34,98)
]

# 通過列寫入內容
for cols, header in enumerate(headers):
    mySheet.write(0, cols, header)

# 通過行寫入內容
for row, scores in enumerate(student_scores):
    for cols, score in enumerate(scores):
        mySheet.write(row+1, cols, score)

myWorkbook.save("成績表1.xls")

5.4 給excel設置樣式

1. 創建一個表,得到一個worksheet對象

import xlwt

myWorkbook = xlwt.Workbook(encoding='utf-8')
myWorksheet = myWorkbook.add_sheet('sheet1')
print(type(myWorksheet))  # <class 'xlwt.Worksheet.Worksheet'>

2. 設置列寬,cols_num是列的數目

# 設置列寬,cols_num是列的數目,可以通過修改10這個值,修改列的寬度
# width = 256 * 10    256爲衡量單位,20表示20個字符寬度
cols_num = 10
for c in range(cols_num):  # 10爲cols_num長度
    myWorksheet.col(c).width = 256 * 10

3. 設置行高

# 設置行高
myWorksheet.row(0).height_mismatch = True   # 設置爲True,修改行高才生效
myWorksheet.row(0).height = 500  # 設置行高

4. 設置excel單元格風格

 # 設置excel單元格風格
def body_style(pattern=None):

    style = xlwt.XFStyle()  # Create Style

    # 設置字體樣式
    font = xlwt.Font()  # Create Font
    font.name = "SimSun"  # 宋體
    font.height = 20 * 12  # 字體大小

    # 設置單元格樣式
    style.alignment.vert = style.alignment.VERT_BOTTOM  # 垂直居中
    style.alignment.horz = style.alignment.HORZ_CENTER  # 水平居中
    style.alignment.wrap = style.alignment.WRAP_AT_RIGHT  # 自動換行

    # 設置單元格背景
    if pattern:
        pattern = xlwt.Pattern()  # Create Pattern
        pattern.pattern = pattern.SOLID_PATTERN  # 設置背景顏色
        pattern.pattern_fore_colour = 5  # May be: 8 through 63. 0 = Black, 1 = White, 2 = Red, 3 = Green, 4 = Blue, 5 = Yellow, 6 = Magenta, 7 = Cyan, 16 = Maroon, 17 = Dark Green, 18 = Dark Blue, 19 = Dark Yellow , almost brown), 20 = Dark Magenta, 21 = Teal, 22 = Light Gray, 23 = Dark Gray, the list goes on...
        pattern.pattern_back_colour = 4
        style.pattern = pattern

    # 設置邊框樣式
    borders = xlwt.Borders()  # Pattern Borders

    borders.right = borders.NO_LINE  # 默認沒有邊框,NO_LINE
    borders.top = borders.THIN   # 薄邊框
    borders.bottom = borders.MEDIUM  # 虛線邊框
    borders.left = borders.THICK  # 厚邊框

    borders.left_colour = 0x90  # 邊框上色
    borders.right_colour = 0x90
    borders.top_colour = 0x90
    borders.bottom_colour = 0x90

    style.font = font  # 樣式賦值
    style.borders = borders
    return style

cell_styles = body_style()

5. 往單元格內寫入數據

headers = ['學生','語文','英語','數學']

for cols, header in enumerate(headers):
    myWorksheet.write(0, cols, header, style=cell_styles)

wwb.save('有樣式的excel.xls') # 將wSheet內容保存到本地

在這裏插入圖片描述

6. 補充

# coding=utf-8
import xlwt

workbook = xlwt.Workbook(encoding='utf-8')
worksheet = workbook.add_sheet('sheet1')

for i in range(0, 128):
        stylei = xlwt.XFStyle()
        patterni = xlwt.Pattern()
        patterni.pattern = 1
        # 設置底紋的圖案索引,1爲實心,2爲50%灰色,對應爲excel文件單元格格式中填充中的圖案樣式
        patterni.pattern_fore_colour = i    # 設置底紋的前景色,對應爲excel文件單元格格式中填充中的背景色
        patterni.pattern_back_colour = 35   # 設置底紋的背景色,對應爲excel文件單元格格式中填充中的圖案顏色
        stylei.pattern = patterni           # 爲樣式設置圖案
        worksheet.write(i, 0, i, stylei)

workbook.save('file.xls')

在設置字體顏色或者單元格背景顏色的時候,可以使用源碼中0x0D參數來代表不同的顏色,也可以用0-127來表示不同的顏色。

六、修改excel文件

6.1 簡單操作步驟

  1. 讀取源excel文件
  2. 在讀取的sheet中通過put_cell()進行修改
  3. 重新創建一個excel文件,把讀取到的數據寫入到新文件中

6.2 代碼實例

在這裏插入圖片描述

''''

目的:
1、獲取學生成績總分
2、獲取科目成績平均分

'''

import xlrd
import xlwt


myWorkbook = xlrd.open_workbook("成績表.xlsx")
rsheet = myWorkbook.sheet_by_name('1班')

#  獲得同學的總分
# 通過put_cell修改單元格,往標題欄增加 總分 字段

r_nrows = rsheet.nrows  # 總行數
r_ncols = rsheet.ncols  # 總列數

rsheet.put_cell(0, r_ncols,xlrd.XL_CELL_TEXT,'總分',None)

for row in range(1, r_nrows):
    grades = rsheet.row_values(row, 1, r_ncols)
    total = sum(grades)  # 得到同學總分
    rsheet.put_cell(row, 4, xlrd.XL_CELL_NUMBER,total,None)  # 寫入成績到內存


# 得到科目平均分
rsheet.put_cell(rsheet.nrows, 0, xlrd.XL_CELL_TEXT,'平均分',None)

for col in range(1, r_ncols+1):
    grades = rsheet.col_values(col, 1, r_nrows)
    avg = sum(grades) / len(grades)  # 得到平均分
    rsheet.put_cell(r_nrows, col, xlrd.XL_CELL_NUMBER, avg, None)  # 寫入成績到內存




# 創建excel工作薄,並將修改內容寫入到新文件中
#
wwb = xlwt.Workbook()
wSheet = wwb.add_sheet("班級1",)

w_nrows = rsheet.nrows
w_ncols = rsheet.ncols

for row in range(0,w_nrows):
    for cols in range(0,w_ncols):
        wSheet.write(row, cols, rsheet.cell_value(row,cols))  # 從內存中獲取成績並寫入wSheet中

wwb.save('abc.xls') # 將wSheet內容保存到本地

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章