Python如何讀寫Excel文件-使用xlrd/xlwt模塊


  • 時間: 2020-08-18 整理: qiyuan

安裝和導入

1.模塊介紹

在 python 中使用 xlrd/xlwt 和 openpyxl 模塊可以對Excel電子表格(xls、xlsx文件)進行讀寫等操作. 本篇以 python3 為基礎,以 xlrd/xlwt 模塊為“學習和研究”對象,對 xlrd/xlwt 中常見的用法進行梳理和記錄.

2.模塊安裝

pip install xlrd
pip install xlwt

3.模塊導入

import xlrd
import xlwt

xlrd模塊

1.語法說明

import xlrd  # 導入xlrd模塊

1.打開excel文件,獲取文件內容
excel = '/Users/usr/Downloads/TEMP/DVT.xlsx'
data = xlrd.open_workbook(excel)
data.nsheets  # 獲取該excel文件中包含的sheet的數量
data.sheets()  # 返回該excel文件中所有sheet對象組成的列表
data.sheet_names()  # 返回該excel文件中所有sheet名稱組成的列表
data.sheet_names()[index]  # 獲取excel文件中指定索引的sheet的名稱
data.sheet_loaded(sheet_name or index)  # 檢查某個sheet是否導入完畢

2.獲取某個sheet數據
table = data.sheets()[index]  # 根據sheet索引獲取sheet內容
table = data.sheet_by_index(index)  # 根據sheet索引獲取sheet內容
table = data.sheet_by_name(sheet_name)  # 根據sheet名稱獲取sheet內容
table.name  # 獲取sheet名稱

3.操作行、列、單元格
# 行的操作
table.nrows     # 獲取該sheet中的有效行數
table.row(rowx)    # 返回由該行中所有單元格對象組成的列表
table.row_slice(rowx)  # 返回由該列中所有的單元格對象組成的列表
table.row_types(rowx,start_colx=0,end_colx=None)  # 返回由該行中所有單元格的數據類型組成的列表
table.row_values(rowx,start_colx=0, end_colx=None)  # 返回由該行中所有單元格數據組成的列表
table.row_len(rowx)  # 返回該列的有效單元格長度

# 列的操作
table.ncols     # 獲取該sheet中的有效列數
table.col(colx,start_rowx=0,end_rowx=None)
table.col_slice(colx,start_rowx=0,end_rowx=None)
table.col_types(colx,start_rowx=0,end_rows=None)
table.col_values(colx,start_rowx=0,end_rows=None)

# 單元格的操作
table.cell(rowx,colx)  # 返回單元格對象
table.cell_value(rowx,colx)  # 返回單元格中的數據
table.cell(rowx,colx).value
table.row(rowx)[index].value
table.col(colx)[index].value
table.cell_type(rowx,colx)  # 返回單元格中的數據類型
sheet2.cell(rowx,colx).ctype
table.row(rowx)[index].ctype
table.col(colx)[index].ctype

4.獲取單元格內容為特定類型方式
# ctype: 0 empty,1 string,2 number,3 date,4 boolean,5 error,6 blank
# 獲取單元格內容為date格式
from datetime import datetime,date
if sheet1.cell(3,6).ctype == 3:
    cell_value = sheet1.cell(3,6).value)
    date_value = xlrd.xldate_as_tuple(cell_value, data.datemode)
    date_value_str = date(*data_value[:3])
    date_value_str = date(*data_value[:3]).strftime('%Y/%m/%d')
# 獲取單元格內容為number(int)格式   
if sheet1.cell(3,5).ctype == 2:
    cell_value = sheet1.cell(3,5).value
    num_value = int(cell_value)

5.獲取合並單元格的內容
data = xlrd.open_workbook(filename, formattinng_info=True)
sheet1 = data.sheet_by_name('OTA_02')
sheet1.merged_cells
# 返回: (row,row_range,col,col_range)
# 總結規律: 獲取merge_cells返回的row和col的低位索引即可
merge_value = []
for (row,row_range,col,col_range) in sheet1.merged_cells:
    merge_value.append((row,col))
print(merge_value)
for v in merge_value:
    cell_value = sheet1.cell(v[0],v[1]).value
    print(cell_value)

6.打開包含中文字符的文件名和sheet名時報錯的解決辦法
# 1.使用open()函數,xlrd.open_workbook()函數打開文件,文件名若包含中文,會報錯找不到這個文件或目錄
# 2.獲取sheet時,若包含中文,也會報錯
file = open(filename,'rb') # 打開文件
workbook = xlrd.open_workbook(filename)  # 打開excel文件
sheet = workbook.sheet_by_name(sheetname)  # 獲取sheet
# 解決方案:
# a.對參數進行轉碼即可,如:
filename = filename.decode('utf-8')
# b.也試過unicode函數,不過,在ride中運行時出現了報錯,不推薦
filename = unicode(filename,'utf-8')

2.示例

BOOK_LIST.xlsx : Sheet1

使用 xlrd 模塊讀取表格內容:

# -*- coding: utf-8 -*-
import xlrd
from datetime import datetime, date

