主要是對openpyxl擴展進行擴展,使用歸類等
1、 安裝
pip install openpyxl
想要在文件中插入圖片文件,需要安裝pillow,安裝文件:PIL-fork-1.1.7.win-amd64-py2.7.exe
· font(字體類):字號、字體顏色、下划線等
· fill(填充類):顏色等
· border(邊框類):設置單元格邊框
· alignment(位置類):對齊方式
· number_format(格式類):數據格式
· protection(保護類):寫保護
2、 創建一個excel 文件,並寫入不同類的內容
from openpyxl import Workbook wb = Workbook() #創建excel文件對象 ws = wb.active #獲取第一個sheet,第一sheet一般為默認的活動sheet ws['A1'] = 12 #單元格寫入數字和文字等信息 ws['B1'] = "你好"+"world" ws.append([1,2,3]) #一次性寫入多個單元格,按行寫入 import datetime import time ws['A3'] = datetime.datetime.now() #寫入一個當前時間 ws['A4'] = time.strftime('%Y{y}%m{m}%d{d} %H{h}%M{f}%S{s}').format(y='年',m='月',d='日',h='時',f='分',s='秒') #寫入一個自定義的時間格式 wb.save('sample.xlsx') #保存excel文件
3、 創建sheet
from openpyxl import Workbook wb = Workbook() #創建excel文件對象 ws1 = wb.create_sheet("Mysheet") #創建新的sheet ws1.title = "NewTitle" #新sheet取名 ws2 = wb.create_sheet("Mysheet",0) #創建新的sheet,並插入到第一個位置 ws2.title = '你好' ws1.sheet_properties.tabColor = '1072BA' #sheet標簽顏色 print(wb.get_sheet_by_name('你好')) #獲取某個sheet對象 print(wb["NewTitle"]) #獲取某個sheet對象 for sheet_name in wb.sheetnames: #獲取sheet名稱方法一 print(sheet_name) for sheet in wb: #獲取sheet名稱方法二 print(sheet.title) wb["NewTitle" ]["A1"]="zeke" #對特定的sheet的單元格賦值 source = wb["NewTitle" ] target = wb.copy_worksheet(source) #復制sheet wb.save('sample.xlsx') #保存excel文件
4、 操作單元格
from openpyxl import Workbook wb = Workbook() #創建excel文件對象 ws1 = wb.create_sheet("Mysheet") #創建新的sheet ws1["A1"] = 3.1415926 ws1["B2"] = "hello" d = ws1.cell(row=4, column=2, value=10) #相當於ws1["B4"]=10 print(ws1["A1"].value) print(ws1["B2"].value) print(d.value) wb.save('sample.xlsx') #保存excel文件
5、 操作批量的單元格
無論ws.rows還是ws.iter_rows都是一個對象
from openpyxl import Workbook wb = Workbook() #創建excel文件對象 ws1 = wb.create_sheet("Mysheet") #創建新的sheet ws1["A1"] = 3.1415926 ws1["A2"] = "hello" ws1["A3"] = "你好" ws1.append([5,2,3]) print(ws1["A"]) #操作單列:(<Cell 'Mysheet'.A1>, <Cell 'Mysheet'.A2>, <Cell 'Mysheet'.A3>, <Cell 'Mysheet'.A4>) for i in ws1["A"]: print(i.value) print(ws1["A:C"]) #操作多列,獲取每一個值 for column in ws1["A:C"]: for cell in column: print(cell.value) #無論ws.rows還是ws.iter_rows都是一個對象 for row in ws1.iter_rows(min_row=1, min_col=1, max_col=3, max_row=3): #操作多列,獲取每一個值 for cell in row: print(cell.value) print(ws1.rows) #獲取所有行 for row in ws1.rows: print(row) print(ws1.columns) #獲取所有列 for column in ws1.columns: print(column) wb.save('sample.xlsx') #保存excel文件
使用百分數
from openpyxl import Workbook from openpyxl import load_workbook wb = load_workbook('sample.xlsx') #創建excel文件對象 # wb.guess_types = True #結果會打印小數 wb.guess_types = False #結果會打印百分數 ws = wb.active ws["D1"] = "12%" print(ws["D1"].value) wb.save('sample.xlsx') #保存excel文件
獲取所有的行/列對象
from openpyxl import Workbook from openpyxl import load_workbook wb = load_workbook('sample.xlsx') #創建excel文件對象 ws = wb.active rows = [] colunms = [] #獲取所有的行對象: for row in ws.iter_rows(): # for row in ws. rows: rows.append(row) print(rows) #所有行 print(rows[0]) #獲取第一行 print(rows[0][0]) #獲取第一行第一列的單元格對象 print(rows[0][0].value) #獲取第一行第一列的單元格對象的值 print(rows[len(rows)-1]) #獲取最后行 print rows[-1] print(rows[len(rows)-1][len(rows[0])-1]) #獲取第后一行和最后一列的單元格對象 print(rows[len(rows)-1][len(rows[0])-1].value) #獲取第后一行和最后一列的單元格對象的值 #獲取所有的列對象: for col in ws.iter_cols(): # for col in ws.columns: colunms.append(col) print(colunms) #所有行 print(colunms[0]) #獲取第一行 print(colunms[0][0]) #獲取第一行第一列的單元格對象 print(colunms[0][0].value) #獲取第一行第一列的單元格對象的值 print(colunms[len(colunms)-1]) #獲取最后行 print rows[-1] print(colunms[len(colunms)-1][len(colunms[0])-1]) #獲取第后一行和最后一列的單元格對象 print(colunms[len(colunms)-1][len(colunms[0])-1].value) #獲取第后一行和最后一列的單元格對象的值 wb.save('sample.xlsx') #保存excel文件
6、 操作已經存在的文件
from openpyxl import Workbook from openpyxl import load_workbook wb = load_workbook('sample.xlsx') wb.guess_types = True #猜測單元格格式類型 ws=wb.active wb.save("sample.xlsx")
#注意如果原文件有一些圖片或者圖標,保存的時候可能會導致圖片丟失
7、 單元格類型
from openpyxl import Workbook from openpyxl import load_workbook import datetime wb = load_workbook('sample.xlsx') #創建excel文件對象 ws = wb.active wb.guess_types = True #如果是常規,顯示general,如果是數字,顯示'0.00_ ',如果是百分數顯示0% ws["A1"] = datetime.datetime.now() print(ws["A1"].number_format) #單元格中數據類型為yyyy-mm-dd h:mm:ss print(ws["A1"].value) ws["A2"] = "12%" print(ws["A2"].number_format) #單元格中數據類型為百分數,顯示為0% print(ws["A2"].value) ws["A3"] = 1.154 print(ws["A3"].number_format) #單元格中數據類型為常規,顯示general。注:數字需要在Excel中設置數字類型,直接寫入的數字是常規類型 print(ws["A3"].value) ws["A4"] = "中國" print(ws["A4"].number_format) #單元格中數據類型為常規,顯示general print(ws["A4"].value) wb.save('sample.xlsx') #保存excel文件
8、 使用公式
from openpyxl import Workbook from openpyxl import load_workbook import datetime wb = load_workbook('sample.xlsx') #創建excel文件對象 ws1 = wb.active ws1["A1"] = 1 ws1["A2"] = 2 ws1["A3"] = 3 ws1["A4"] = "SUM(1,1)" ws1["A5"] = "SUM(A1,A3)" print(ws1["A4"].value) #打印的是公式內容,不是公式計算后的值,程序無法取到計算后的值 print(ws1["A5"].value) #打印的是公式內容,不是公式計算后的值,程序無法取到計算后的值 wb.save('sample.xlsx') #保存excel文件
9、 合並單元格
from openpyxl import Workbook from openpyxl import load_workbook wb = load_workbook('sample.xlsx') ws1=wb.active ws.merge_cells('A2:D2') ws.unmerge_cells('A2:D2') #合並后的單元格,腳本單獨執行拆分操作會報錯,需要重新執行合並操作再拆分 # 或對應具體的行列,與上面兩條結果相同 ws.merge_cells(start_row=2,start_column=1,end_row=2,end_column=4) ws.unmerge_cells(start_row=2,start_column=1,end_row=2,end_column=4) wb.save("sample.xlsx") #保存文件
10、插入一個圖片
需要先安裝Pilow,安全文件是:PIL-fork-1.1.7.win-amd64-py2.7.exe
from openpyxl import load_workbook from openpyxl.drawing.image import Image wb = load_workbook('e:\sample.xlsx') ws1=wb.active img = Image('1.png') ws1.add_image(img, 'A1') wb.save("sample.xlsx")
11、 隱藏單元格
from openpyxl import load_workbook wb = load_workbook('sample.xlsx') ws1=wb.active ws1.column_dimensions.group('A', 'D', hidden=True) #隱藏a到d列范圍內的列 #注:ws1.row_dimensions 無group方法 wb.save("sample.xlsx")
12、 畫一個柱狀圖
from openpyxl import load_workbook from openpyxl import Workbook from openpyxl.chart import BarChart, Reference, Series wb = load_workbook('sample.xlsx') ws1=wb.active wb = Workbook() ws = wb.active for i in range(10): ws.append([i]) values = Reference(ws, min_col=1, min_row=1, max_col=1, max_row=10) #獲取表格中具體的數值 chart = BarChart() #創建柱狀圖 chart.add_data(values) #柱狀圖中添加數據 ws.add_chart(chart, "E15") #將柱狀圖添加到工作薄中,並從E15單元格中開始添加 wb.save("sample.xlsx")
13、 畫一個餅圖
from openpyxl import load_workbook from openpyxl import Workbook from openpyxl.chart import (PieChart , ProjectedPieChart, Reference) from openpyxl.chart.series import DataPoint data = [['Pie', 'Sold'],['Apple', 50],['Cherry', 30],['Pumpkin', 10],['Chocolate', 40]] wb = Workbook() ws = wb.active for row in data: ws.append(row) pie = PieChart() #創建餅圖 labels = Reference(ws, min_col=1, min_row=2, max_row=5) #餅圖label取值單元格 data = Reference(ws, min_col=2, min_row=1, max_row=5) #餅圖數據取值單元格 pie.add_data(data, titles_from_data=True) pie.set_categories(labels) pie.title = "Pies sold by category" slice = DataPoint(idx=0, explosion=20) pie.series[0].data_points = [slice] ws.add_chart(pie, "D1") ws = wb.create_sheet(title="Projection") #創建另外的工作薄並畫圖 data = [['Page', 'Views'],['Search', 95],['Products', 4],['Offers', 0.5],['Sales', 0.5]] for row in data: ws.append(row) projected_pie = ProjectedPieChart() projected_pie.type = "pie" projected_pie.splitType = "val" # 按取值拆分 labels = Reference(ws, min_col=1, min_row=2, max_row=5) data = Reference(ws, min_col=2, min_row=1, max_row=5) projected_pie.add_data(data, titles_from_data=True) projected_pie.set_categories(labels) ws.add_chart(projected_pie, "A10") from copy import deepcopy projected_bar = deepcopy(projected_pie) projected_bar.type = "bar" projected_bar.splitType = 'pos' # 按位置拆分 ws.add_chart(projected_bar, "A27") wb.save("sample.xlsx")
14、 設定一個表格區域,並設定表格的格式
from openpyxl import load_workbook from openpyxl import Workbook from openpyxl.worksheet.table import Table, TableStyleInfo wb = Workbook() ws = wb.active data = [['Apples', 10000, 5000, 8000, 6000],['Pears', 2000, 3000, 4000, 5000],['Bananas', 6000, 6000, 6500, 6000],['Oranges', 500, 300, 200, 700]] ws.append(["Fruit", "2011", "2012", "2013", "2014"]) #新增 for row in data:#數據添加到表格中 ws.append(row) tab = Table(displayName="Table1", ref="A1:E5") # 添加帶有條帶行和條帶列的默認樣式 style = TableStyleInfo(name="TableStyleMedium9", showFirstColumn=True, showLastColumn=True, showRowStripes=True, showColumnStripes=True) #第一列是否和樣式第一行顏色一行,第二列是否··· #是否隔行換色,是否隔列換色 tab.tableStyleInfo = style ws.add_table(tab) wb.save("sample1.xlsx")
15、給單元格設定字體顏色
from openpyxl import Workbook from openpyxl.styles import colors from openpyxl.styles import Font wb = Workbook() ws = wb.active a1 = ws['A1'] d4 = ws['D4'] ft = Font(color=colors.RED) # color="FFBB00",顏色編碼也可以設定顏色 a1.font = ft d4.font = ft #如果要更改字體的顏色,需要重新分配 #italic 傾斜字體 a1.font = Font(color=colors.RED, italic=True) # 僅設置a1 a1.value = "abc" wb.save("sample2.xlsx")
16、設定字體和大小
from openpyxl import Workbook from openpyxl.styles import colors wb = Workbook() ws = wb.active a1 = ws['A1'] d4 = ws['D4'] a1.value = "abc" from openpyxl.styles import Font from copy import copy ft1 = Font(name=u'宋體', size=14) ft2 = copy(ft1) #復制字體對象 ft2.name = "Tahoma" print(ft1.name) print(ft2.name) print(ft2.size) a1.font = ft1 wb.save("sample3.xlsx")
17、設定行和列的字體
from openpyxl import Workbook from openpyxl.styles import Font wb = Workbook() ws = wb.active col = ws.column_dimensions['A'] col.font = Font(bold=True) #將A列設定為粗體 row = ws.row_dimensions[1] row.font = Font(underline="single") #將第一行設定為下划線格式 wb.save("e:\\sample.xlsx")
18、設定單元格的邊框、字體、顏色、大小和邊框背景色
from openpyxl import Workbook
from openpyxl.styles import Font
from openpyxl.styles import NamedStyle, Font, Border, Side,PatternFill
wb = Workbook()
ws = wb.active
highlight = NamedStyle(name="highlight")
highlight.font = Font(bold=True, size=20,color= "ff0100")
highlight.fill = PatternFill("solid", fgColor="DDDDDD")#背景填充
bd = Side(style='thick', color="000000")
highlight.border = Border(left=bd, top=bd, right=bd, bottom=bd)
print dir(ws["A1"])
ws["A1"].style =highlight
wb.save("sample.xlsx")
19、常用的樣式和屬性設置
from openpyxl import Workbook from openpyxl.styles import Font from openpyxl.styles import NamedStyle, Font, Border, Side,PatternFill wb = Workbook() ws = wb.active highlight = NamedStyle(name="highlight") highlight.font = Font(bold=True, size=20,color= "ff0100") highlight.fill = PatternFill("solid", fgColor="DDDDDD")#背景填充 bd = Side(style='thick', color="000000") highlight.border = Border(left=bd, top=bd, right=bd, bottom=bd) print dir(ws["A1"]) ws["A1"].style =highlight wb.save("sample.xlsx")
from openpyxl import Workbook from openpyxl.styles import Font from openpyxl.styles import NamedStyle, Font, Border, Side,PatternFill from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font wb = Workbook() ws = wb.active #設置字體 ft = Font(name='微軟雅黑', size=11, bold=False, italic=False, vertAlign=None, underline='none', strike=False, color='FF000000') #設置填充 fill = PatternFill(fill_type="solid", start_color='FFEEFFFF', end_color='FF001100') #邊框可以選擇的值為:'hair', 'medium', 'dashDot', 'dotted', 'mediumDashDot', 'dashed', 'mediumDashed', 'mediumDashDotDot', 'dashDotDot', 'slantDashDot', 'double', 'thick', 'thin'] #diagonal 表示對角線 bd = Border(left=Side(border_style="thin",color='FF001000'), right=Side(border_style="thin",color='FF110000'), top=Side(border_style="thin",color='FF110000'), bottom=Side(border_style="thin",color='FF110000'), diagonal=Side(border_style=None,color='FF000000'), diagonal_direction=0, outline=Side(border_style=None,color='FF000000'), vertical=Side(border_style=None,color='FF000000'), horizontal=Side(border_style=None,color='FF110000') ) #設置對齊方式 alignment=Alignment(horizontal='general', vertical='bottom', text_rotation=0, wrap_text=False, shrink_to_fit=False, indent=0) number_format = 'General' #單元格數據類型 protection = Protection(locked=True,hidden=False) #保護格式 ws["B3"].font = ft ws["B3"].fill =fill ws["B3"].border = bd ws["B3"].alignment = alignment ws["B3"].number_format = number_format ws["B3"].value ="我在這里" wb.save("sample4.xlsx")