欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python操作Excel工作簿的示例代碼(\*.xlsx)

 更新時(shí)間:2020年03月23日 14:44:09   作者:AlbertS  
這篇文章主要介紹了Python操作Excel工作簿的示例代碼(\*.xlsx),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

Excel 作為流行的個(gè)人計(jì)算機(jī)數(shù)據(jù)處理軟件,混跡于各個(gè)領(lǐng)域,在程序員這里也是常常被處理的對(duì)象,可以處理 Excel 格式文件的 Python 庫(kù)還是挺多的,比如 xlrd、xlwt、xlutils、openpyxl、xlwings 等等,但是每個(gè)庫(kù)處理 Excel 的方式不同,有些庫(kù)在處理時(shí)還會(huì)有一些局限性。

接下來(lái)對(duì)比一下幾個(gè)庫(kù)的不同,然后主要記錄一下 xlwings 這個(gè)庫(kù)的使用,目前這是個(gè)人感覺(jué)使用起來(lái)比較方便的一個(gè)庫(kù)了,其他的幾個(gè)庫(kù)在使用過(guò)程中總是有這樣或那樣的問(wèn)題,不過(guò)在特定情況下使用也是挺不錯(cuò)的。

EXCEL文件

Excel 被稱(chēng)為電子表格,其實(shí)際可以保存的格式分為很多種,但是“Excel 工作簿(*.xlsx)”和“Excel 97-2003 工作簿(*.xls)”是其中比較常用的兩種,可以認(rèn)為 .xls 格式的表格是 03版Excel 之前常用的格式,而 .xlsx 是 03版之后,一般指 07版Excel 之后常用的格式。

一般的 Excel 程序?qū)τ谏鲜龅膬煞N格式都可以打開(kāi)編輯,也可以相互轉(zhuǎn)化存儲(chǔ),不過(guò)還是建議在沒(méi)有特殊要求的情況下使用新版本的格式,一方面新的穩(wěn)定版本可能會(huì)修復(fù)之前的一些BUG,同時(shí)也會(huì)帶來(lái)進(jìn)行一些優(yōu)化。

我也是在寫(xiě)這篇總結(jié)之前才發(fā)現(xiàn),一個(gè)空的 .xlsx 格式的文件大小有 7KB,而一個(gè)空的 .xls 格式的文件大小有 24KB,當(dāng)我分別寫(xiě)入一個(gè)相同的漢字后,兩個(gè)文件大小變成了 10KB 和 30KB,差距還是不小的,還有一個(gè)問(wèn)題就是在將 .xlsx 格式的文件另存為 .xls 格式時(shí)還會(huì)有兼容性提示,提醒用戶(hù)有些設(shè)置可能會(huì)丟失,所以能選新版本還是盡量用新版本吧。

測(cè)試環(huán)境

因?yàn)楹芏鄳?yīng)用程序是不斷迭代的,相對(duì)應(yīng)的 Python 庫(kù)也是不斷迭代的,這里盡可能的給出版本號(hào),不同的版本可能會(huì)有不同的問(wèn)題:

  • 操作系統(tǒng): Windows 10 隨意版
  • Python: 3.75
  • xlrd: 1.2.0
  • xlwt: 1.3.0
  • xlutils: 2.0.0
  • openpyxl: 3.0.3
  • xlwings: 0.18.0

以上各個(gè)程序庫(kù)使用之前自行安裝就行,安裝方法就不贅述了,不過(guò)可以提供一個(gè)可以快速安裝鏡像源,使用 pip install -i https://pypi.doubanio.com/simple 庫(kù)名 可以盡可能解決下載安裝緩慢的問(wèn)題。

Excel具體操作

關(guān)于使用 Python 具體操作 Excel 的方法可以分為三組,配合使用 xlrd、xlwt、xlutils 操作作為第一組,使用庫(kù) openpyxl 作為第二組,而 xlwings 作為第三組,這篇總結(jié)重點(diǎn)總結(jié) xlwings 的使用,其他兩組簡(jiǎn)單了解。

xlrd、xlwt、xlutils

這一組操作 Excel 的庫(kù)名字很形象,一個(gè)讀、一個(gè)寫(xiě)、一個(gè)小工具,湊到一起就可以對(duì) Excel 肆意妄為了,下面做個(gè)小練習(xí),打開(kāi)一個(gè) Excel 文件然后修改第一個(gè)單元格的值,再另存為一個(gè)新文件,代碼如下:

import xlrd
import xlwt
import xlutils.copy

