python模塊之openpyxl擴展


主要是對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
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")


免責聲明!

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



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