def read_excel():
    data = xlrd.open_workbook(r'/media/psf/Home/Downloads/TEMP/BOOK_LIST.xlsx')
    print('Sheet列表:', data.sheet_names(), '數量:', data.nsheets)
    table = data.sheets()[0]
    # table = data.sheet_by_index(0)
    # table = data.sheet_by_name('Sheet1')

    print('Sheet名稱:', table.name, '行數:', table.nrows, '列數:', table.ncols)

    print('-------- 按行顯示Sheet內容: --------')
    for rowx in range(0, table.nrows):
        print('第{}行:'.format(rowx + 1), table.row_values(rowx))
        # print('第{}行:'.format(rowx + 1), table.row_types(rowx))

    print('-------- 按列顯示Sheet內容: --------')
    for colx in range(0, table.ncols):
        print('第{}列:'.format(colx + 1), table.col_values(colx))
        # print('第{}列:'.format(colx + 1), table.col_types(colx))

    print('-------- 按行顯示Sheet所有單元格對象: --------')
    for rowx in range(0, table.nrows):
        print('第{}行:'.format(rowx + 1), table.row(rowx))

    print('-------- 按列顯示Sheet所有單元格對象: --------')
    for colx in range(0, table.ncols):
        print('第{}列:'.format(colx + 1), table.col(colx))

    print('-------- 獲取合並單元格內容: --------')
    # 獲取合並單元格內容
    print('合並單元格的索引和范圍:', table.merged_cells)
    for (rowx,row_range,colx,col_range) in table.merged_cells:
        print('合並單元格的內容:',table.cell(rowx,colx).value,'(','合並單元格寬:',col_range,'高:',row_range,')')

    print('-------- 獲取/轉換單元格內容為特定類型: --------')
    # 獲取單元格內容為int類型
    print('轉換前:', table.col(0,1,None))
    print('轉換后', end=': ')
    for cellobj in table.col(0,1,None):
        if cellobj.ctype == 2:
            cell_value = cellobj.value
            num_value = int(cell_value)
            print(num_value, end=', ')
        else:
            print(cellobj.value, end=', ')

    print('')

    # 獲取單元格內容為date格式
    print('轉換前:', table.col(6,1,None))
    print('轉換后', end=': ')
    for cellobj in table.col(6,1,None):
        if cellobj.ctype == 3:
            cell_value = cellobj.value
            date_value = xlrd.xldate_as_tuple(cell_value, data.datemode)
            data_value_obj = date(*date_value[:3])
            data_value_str = date(*date_value[:3]).strftime('%Y/%m/%d')
            print(data_value_str,end=', ')
        else:
            print(cellobj.value, end=', ')

if __name__ == '__main__':
    read_excel()
View Code

運行結果:

(提示: 如果圖片不清晰影響閱讀,可鼠標右鍵點擊圖片選擇 ‘在新標簽頁中打開圖片’ 查看高清大圖,或選擇 ‘圖片存儲為...’ 到本地查看)

 

xlwt模塊

1.語法說明

import xlwt  # 導入模塊

1.創建Workbook對象
wb = xlwt.Workbook()

2.新增sheet
ws = wb.add_sheet('sheet')
ws = wb.add_sheet('聯系人', cell_overwrite_ok=True)

3.寫入數據
ws.write(0,0,'Hello')
ws.write(2,0,100)
ws.write(2,1,200)
ws.write(2,2,xlwt.Formula("A3+B3"))
ws.write(4,2,'技術部')
ws.write(4,5,'186777233')
ws.write(4,6,'wangwu@163.com')
ws.write_merge(21,21,0,1,u'Summary')  # 合並單元格

4.設定單元格樣式、列寬
ws.col(0).width = 200*30

5.保存工作薄
wb.save('/Users/usr/Downloads/TEMP/example.xls')

2.示例

BOOK_LIST.xlsx : Sheet2

使用 xlwt 模塊創建新的表格並寫入數據:

# -*- coding: utf-8 -*-
import xlwt
from datetime import datetime,date

def set_style(name,height,bold=False):
    style = xlwt,XFStyle()
    
    font = xlwt.Font()
    font.name = name
    font.blod = blod
    font.color_index = 4
    font.height = height
    
    # borders = xlwt.Borders()
    # borsers.left = 6
    # borders.right = 6
    # borders.top = 6
    # borders.bottom = 6
    
    style.font = font
    # style.borders = borders
    
    return style

def write_excel():
    f = xlwt.Workbook()
    
    sheet1 = f.add_sheet(u'sheet1',cell_voerwrite_ok=True)
    row0 = [u'業務',u'狀態',u'北京',u'上海',u'廣州',u'深圳',u'狀態小計',u'合計']
    columnn0 = [u'機票',u'船票',u'火車票',u'汽車票',u'其它']
    status = [u'預訂',u'出票',u'退票',u'業務小計']
    
    for i in range(0,len(row0)):
        sheet1.write(0,i,row0[i],set_style('Times New Roman', 220, True))
        
    i,j = 1,0
    while i < 4*len(column0) and j < len(column0):
        sheet1.write_merge(i,i+3,0,0,column[j],set_style('Arial',220,True))
        sheet1.write_merge(i,i+3,7,7)
        i += 4
        j += 1
    sheet1.write_merage(21,21,0,1,u'合計',set_style('Times New Roman',220,True))
    
    i = 0
    while i < 4*len(column0):
        for j in range(0,len(status)):
            sheet1.write(j+i+1,1,status[j])
        i += 4
        
    f.save('demo1.xlsx')
    
if __name__ == '__main__':
    write_excel()
View Code

 

--the end--


免責聲明!

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



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