def save_as_new_file(file_name, new_file_name):
 # 打開(kāi)Excel文件
 rb = xlrd.open_workbook(file_name)
 # 創(chuàng)建一個(gè)可寫(xiě)入的副本
 wb = xlutils.copy.copy(rb)
 # 獲得第一個(gè)sheet頁(yè)簽
 ws = wb.get_sheet(0)
 # 第一個(gè)單元格寫(xiě)入測(cè)試值
 ws.write(0, 0, 'test value')
 # 另存為一個(gè)新文件
 wb.save(new_file_name)

上述代碼無(wú)論是操作 .xlsx 文件還是操作 .xls 文件都不會(huì)報(bào)錯(cuò),但是另存為的 .xlsx 格式的文件會(huì)打不開(kāi),同時(shí)你會(huì)發(fā)現(xiàn)正常存儲(chǔ)的 .xls 文件打開(kāi)后格式全都沒(méi)了,怎么辦,改個(gè)參數(shù)試試,將打開(kāi)文件的代碼修改如下:

rb = xlrd.open_workbook(file_name, formatting_info=True)

其中參數(shù) formatting_info=True 就表示打開(kāi)Excel時(shí)保留原有的格式,但是這是相對(duì)于 .xls 格式的文件,對(duì)于 .xlsx 格式的文件直接跑出異常 raise NotImplementedError("formatting_info=True not yet implemented"),就因?yàn)樘幚聿涣?.xlsx 格式的文件,我暫時(shí)沒(méi)有使用這幾個(gè)庫(kù)操作 Excel。

還有一點(diǎn),這幾個(gè)庫(kù)操作單元格時(shí),行和列的索引是從0開(kāi)始的。

openpyxl

首先說(shuō)這個(gè)庫(kù)主要用來(lái)操作 .xlsx 格式的文件,對(duì)于 .xls 格式的文件無(wú)法打開(kāi),會(huì)報(bào) openpyxl does not support the old .xls file format 這樣的錯(cuò)誤,但是可以存儲(chǔ)成這樣的格式,再次打開(kāi)時(shí)會(huì)有格式不匹配的警告,但是基礎(chǔ)的數(shù)據(jù)還在,所以還是優(yōu)先用來(lái)操作 .xls 格式的文件吧。

寫(xiě)一個(gè)新文件的常見(jiàn)用法:

from openpyxl import Workbook
from openpyxl import load_workbook
from openpyxl.styles import Font, Fill, Alignment, PatternFill

def write_new_excel(file_name):
 # 創(chuàng)建一個(gè)excel文檔
 wb = Workbook()
 # 獲得當(dāng)前激活的sheet對(duì)象
 ws = wb.active
 # 給A2單元格賦值
 ws['A2'] = 'This is A2 cell'
 # 一行添加多列數(shù)據(jù)
 ws.append([1, 2, 'hello'])
 # 添加新的sheet
 ws = wb.create_sheet(title='NewInfo',index=0)
 # 設(shè)置單元格的值
 ws['A1'] = 'This is new sheet'

 # 保存excel
 wb.save(file_name)

讀取和改寫(xiě)一個(gè)原有文件的常見(jiàn)用法:

def read_update_excel(file_name):
 # 加載Excel表
 wb = load_workbook(file_name)
 # 打印sheet數(shù)量
 print('sheet count:', len(wb.sheetnames))
 # 打印所有sheet名字
 print('sheet name list:', wb.sheetnames)
 # 獲取第一個(gè)sheet對(duì)象
 ws = wb[wb.sheetnames[0]]
 # 打印sheet表行數(shù)和列數(shù)
 print('rows count:', ws.max_row, 'cols count:', ws.max_column)
 # 更新單元格A1的內(nèi)容
 ws['A1'] = 'this is A1'
 # 在第二行位置插入一行
 ws.insert_rows(2)
 # 刪除第五行
 ws.delete_rows(5)
 # 獲取單元格對(duì)象,對(duì)應(yīng)B2單元格
 cell = ws.cell(2,2)
 # 設(shè)置單元格內(nèi)容
 cell.value = 'this is B2'
 # 修改字體格式為粗體
 cell.font = Font(bold=True)
 # 修改單元格格式
 cell.fill = PatternFill("solid", fgColor="F0CDCD")

 # 保存原文件或另存一個(gè)文件
 wb.save(file_name)

