一、使用Python操作Excel
Python來操作Excel文檔以及如何利用Python語言的函數和表達式操縱Excel文檔中的數據。
雖然微軟公司本身提供了一些函數,我們可以使用這些函數操作Excel文檔。但是,使用Excel自帶的函數受限於Excel軟件的功能限制。換句話說,只有微軟提供了某種功能,我們才能使用相應的功能解決問題。如果微軟沒有提供相應的函數應對一個復雜的功能,那么,我們只能進行重復性操作。使用Python語言操作Excel則不然,我們可以靈活應用Python語言的所有功能,讀取、計算和編輯Excel文檔中的數據。
一、Python處理Excel之openpyxl
1、openpyxl簡介和安裝
1、openpyxl簡介
openpyxl是一個讀寫Excel2010(xlsx/xlsm)文檔的Python庫,如果要處理更早格式的Excel文檔,需要用到另外的庫。openpyxl是一個比較綜合的工具,能夠同時讀取和修改Excel文檔。XlsxWriter也是一個與Excel處理相關的知名項目,僅支持創建和寫入Excel文檔,不支持讀取Excel文檔。
2、openpyxl安裝
pip install openpyxl
2、使用openpyxl讀取Excel文檔
1、Excel的構成
一個Excel文檔稱為一個工作簿,在Office2010下,典型工作簿的文件擴展名為xlsx。一個工作簿可以包含多個表格(在Excel又稱為sheet)。打開工作簿后會默認顯示一個表格,這個表格一般稱為活躍表。表格中包含若干單元格,所有單元格都有一個唯一的坐標。Excel通過行和列表示一個單元格,其中,行的坐標使用數字表示,列的坐標使用字母表示。
2、openpyxl處理Excel文件
openxpyxl中有三個不同層次的類,分別是Workbook、Worksheet和Cell。Workbook是對Excel工作簿的抽象,Worksheet是對表格的抽象,Cell是對單元格的抽象。每一個類都包含了若干屬性和方法,以便於我們通過這些屬性和方法獲取表格中的數據。
例如,我們要打開一個Excel表格或者創建一個Excel文檔,都需要創建一個Workbook對象。我們需要獲取Excel文檔中的某一張表,應該先創建一個Workbook對象,然后使用該對象的方法來得到一個Worksheet對象。如果要讀取或者修改某個單元格,我們需要先獲得Worksheet對象,然后再獲取代表單元格的Cell對象。
一個Workbook對象代表一個Excel文檔,因此,在操作一個Excel之前,應該先創建一個Workbook對象。對於創建一個新的Excel文檔,直接進行Workbook類調用即可。對於讀取一個已有的Excel文檔,可以使用openpyxI模塊的load_workbook函數。該函數接受多個參數,但只有filename參數為必傳參數。filenmame可以是一個文件名,也可以是一個打開的文件對象。
import openpyxl wb=openpyxl.load_workbook('example.xls')
調用完load_workbook函數以后,我們就得到了一個Workbook對象。Workbook對象有很多的屬性和方法,其中,大部分方法都與sheet相關。
Workbook對象的部分屬性如下:
1 active:獲取活躍的Worksheet; 2 read_only:是否以read_only模式打開Excel文檔; 3 encoding:文檔的字符集編碼; 4 properties:文檔的元數據,如標題,創建者,創建日期等; 5 worksheets:以列表的形式返回所有的Worksheet。

#操作 print(wb.active) print(wb.read_only) print(wb.encoding) print(wb.worksheets) #結果如下 <Worksheet "product"> False utf-8 [<Worksheet "pre">, <Worksheet "product">]
Workbook對象的方法大都與Worksheet相關。常用的方法如下:
1 sheetnames:獲取所有表格的名稱; 2 [sheetname]:通過表格名稱獲取Worksheet對象; 3 active:獲取活躍的表格; 4 remove:刪除一個表格; 5 create_sheet:創建一個空的表格; 6 copy_worksheet:在Workbook內拷貝表格

#實操 print(wb.sheetnames) print(wb['pre']) print(wb.active) print(wb.create_sheet(index=0, title='new sheet')) print(wb.sheetnames) print(wb.remove(wb['new sheet'])) print(wb.sheetnames) print(wb.copy_worksheet(wb['pre'])) ###將修改保存(從內存刷到磁盤) wb.save('example.xlsx') #結果 <Worksheet "new sheet"> ['new sheet', 'pre', 'product'] ['new sheet', 'pre', 'product'] <Worksheet "pre"> <Worksheet "pre Copy">
有了Worksheet對象以后,我們可以通過這個Worksheet對象獲取表格的屬性,得到單元格中的數據,修改表格中的內容。openpyxI提供了非常靈活的方式來訪問表格中的單元格和數據。
常用的Worksheet屬性如下:
1 title:表格的標題; 2 dimensions:表格的大小,這里的大小是指有含有數據的表格大小。例如,對於example.xlsx文件,dimensions屬性的值為'Al:El1'; 3 maxrow:表格的最大行; 4 min_row:表格的最小行; 5 maxcolumn:表格的最大列; 6 mincolumn:表格的最小列; 7 rows:按行獲取單元格(Cell對象); 8 columns:按列獲取單元格(Cell對象); 9 freeze_panes:凍結窗格; 10 values:按行獲取表格的內容(數據)。

