使用python中的openpyxl操作excel詳解
python操作excel方法
1)自身有Win32 COM操作office但講不清楚,可能不支持夸平臺(tái),linux是否能用不清楚,其他有專業(yè)處理模塊,如下
2)xlrd:(讀excel)表,xlrd讀大表效率高于openpyxl
3)xlwt:(寫excel)表,
xlrd和xlwt對(duì)版本上兼容不太好,很多新版excel有問題。
新版excel處理:
openpyxl(可讀寫excel表)專門處理Excel2007及以上版本產(chǎn)生的xlsx文件,xls和xlsx之間轉(zhuǎn)換容易
注意:如果文字編碼是“gb2312” 讀取后就會(huì)顯示亂碼,請(qǐng)先轉(zhuǎn)成Unicode
安裝openpyxl
1)下載openpyxl模塊:https://pypi.python.org/pypi/openpyxl
2)解壓到指定文件目錄:tar -xzvf openpyxl.tar.gz
3)進(jìn)入目錄,找到setup.py文件,執(zhí)行命令:python setup.py install
如果報(bào)錯(cuò)No module named setuptools 就使用命令“easy_install openpyxl”,easy_install for win32,會(huì)自動(dòng)安裝setuptools。
這里注意,如果不能自動(dòng)安裝,基本上python的模塊都通過命令 python 模塊名.py install 來安裝,如果setuptools模塊沒有,直接去官網(wǎng)下載,然后前面命令安裝就可以了
4)處理圖片還需要安裝pillow(PIL)
To be able to include images (jpeg, png, bmp,...) into an openpyxl file, you will also need the “pillow” library that can be installed with:
pip install pillow
openpyxl的使用
openpyxl定義多種數(shù)據(jù)格式
最重要的三種:
NULL空值:對(duì)應(yīng)于python中的None,表示這個(gè)cell里面沒有數(shù)據(jù)。
numberic: 數(shù)字型,統(tǒng)一按照浮點(diǎn)數(shù)來進(jìn)行處理。對(duì)應(yīng)于python中的float。
string: 字符串型,對(duì)應(yīng)于python中的unicode。
Excel文件三個(gè)對(duì)象
workbook: 工作簿,一個(gè)excel文件包含多個(gè)sheet。
sheet:工作表,一個(gè)workbook有多個(gè),表名識(shí)別,如“sheet1”,“sheet2”等。
cell: 單元格,存儲(chǔ)數(shù)據(jù)對(duì)象
1)導(dǎo)入
from openpyxl import Workbook from openpyxl import load_workbook from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font, Color, Fill from openpyxl.styles import colors from openpyxl.styles import Fill,fills from openpyxl.formatting.rule import ColorScaleRule
2)打開workbook:
wb = load_workbook('file_name.xlsx')
3)open sheet:
通過名字 ws = wb["frequency"] 等同于 ws2 = wb.get_sheet_by_name('frequency') 驗(yàn)證命令ws is ws2 is ws3 輸出True 不知道名字用index sheet_names = wb.get_sheet_names() ws = wb.get_sheet_by_name(sheet_names[index])# index為0為第一張表 或者 ws =wb.active 等同于 ws = wb.get_active_sheet() #通過_active_sheet_index設(shè)定讀取的表,默認(rèn)0讀第一個(gè)表 活動(dòng)表表名wb.get_active_sheet().title
4)建新表
ws1 = wb.create_sheet() #默認(rèn)插在最后 ws2 = wb.create_sheet(0) #插在開頭 建表后默認(rèn)名按順序,如sheet1,sheet2... ws.title = "New Title" #修改表名稱 簡(jiǎn)化 ws2 = wb.create_sheet(title="Pi")
5)backgroud color of tab( be white by default)
ws.sheet_properties.tabColor = "1072BA" # set with RRGGBB color code
6)單元格使用
c = ws['A4'] #read 等同于 c = ws.cell('A4') ws['A4'] = 4 #write #ws.cell有兩種方式,行號(hào)列號(hào)從1開始 d = ws.cell(row = 4, column = 2) #行列讀寫 d = ws.cell('A4') 寫入cell值 ws.cell(row = 4, column = 2).value = 'test' ws.cell(row = 4, column = 2, value = 'test')
7)訪問多個(gè)單元格
cell_range = ws['A1':'C2'] 讀所有單元格數(shù)據(jù) get_cell_collection()
8) 按行操作,按列操作
a)逐行讀 ws.iter_rows(range_string=None, row_offset=0, column_offset=0): range-string(string)-單元格的范圍:例如('A1:C4') row_offset-添加行 column_offset-添加列 返回一個(gè)生成器, 注意取值時(shí)要用value,例如: for row in ws.iter_rows('A1:C2'): for cell in row: print cell 讀指定行、指定列: rows=ws.rows#row是可迭代的 columns=ws.columns#column是可迭代的 打印第n行數(shù)據(jù) print rows[n]#不需要用.value print columns[n]#不需要用.value b)逐行寫 (http://openpyxl.readthedocs.io/en/default/_modules/openpyxl/worksheet/worksheet.html#Worksheet.append) ws.append(iterable) 添加一行到當(dāng)前sheet的最底部 iterable必須是list,tuple,dict,range,generator類型的。 1,如果是list,將list從頭到尾順序添加。 2,如果是dict,按照相應(yīng)的鍵添加相應(yīng)的鍵值。 append([‘This is A1', ‘This is B1', ‘This is C1']) append({‘A' : ‘This is A1', ‘C' : ‘This is C1'}) append({1 : ‘This is A1', 3 : ‘This is C1'})
8) #顯示有多少張表
wb.get_sheet_names() #顯示表名,表行數(shù),表列數(shù) print ws.title print ws.max_row print ws.max_column ws.get_highest_row() #UserWarning: Call to deprecated function ws.get_highest_column()# UserWarning: Call to deprecated function
9) 獲得列號(hào)x的字母 col = get_column_letter(x), x從1開始
from openpyxl.utils import get_column_letter for x in range( 1, len(record)+ 1 ): col = get_column_letter(x) ws.cell( '%s%s' %(col, i)).value = x 通過列字母獲取多個(gè)excel數(shù)據(jù)塊 cell_range = "E3:{0}28".format(get_column_letter(bc_col)) ws["A1"] = "=SUM(%s)"%cell_range
10)excel文件是gbk編碼,讀入時(shí)需要先encode為gbk,再decode為unicode,再encode為utf8
cell_value.encode('gbk').decode('gbk').encode('utf8')
11) 公式計(jì)算formulae
ws["A1"] = "=SUM(1, 1)" ws["A1"] = "=SUM(B1:C1)"
代碼實(shí)例實(shí)例(直接修改使用)
from openpyxl import Workbook from openpyxl.compat import range from openpyxl.cell import get_column_letter dest_filename = 'empty_book.xlsx' wb = Workbook() ws1 = wb.active ws1.title = "range names" for row in range(1, 40): ws1.append(range(600)) ws3 = wb.create_sheet(title="Data") for row in range(10, 20): for col in range(27, 54): _ = ws3.cell(column=col, row=row, value="%s" % get_column_letter(col)) print(ws3['AA10'].value) wb.save(filename = dest_filename) sheet_ranges = wb['range names'] print(sheet_ranges['D18'].value) ws['A1'] = datetime.datetime(2010, 7, 21) ws['A1'].number_format #輸出'yyyy-mm-dd h:mm:ss' rows = [ ['Number', 'Batch 1', 'Batch 2'], [2, 40, 30], [3, 40, 25], [4, 50, 30], [5, 30, 10], [6, 25, 5], [7, 50, 10], ] rows = [ ['Date', 'Batch 1', 'Batch 2', 'Batch 3'], [date(2015,9, 1), 40, 30, 25], [date(2015,9, 2), 40, 25, 30], [date(2015,9, 3), 50, 30, 45], [date(2015,9, 4), 30, 25, 40], [date(2015,9, 5), 25, 35, 30], [date(2015,9, 6), 20, 40, 35], ] for row in rows: ws.append(row)
excel中圖片的處理,PIL模塊
try: from openpyxl.drawing import image import PIL except ImportError, e: print "[ERROR]",e report_file = self.excel_path + "/frquency_report_%d.xlsx" %id shutil.copyfile(configs.PATTEN_FILE, report_file) if not os.path.exists(report_file): print "generate file failed: ", report_file sys.exit(1) wb = load_workbook(report_file) ws = wb.get_sheet_by_name('frequency') img_f = configs.IMAGE_LOGO if os.path.exists(img_f): try: img = image.Image(img_f) ws.add_image(img, 'A1') except Exception, e: print "[ERROR]%s:%s" % (type(e), e) ws['A1'] = "程序化營銷平臺(tái)" else: ws['A1'] = "程序化營銷平臺(tái)" font1 = Font(size=22) ws['A1'].font = font1 ws['B4'] = ad_plan #等同ws.cell('B4') = ad_plan ws['B5'] = ad_names ws['B6'] = str(start_d) + ' to ' + str(end_d) wb.save(report_file) try: wb = load_workbook(report_file) ws = wb.get_sheet_by_name('frequency') row = 9 for it in query_result: one_row = it.split('\t') print one_row if '10' == one_row[0]: one_row[0] = '10+' col = 1 for one_cell in one_row: ws.cell(row = row, column = col).value = one_cell col = col + 1 row = row + 1 except Thrift.TException, tx: print '[ERROR] %s' % (tx.message) else: wb.save(report_file) finally: pass
示例:
from openpyxl.writer.excel import ExcelWriter wb1=Workbook()#新建工作簿 ewb1=ExcelWriter(workbook=wb1)#新建一個(gè)ExcelWriter,用來寫wb1 ws1=wb1.worksheets[0]#取得wb1的第一個(gè)工作表ws1 one_cell = ws1.cell(row = row, column = col).value ws1.cell(row = row, column = col).value = one_cell ewb1.save(filename=dest_filename)#保存一定要有,否則不會(huì)有結(jié)果
到此這篇關(guān)于使用python中的openpyxl操作excel詳解的文章就介紹到這了,更多相關(guān)python的openpyxl操作excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python使用pandas和openpyxl讀取Excel表格的方法詳解
- python使用openpyxl打開及讀取excel表格過程
- python使用openpyxl實(shí)現(xiàn)對(duì)excel表格相對(duì)路徑的超鏈接的創(chuàng)建方式
- python openpyxl提取Excel圖片實(shí)現(xiàn)原理技巧
- python?openpyxl操作Excel的安裝使用
- python使用openpyxl庫處理Excel文件詳細(xì)教程
- Python通過OpenPyXL處理Excel的完整教程
- python使用openpyxl庫讀取Excel文件數(shù)據(jù)
- python如何通過openpyxl讀寫Excel文件
- Python?Excel操作從零學(xué)習(xí)掌握openpyxl用法
- python操作Excel神器openpyxl看這一篇就夠了
- python使用Openpyxl操作Excel文件的實(shí)現(xiàn)
相關(guān)文章
Python 編碼規(guī)范(Google Python Style Guide)
本項(xiàng)目并非 Google 官方項(xiàng)目, 而是由國內(nèi)程序員憑熱情創(chuàng)建和維護(hù),對(duì)于想學(xué)習(xí)python的朋友可以參考一下2018-05-05精選39道Python數(shù)據(jù)分析面試題提早備戰(zhàn)金三銀四
這篇文章主要為大家介紹了39道Python數(shù)據(jù)分析的面試題問答攻略幫助大家提早備戰(zhàn)金三銀四,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多精進(jìn),早日度過寒冬2023-12-12mac安裝scrapy并創(chuàng)建項(xiàng)目的實(shí)例講解
今天小編就為大家分享一篇mac安裝scrapy并創(chuàng)建項(xiàng)目的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06Python的加密模塊之hashlib 與 base64詳解及常用加密方法
我們來學(xué)習(xí)一下 Python 中的加密模塊,加密模塊在工作中被廣泛應(yīng)用,比如數(shù)據(jù)的傳入 不希望被捕獲,通過把數(shù)據(jù)加密。這樣即使被捕獲也無法獲取到數(shù)據(jù)的真實(shí)信息,今天我們就來學(xué)習(xí)一下關(guān)于加密的方法,感興趣的朋友跟隨小編一起看看吧2023-02-02Python使用Tkinter庫如何設(shè)置tkinter ttk框架背景顏色
本文介紹了在Python的Tkinter庫中,如何使用style.configure方法為ttk框架設(shè)置背景顏色及其他樣式屬性,以定制美觀的GUI界面2024-09-09