使用這個(gè)庫(kù)遇到的情況,存儲(chǔ)帶有樣式的數(shù)據(jù)沒(méi)有發(fā)現(xiàn)問(wèn)題,但是當(dāng)加入一個(gè)計(jì)算公式后,另存為一個(gè)文件時(shí)明顯文件尺寸變小了,但是數(shù)據(jù)和公式?jīng)]有發(fā)現(xiàn)有問(wèn)題。

有資料說(shuō)處理速度真的很慢,因?yàn)槲姨幚淼奈募容^小,但是沒(méi)有發(fā)現(xiàn)這方面的問(wèn)題,還有一個(gè)問(wèn)題就是說(shuō)Excel中的宏全部丟失,這個(gè)測(cè)試的時(shí)候確實(shí)是丟了,只不過(guò)這個(gè)好像和文件格式有關(guān),要想保存宏需要存儲(chǔ)為 .xlsm 格式,但是 openpyxl 使用來(lái)操作 .xlsx 文件的,存儲(chǔ)時(shí)會(huì)導(dǎo)致宏丟失,強(qiáng)行存儲(chǔ)為 .xlsm 格式會(huì)導(dǎo)致最終的文件打不開(kāi)。

還有一點(diǎn),這個(gè)庫(kù)操作單元格時(shí),行和列的索引是從1開(kāi)始的。

xlwings

這個(gè)庫(kù)在操作的首先要?jiǎng)?chuàng)建一個(gè) App,通過(guò)這個(gè)創(chuàng)建出來(lái)的 App 對(duì)象來(lái)操作 Excel,非常像把 Excel 的各種操作 api 封裝到一起,然后通過(guò)這個(gè) App 對(duì)象來(lái)調(diào)用,如果在創(chuàng)建 App 的時(shí)候不設(shè)置隱藏參數(shù),是會(huì)正常打開(kāi) Excel 程序的。

使用 xlwings 的基本方式:

import xlwings as xw

# 設(shè)置Excel程序不可見(jiàn)
app = xw.App(visible=False, add_book=False)

# 通過(guò) app 操作 Excel文件
# app.bala bala bala .....
# app.bala bala bala .....

# 優(yōu)雅的退出
app.quit()

創(chuàng)建一個(gè)新的 Excel 文件并寫(xiě)入數(shù)據(jù):

def write_new_excel(app, file_name):
 # 創(chuàng)建新的 Excel 表
 wb = app.books.add()
 # 獲取當(dāng)前活動(dòng)的sheet
 ws = wb.sheets.active
 # 初始化二維區(qū)域的值
 arr_data = [[1, 2, 3], [4, 5, 6], [7, 8, 'end']]
 # 設(shè)置到新建的Excel中
 ws.range('A1:B3').value=arr_data
 # 設(shè)置單獨(dú)一個(gè)單元格的值
 ws.range('A4').value='this is A4'
 # 設(shè)置單獨(dú)一個(gè)單元格的值
 ws[3,1].value='this is B4'
 # 保存Excel文件
 wb.save(file_name)
 wb.close()

需要注意的是通過(guò)行索引和列索引修改單元格時(shí),起始索引是0。

讀入已有 Excel 表格并修改

def read_update_excel(app, file_name):
 # 加載已有的表格
 load_wb = app.books.open(file_name)
 # 獲取Excel表中第一個(gè)sheet
 load_ws = load_wb.sheets[0]
 # 打印sheet的名字
 print(load_ws.name)
 # 根據(jù)sheet名字獲取sheet對(duì)象
 load_ws = load_wb.sheets[load_ws.name]
 # 獲取當(dāng)前活動(dòng)的sheet
 load_ws = load_wb.sheets.active

 # 獲取存在數(shù)據(jù)的行數(shù)和列數(shù)
 rows = load_ws.api.UsedRange.Rows.count
 cols = load_ws.api.UsedRange.Columns.count
 print('rows count:', rows, 'cols count:', cols)

 # 修改指定單元格數(shù)據(jù)(A1單元格)
 load_ws[0,0].value='this is A1'

 # 有空行或空列時(shí)獲取準(zhǔn)確的行列數(shù)量
 print(load_ws.used_range.shape)

 # 從A1單元格開(kāi)始擴(kuò)展到非空行空列,最后的行數(shù)和列數(shù)
 print((load_ws.range('A1').expand().last_cell.row,
  load_ws.range('A1').expand().last_cell.column))

 # 從A1單元格開(kāi)始擴(kuò)展到非空行空列,最后的行數(shù)和列數(shù)
 print((load_ws.range('A1').expand().last_cell.row,
  load_ws.range('A1').expand().last_cell.column))

 # 從A1單元格開(kāi)始擴(kuò)展到非空行空列,最后形狀
 print(load_ws.range(1,1).expand().shape)

 # 從A1單元格開(kāi)始擴(kuò)展到非空行空列,最后的行數(shù)和列數(shù)
 print((load_ws.range('A1').expand('table').rows.count,
  load_ws.range('A1').expand('table').columns.count))

 # 保存修改后的Excel
 load_wb.save(file_name)
 load_wb.close()