#實操 ws = wb['pre'] print(ws.title) print(ws.max_row) #結果如下 pre 59
通過不同的屬性名獲取student這張表的屬性。其中,columns、rows和values這幾個屬性都是通過生成器的方式返回數據。
openpyxl並不知道我們的表格中有多少數據,在數據量大的情況下,如果一次獲取所有數據,勢必會占用較多的內存。因此,openpyxl的設計中,需要返回數據時都是通過生成器的方式返回。對於附件中的student表,因為記錄較少,我們可以使用list函數或tuple函數獲取所有的數值。需要注意的是,columns與rows返回的是Cell對象,values返回的是數據。
freeze_panes這個參數比較特別,主要用於在表格較大時凍結頂部的行或左邊的列。對於凍結的行或列,就算用戶滾動電子表格,也是始終可見的。每個Worksheet對象都有一個freeze_panes屬性,可以設置為一個Cell對象或一個單元格坐標的字符串,單元格上面的行和左邊的列將會凍結(注意單元格所在的行和列並不會凍結)。例如,我們需要凍結第一行,那么freeze_panes取值應該為A2,如果要凍結第一列,freeze_panes取值為Bl。如果要同時凍結第一行和第一列,則freeze_panes取值為B2。freeze_panes取值為None表示不凍結任何窗格。
Worksheet常用的一些方法:
1 iter_rows:按行獲取所有單元格(Cell對象); 2 iter_columns:按列獲取所有的單元格; 3 append:在表格末尾添加數據; 4 merged_cells:合並多個單元格; 5 unmerge_cells:移除合並的單元格。
iter_rows方法和iter_columns方法在參數取默認值時,與rows屬性和columns屬性的作用相同。區別在於,iter_rows方法和iter_columns方法可以通過函數參數限定訪問表格的范圍。
print(list(ws.iter_rows(min_row=2,max_row=4,min_col=1,max_col=3)))
從Worksheet的屬性和方法的使用中可以看到,很多屬性和方法返回的不是某一個具體的數值,而是一個Cell對象。一個Cell對象就代表一個單元格,我們可以直接使用Excel坐標的方式獲取Cell對象,也可以使用Worksheet的cell方法獲取Cell對象。如下所示:
print(ws['A1']) print(ws.cell(row=1, column=2))
Cell對象比較簡單,其常用的屬性如下:
1 row:單元格所在的行; 2 column:單元格所在的列; 3 value:單元格的取值; 4 cordinate:單元格的坐標
3、openpyxl提供的各種API
使用4種不同的方法來打印student表中的內容。為了對數據的格式進行控制,我們使用print函數而不是print語句進行打印。
通過Worksheet的values方法打印表格中的數據,這也是打印數據最簡單的方法。values通過生成器訪問數據並按行返回,因此,我們使用for循環遍歷表格的內容。
from __future__ import print_function for row in ws.values: print(*row)
使用Worksheet的rows屬性來遍歷表格中的數據。rows屬性按行返回Cell對象,因此,我們使用列表推導來獲取每一個Cell對象的值。如下所示:
for row in ws.rows: print(*[cell.value for cell in row])
Worksheet的iter_rows方法在不加任何參數的情況下與rows屬性效果相同,因此這種方法與前一種方法看起來很像
for row in ws.iter_rows(): print(*[cell.value for cell in row])
最后這種方式是最麻煩的方式,也是大家最容易想到的方式。我們首先獲取表格的最小行數和最大行數,然后獲取最小列數與最大列數,通過行和列的索引確定一個唯一元格。確定單元格以后,打印單元格的值。這種方式是每確定一個單元格打印一次,因此,我們在print函數中將end參數取值為空格來避免換行,並在內層for循環結束以后,顯示地進行換行。如下所示:
for i in range(ws.min_row, ws.max_row + 1): for j in range(ws.min_column, ws.max_column + 1): print(ws.cell(row=i ,column=j).value, end=' ') print()
3、使用openpyxl修改Excel
openpyxl不但可以讀取Excel文檔,而且還可以修改Excel文檔,包括修改單元格的 數據、合並單元格、修改單元格的字體、在Excel文檔中畫圖等。
一個Workbook對象就代表了一個工作簿,因此,新建一個工作簿就是創建一個 Workbook對象。創建完Workbook對象以后,默認會有一個名為“sheetl”的表格,我們 可以通過表格的名稱或get_active_sheet方法來獲取這個表格。獲取表格以后,可以通過給 表格的title屬性賦值的方式來修改表格的名稱。
from openpyxl import Workbook wb =Workbook() wb.sheetnames ws = wb.active ws.title ws.title = 'pre'
修改
ws['A1'] = 'hello world' wb.save('example.xlsx')
二、其他操作Excel的方式
1、xlrd主要是用來讀取excel文件
1、安裝xlrd
pip install xlrd
2、實操