Excel 增加刪除行和列

def insert_delete_rowscols(app, file_name):
 # 加載已有的表格
 load_wb = app.books.open(file_name)
 # 獲取當(dāng)前活動(dòng)的sheet
 load_ws = load_wb.sheets.active

 # 從第2行開(kāi)始插入4行,也就是說(shuō)2-5行變成新插入的空行
 load_ws.api.rows('2:5').insert
 # 刪除第6行和第7行
 load_ws.api.rows('6:7').delete
 # 插入一個(gè)單元格,實(shí)際測(cè)試效果是B列從B2開(kāi)始向下移動(dòng),B2為新添加的單元格
 load_ws.range('B2').api.insert
 # 插入新的一列
 load_ws.api.columns('B').insert
 # 刪除一列
 load_ws.api.columns('C').delete

 # 保存修改后的Excel
 load_wb.save(file_name)
 load_wb.close()

單元格寬高查詢(xún)?cè)O(shè)置與合并

def cell_operation(app, file_name):
 # 加載已有的表格
 load_wb = app.books.open(FILE_PATH_ROOT + file_name)
 # 獲取當(dāng)前活動(dòng)的sheet
 load_ws = load_wb.sheets.active

 # 合并單元格
 load_ws.range('A2:A3').api.merge

 #獲取單元格
 cell = xw.Range('B2')
 # 打印單元格所在的行和列
 print("row is:", cell.row, "col is:", cell.column)

 # 打印當(dāng)前格子的高度和寬度
 print("cell.width:", cell.width, "cell.height:", cell.height)

 # 設(shè)置當(dāng)前格子的高度和寬度
 cell.row_height = 32
 cell.column_width = 64

 # 指定單元格的高度和寬度自適應(yīng)
 cell.columns.autofit()
 cell.rows.autofit()

 # 再次打印當(dāng)前格子的高度和寬度
 print("cell.width:", cell.width, "cell.height:", cell.height)

 # 保存修改后的Excel
 load_wb.save(file_name)
 load_wb.close()

幾個(gè)庫(kù)支持情況對(duì)比

雖然前面寫(xiě)了這么多方法,但是遇到一個(gè)實(shí)際的問(wèn)題時(shí)還是會(huì)猶豫,到底用哪種方式呢?下面做一個(gè)簡(jiǎn)單的對(duì)比,只是根據(jù)我做的實(shí)驗(yàn)來(lái)簡(jiǎn)單對(duì)比,如果有不準(zhǔn)確甚至是錯(cuò)誤的地方,歡迎大家指出來(lái),我會(huì)盡快改正的。

情景/庫(kù) xlrd、xlwt、xlutils openpyxl xlwings
讀取.xls 可以帶有樣式讀取 不支持 可以讀取
保存.xls 可以帶有樣式保存 可以保存,但是提示文件擴(kuò)展名不匹配,可以看到原始數(shù)據(jù) 可以保存,但是提示文件擴(kuò)展名不匹配,可以看到原始數(shù)據(jù)
讀取.xlsx 可以讀取,但沒(méi)有樣式 可以帶有樣式讀取 可以帶有樣式讀取
保存.xlsx 保存后打不開(kāi) 可以帶有樣式保存 可以帶有樣式保存
讀取.xlsm 可以讀取,但沒(méi)有樣式和宏 可以讀取,但沒(méi)有宏 可以讀取包含宏的表格
保存.xlsm 保存后打不開(kāi),存成 .xls 格式宏丟失 保存后打不開(kāi),存成 .xls想 格式宏丟失 存儲(chǔ)后宏還在
增刪行和列 沒(méi)有直接方法 支持 支持
另存后大小 .xls 文件沒(méi)有變化 .xlsx 文件會(huì)變小 .xls、.xlsx 文件沒(méi)有變化
使用建議 只操作.xls文件可以考慮 只操作.xlsx文件可以考慮,不能帶有宏 一個(gè)比較好的選擇,使用時(shí)感覺(jué)速度稍微有點(diǎn)慢

總結(jié)

  1. Excel 表格程序經(jīng)過(guò)版本的更替發(fā)生了很大的變化,出現(xiàn)了相同內(nèi)容時(shí) .xls 比 .xlsx 格式的文件大很多的情況
  2. 基于上一點(diǎn)考慮,如果能使用的新版的表格,那么就放棄舊的格式的吧
  3. 還有一個(gè)神奇的情況,一個(gè)帶有少量數(shù)據(jù)的 .xlsx 格式的表格要比一個(gè)空表格還要小,這是什么情況,暫時(shí)沒(méi)弄明白怎么回事,求知道的大神告知一二

到此這篇關(guān)于Python操作Excel工作簿的示例代碼(\*.xlsx)的文章就介紹到這了,更多相關(guān)Python操作Excel工作簿內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python利用re模塊實(shí)現(xiàn)簡(jiǎn)易分詞(tokenization)

    Python利用re模塊實(shí)現(xiàn)簡(jiǎn)易分詞(tokenization)

    分詞(tokenization)任務(wù)是Python字符串處理中最為常見(jiàn)任務(wù)了。本文將利用re模塊實(shí)現(xiàn)簡(jiǎn)易tokenizer,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-04-04
  • Python 3.x基于Xml數(shù)據(jù)的Http請(qǐng)求方法

    Python 3.x基于Xml數(shù)據(jù)的Http請(qǐng)求方法

    今天小編就為大家分享一篇Python 3.x基于Xml數(shù)據(jù)的Http請(qǐng)求方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Python網(wǎng)絡(luò)請(qǐng)求模塊urllib與requests使用介紹

    Python網(wǎng)絡(luò)請(qǐng)求模塊urllib與requests使用介紹

    網(wǎng)絡(luò)爬蟲(chóng)的第一步就是根據(jù)URL,獲取網(wǎng)頁(yè)的HTML信息。在Python3中,可以使用urllib和requests進(jìn)行網(wǎng)頁(yè)數(shù)據(jù)獲取,這篇文章主要介紹了Python網(wǎng)絡(luò)請(qǐng)求模塊urllib與requests使用
    2022-10-10
  • python實(shí)現(xiàn)網(wǎng)頁(yè)自動(dòng)簽到功能

    python實(shí)現(xiàn)網(wǎng)頁(yè)自動(dòng)簽到功能

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)網(wǎng)頁(yè)自動(dòng)簽到功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Python中實(shí)現(xiàn)定時(shí)任務(wù)常見(jiàn)的幾種方式

    Python中實(shí)現(xiàn)定時(shí)任務(wù)常見(jiàn)的幾種方式

    在Python中,實(shí)現(xiàn)定時(shí)任務(wù)是一個(gè)常見(jiàn)的需求,無(wú)論是在自動(dòng)化腳本、數(shù)據(jù)處理、系統(tǒng)監(jiān)控還是其他許多應(yīng)用場(chǎng)景中,Python提供了多種方法來(lái)實(shí)現(xiàn)定時(shí)任務(wù),包括使用標(biāo)準(zhǔn)庫(kù)、第三方庫(kù)以及系統(tǒng)級(jí)別的工具,本文將詳細(xì)介紹幾種常見(jiàn)的Python定時(shí)任務(wù)實(shí)現(xiàn)方式
    2024-08-08
  • python中with的具體用法

    python中with的具體用法

    本文主要介紹了python中with的基本使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • pandas.dataframe按行索引表達(dá)式選取方法

    pandas.dataframe按行索引表達(dá)式選取方法

    今天小編就為大家分享一篇pandas.dataframe按行索引表達(dá)式選取方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • python畫(huà)一個(gè)玫瑰和一個(gè)愛(ài)心

    python畫(huà)一個(gè)玫瑰和一個(gè)愛(ài)心

    這篇文章主要教大家用python畫(huà)一個(gè)玫瑰和一個(gè)愛(ài)心,作為女生節(jié)禮物,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 關(guān)于python中模塊和重載的問(wèn)題

    關(guān)于python中模塊和重載的問(wèn)題

    這篇文章主要介紹了python模塊和重載的問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • Python畫(huà)柱狀統(tǒng)計(jì)圖操作示例【基于matplotlib庫(kù)】

    Python畫(huà)柱狀統(tǒng)計(jì)圖操作示例【基于matplotlib庫(kù)】

    這篇文章主要介紹了Python畫(huà)柱狀統(tǒng)計(jì)圖操作,結(jié)合實(shí)例形式分析了Python基于matplotlib庫(kù)實(shí)現(xiàn)圖形繪制的相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07

最新評(píng)論