import xlrd workbook = xlrd.open_workbook('dns_records.xls') sheet_names = workbook.sheet_names() for sheet_name in sheet_names: sheet2 = workbook.sheet_by_name(sheet_name) print(sheet_name) rows = sheet2.row_values(3) # 獲取第四行內容 cols = sheet2.col_values(1) # 獲取第二列內容 print(rows) print(cols)
2、xlwt主要是用來寫excel文件
1、安裝
pip install xlwt
2、實操

import xlwt wbk = xlwt.Workbook() sheet = wbk.add_sheet('sheet 1') sheet.write(0,1,'test text')#第0行第一列寫入內容 wbk.save('test.xls')
3、xlutils結合xlrd可以達到修改excel文件目的
1、安裝
pip install xlutils
2、實操

import xlrd from xlutils.copy import copy workbook = xlrd.open_workbook(u'有趣裝逼每日數據及趨勢.xls') workbooknew = copy(workbook) ws = workbooknew.get_sheet(0) ws.write(3, 0, 'changed!') workbooknew.save(u'有趣裝逼每日數據及趨勢copy.xls')
4、xlsxwriter可以寫excel文件並加上圖表
1、安裝
pip install xlsxwriter
2、實操

1 import xlsxwriter 2 3 4 def get_chart(series): 5 chart = workbook.add_chart({'type': 'line'}) 6 for ses in series: 7 name = ses["name"] 8 values = ses["values"] 9 chart.add_series({ 10 'name': name, 11 'categories': 'A2:A10', 12 'values':values 13 }) 14 chart.set_size({'width': 700, 'height': 350}) 15 return chart 16 17 if __name__ == '__main__': 18 workbook = xlsxwriter.Workbook(u'H5應用中心關鍵數據及趨勢.xlsx') 19 worksheet = workbook.add_worksheet(u"每日PV,UV") 20 headings = ['日期', '平均值'] 21 worksheet.write_row('A1', headings) 22 index = 0 23 for row in range(1,10): 24 for com in [0,1]: 25 worksheet.write(row,com,index) 26 index+=1 27 series = [{"name":"平均值","values":"B2:B10"}] 28 chart = get_chart(series) 29 chart.set_title ({'name': '每日頁面分享數據'}) 30 worksheet.insert_chart('H7', chart) 31 workbook.close()
三、Python3實戰
1、Python處理excel並json序列化,並寫入文件中
import xlrd from collections import OrderedDict import json def login_pc_parameter(): #excel的路徑 wb = xlrd.open_workbook('pc_login.xlsx') convert_list = [] #處理的sheet,默認是第一個(索引值為0) sh = wb.sheet_by_index(0) #顯示excel的標題,一般是第一行內容 title = sh.row_values(0) for rownum in range(1, sh.nrows): #獲取每行的數據 rowvalue = sh.row_values(rownum) #使用有序字典類,防止亂序 single = OrderedDict() for colnum in range(0, len(rowvalue)): # print(title[colnum], rowvalue[colnum]) single[title[colnum]] = rowvalue[colnum] convert_list.append(single) j = json.dumps(convert_list,ensure_ascii=False,indent=2) # print(convert_list) # print(j) with open("file3.json", "w",encoding="utf-8") as f: f.write(j) if __name__ == '__main__': login_pc_parameter()
二、使用Python操作PDF
PDF(Portable Document Format)是一種便攜式文檔格式,這種文檔格式與操作系統平台無關。PDF文件無論是在Windows,Unix還是在蘋果公司的MacOS操作系統中都是通用的,這一特點使它成為在Internet上進行電子文檔發行和數字化信息傳播的理想文檔格式。雖然PDF便於傳輸和閱讀,但是,編輯PDF卻很不容易。PyPDF2對編輯PDF提供了有限的支持,我們可以使用PyPDF2模塊讀取、合並和寫入PDF文檔。
一、PyPDF2 安裝與介紹
PyPDF2是一個純Python的開源庫,能夠分割或合並PDF文件,也可以裁剪或轉換 PDF文件中的頁面。我們還可以使用PyPDF2查看PDF文件的元信息,對PDF文件進行加密,破解PDF文件的密碼等。
官網:https://pythonhosted.org/PyPDF2/
安裝
pip install PyPDF2
PyPDF2提供了4個主要的類,分別是PdfFileWriter、PdfFileReader、PdfFileMerger和PageObject。前三個類分別用以讀取PDF文件、寫入PDF文件與合並PDF文件。PageObject類代表了一個PDF頁面,可以使用PdfFileReader類的getPage方法得到一個PageObject對象。
二、使用PdfFileReader讀取PDF文檔
學習一個庫,最好的方式就是使用IPython進行練習。IPython能夠看到程序的中間結果,也可以方便地獲取幫助信息。接下來,我們就使用IPython學習PyPDF2的使用。在 IPython的交互模式下輸入以下代碼:
1、獲取pdf文檔共有多少頁
import PyPDF2 reader = PyPDF2.PdfFileReader(open(u'Python Linux系統管理與自動化運維.pdf', 'rb')) num_pages = reader.getNumPages() print(num_pages)
2、顯示pdf文檔的info信息
doc_info = reader.getDocumentInfo() print(doc_info)
結果如下
{'/CreationDate': "D:20171125012631+08'00'", '/Creator': 'Adobe Acrobat 11.0.10', '/ModDate': "D:20180430102312+08'00'", '/Producer': 'Adobe Acrobat Pro 11.0 Paper Capture Plug-in', '/Title': ''}
三、使用PdfFileWrite創建PDF文檔
對PDF文件進行加密、裁剪PDF文件、調整PDF頁面的順序等。我們需要編輯PDF頁面。例如,去除PDF文件中的第一頁,從一個PDF文件中提取幾個頁面保存到另一個文件。PyPDF2並不能直接編輯PDF文件,但是,我們可以利用PyPDF2從一個PDF文檔拷貝需要的頁面到另一個PDF文檔,通過這種迂回的方式實現編輯PDF的功能。
例如,我們現在要修改Python Linux系統管理與自動化運維.pdf文件,僅僅保存該文件的第2頁、第5頁和第6頁。我們將這幾個頁面抽取出來,保存到另外一個PDF文件中,並對這個PDF文件進行加密。如下所示:
1、將需要的內容寫入新的pdf文件
import PyPDF2 reader= PyPDF2.PdfFileReader(open(u'Python Linux系統管理與自動化運維.pdf', 'rb')) output= PyPDF2.PdfFileWriter() output.addPage(reader.getPage(1)) output.addPage(reader.getPage(4)) output.addPage(reader.getPage(5)) output.getNumPages()
創建了一個PdtFileWriter對象和一個PdtFileReader對象。接着,我們使用PdtFileReader對象的getPage方法獲取需要的PDF頁面,並通過PdtFileWriter對象的addPage方法增加頁面。PdtFileWriter類有很多方法,如添加空白頁的addBlankPage方法、添加書簽的addBookmark方法、添加元信息的addMetadata方法以及對PDF進行加密的encrypt方法。在PdtFileWriter類的所有方法中,最常用的是addPage方法。
getNumPages方法獲取PdtFileWriter擁有的PDF頁面數。
2、使用encrypt方法對PDF文件進行加密。
output.encrypt('123456') outputStream = (open(u'Python Linux系統管理與自動化運維_test.pdf', 'wb')) output.write(outputStream) outputStream.close()
四、修改PDF頁面
需要修改PDF的頁面,PyPDF2也提供了部分支持,如旋轉頁面、添加水印。PageObject類中有部分方法可以修改PDF頁面,其中,rotateClockwise和rotateCounterClockwise方法用來旋轉頁面。這兩個方法只接受一個參數,且參數取值必須是90的倍數,表示旋轉多少度。下面的代碼將redbooks.pdf文件的首頁旋轉180度,並保存到一個新的文件中。
1、旋轉文檔
import PyPDF2 reader = PyPDF2.PdfFileReader(open(u'Python Linux系統管理與自動化運維.pdf', 'rb')) writer = PyPDF2.PdfFileWriter() page = reader.getPage(20) page.rotateClockwise(90) writer.addPage(page) outputStream = open("test.pdf", "wb") writer.write(outputStream) outputStream.close()
2、給文檔添加水印
import PyPDF2 reader = PyPDF2.PdfFileReader(open(u'Python Linux系統管理與自動化運維.pdf', 'rb')) watermark = PyPDF2.PdfFileReader(open(u'Python Linux系統管理與自動化運維.pdf', 'rb')) writer = PyPDF2.PdfFileWriter() for i in range(reader.getNumPages()): page = reader.getPage(i) page.mergePage(watermark.getPage(0)) writer.addPage(page) output_stream = open("watermark-test.pdf", 'wb') writer.write(output_stream) output_stream.close()