Python3 讀取和寫入excel


https://blog.csdn.net/weixin_43094965/article/details/82226263
一、Excel

1、Excel文件三個對象

workbook: 工作簿,一個excel文件包含多個sheet。
sheet:工作表,一個workbook有多個,表名識別,如“sheet1”,“sheet2”等。
cell: 單元格,存儲數據對象

2、excel定義的圖

excel定義的圖分兩級類別描述,第一級分別有九大類,如下所示

area: 面積圖
bar: 轉置直方圖
column: 柱狀圖
line: 直線圖
pie: 餅狀圖
doughnut: 環形圖
scatter: 散點圖
stock: 股票趨勢圖
radar: 雷達圖

第二級則是描述是否有連線,是否有平滑曲線等細節調整。

area
  stacked
  percent_stacked
bar
  stacked
  percent_stacked
column
  stacked
  percent_stacked
scatter
  straight_with_markers
  straight
  smooth_with_markers
  smooth
radar
  with_markers
  filled

3、csv格式讀寫excel數據

現在我們已經在 Python 中拿到了想要的數據,對於這些數據我們可以先存放起來,比如把數據寫入 csv 中。定義一個 writeDate 方法:

import csv #導入包

def writeData(data, name):
    with open(name, 'a', errors='ignore', newline='') as f:
            f_csv = csv.writer(f)
            f_csv.writerows(data)
    print('write_csv success')

writeData(result, 'D:/py_work/venv/Include/weather.csv') #數據寫入到 csv文檔中

 

二、python與excel

1、python處理excel主流代表有:

 

 

二、openpyxl基本用法

openpyxl專門處理Excel2007及以上版本產生的xlsx文件,可讀可寫excel表。openpyxl定義了多種數據格式其中最重要的三種:NULL空值:對應於python中的None,表示這個cell里面沒有數據。numberic: 數字型,統一按照浮點數來進行處理。對應於python中的float。string: 字符串型,對應於python中的unicode。openpyxl中有三個不同層次的類:

Workbook是對工作簿的抽象,
Worksheet是對表格的抽象,
Cell是對單元格的抽象,

2.1Workbook:

一個Workbook對象代表一個Excel文檔,因此在操作Excel之前,都應該先創建一個Workbook對象。對於創建一個新的Excel文檔,直接進行Workbook類的調用即可,對於一個已經存在的Excel文檔,可以使用openpyxl模塊的load_workbook函數進行讀取,該函數包涵多個參數,但只有filename參數為必傳參數。一個工作簿(workbook)在創建的時候同時至少也新建了一張工作表(worksheet)。

2.1.1Workbook屬性:

●active:獲取當前活躍的Worksheet
●worksheets:以列表的形式返回所有的Worksheet(表格)
●read_only:判斷是否以read_only模式打開Excel文檔
●encoding:獲取文檔的字符集編碼
●properties:獲取文檔的元數據,如標題,創建者,創建日期等
●sheetnames:獲取工作簿中的表(列表)

 

2.1.2Workbook方法大部分方法都與sheet有關

●get_sheet_names:獲取所有表格的名稱(新版已經不建議使用,通過Workbook的sheetnames屬性即可獲取)
●get_sheet_by_name:通過表格名稱獲取Worksheet對象(新版也不建議使用,通過Worksheet[‘表名‘]獲取)
●get_active_sheet:獲取活躍的表格(新版建議通過active屬性獲取)
●remove_sheet:刪除一個表格
●create_sheet:創建一個空的表格
●copy_worksheet:在Workbook內拷貝表格

2.2Worksheet:

有了Worksheet對象以后,我們可以通過這個Worksheet對象獲取表格的屬性,得到單元格中的數據,修改表格中的內容。openpyxl提供了非常靈活的方式來訪問表格中的單元格和數據

2.2.1Worksheet屬性:

●title:表格的標題
●dimensions:表格的大小,這里的大小是指含有數據的表格的大小,即:左上角的坐標:右下角的坐標
●max_row:表格的最大行
●min_row:表格的最小行
●max_column:表格的最大列
●min_column:表格的最小列
●rows:按行獲取單元格(Cell對象) - 生成器
●columns:按列獲取單元格(Cell對象) - 生成器
●freeze_panes:凍結窗格
●values:按行獲取表格的內容(數據) - 生成器

2.2.2Worksheet方法:

●iter_rows:按行獲取所有單元格,內置屬性有(min_row,max_row,min_col,max_col)
●iter_columns:按列獲取所有的單元格
●append:在表格末尾添加數據
●merged_cells:合並多個單元格
●unmerged_cells:移除合並的單元格

2.3Cell:

2.3.1Cell屬性:

●row:單元格所在的行
●column:單元格坐在的列
●value:單元格的值
●coordinate:單元格的坐標  # excel2[‘abc‘].cell(row=1,column=2).coordinate

2.3.2單元格樣式

openpyxl的單元格樣式由6種屬性決定,每一種都是一個類,如下所示:

●font(字體類):字號、字體顏色、下划線等
●fill(填充類):顏色等
●border(邊框類):設置單元格邊框
●alignment(位置類):對齊方式
●number_format(格式類):數據格式
●protection(保護類):寫保護

單元格默認樣式如下:

from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font

font = Font(name='Calibri',size=11,bold=False,italic=False,vertAlign=None,underline='none',strike=False,color='FF000000')
fill = PatternFill(fill_type=None,start_color='FFFFFFFF',end_color='FF000000')

border = Border(left=Side(border_style=None,color='FF000000'),
             right=Side(border_style=None,color='FF000000'),
             top=Side(border_style=None,color='FF000000'),
             bottom=Side(border_style=None,color='FF000000'),
             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='FF000000'))

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)

#以上幾種樣式(字體、填充、邊框、位置和保護)實例一旦被創建實例的屬性就不可更改,只能重新創建實例。

基本字體顏色
字體顏色有一些顏色常量,可以直接調用:
from openpyxl.styles import Font
from openpyxl.styles.colors import RED
font = Font(color=RED)
font = Font(color="00FFBB00")

2.4 openpyxl圖表:
Area Charts: 面積圖
Bar and Column Charts : 轉置直方圖
Bubble Charts
Line Charts: 直線圖
Scatter Charts: 散點圖
Pie Charts: 餅狀圖
Doughnut Charts: 環形圖
Radar Charts: 雷達圖
Stock Charts: 股票趨勢圖
Surface Charts
column: 柱狀圖

 

三、使用介紹

3.1、Workbook

re_ex=openpyxl.Workbook() #新建一個工作簿(workbook)
re_ex= openpyxl.Workbook(‘hello.xlxs‘)#新建一個工作簿並命名

re_ex=openpyxl.workbook.Workbook.active() #調用正在運行的工作簿(workbook)

re_ex= openpyxl.load_workbook(‘abc.xlsx‘) #返回一個Workbook對象,即打開一個已有的工作簿

re_ex.save('xxx.xlsx') #保存並關閉工作簿

from openpyxl import load_workbook #讀取現有的工作簿
wb = load_workbook(filename = 'empty_book.xlsx')
sheet_ranges = wb['range names']
print(sheet_ranges['D18'].value)

3.2、worksheet

新建sheet(工作表)

ws1 = wb.create_sheet() #新建sheet
ws1 = wb.create_sheet(0) #新建sheet並指定sheet位置次序。系統自動命名,依次為Sheet, Sheet1, Sheet2

ws2 = wb.create_sheet(title="NewTitle") #新建sheet並設定sheet名稱
ws2 = wb.create_sheet("NewTitle") #新建sheet並設定sheet名稱
ws2 = wb.create_sheet('Data',index=1)#新建工作表並設定sheet名稱,指定sheet位置次序

ws2.title = "NewTitle" # 修改sheet表名稱,直接賦值即可

wb.remove(sheet) #刪除某個工作表

通過sheet名

ws = wb["frequency"] #通過名字打開sheet
ws = wb.get_sheet_by_name('frequency') #通過名字打開sheet

獲取名字(用index

sheet_names = wb.get_sheet_names() #得到工作簿的所有工作表
sheet_names = wb.get_sheet_by_name(sheet_names[index]) # index為0為第一張表
sheet_names.title #獲取sheet名

調用正在運行的工作表

ws =wb.active
ws = wb.get_active_sheet() #通過_active_sheet_index設定讀取的表,默認0讀第一個表

3.3讀寫單元格
當一個工作表被創建時,其中是不包含單元格。只有當單元格被獲取時才被創建。

讀取單元格

d= ws['A4'] #根據單元格的索引獲取單元格,如果不存在將在A4新建一個
d = ws.cell(row = 4, column = 2) #使用cell()方法通過行列獲取單元格(行號列號從1開始)
d = ws.cell('A4') #使用cell()方法通過單元格索引獲取單元格(行號列號從1開始)
d = ws.max_column #獲得最大列
d = ws.max_row)#獲得最大行

cell_range = ws['A1':'C2'] #使用切片獲取多個單元格
d = get_cell_collection() #讀所有單元格數據

print (rows[n]) #顯示第n行數據 
print (columns[n]) #顯示第n列數據

ws.rows #迭代讀取所有行row 
ws.columns #迭代讀取所有列column

獲取行和列單元格的數據
sheet.rows為生成器,里面是每一行的數據,每一行又由一個tuple。
sheet.columns類似,不過里面是每個tuple是每一列的單元格。

#因為按行,所以返回A1,B1,C1這樣的順序

for row in sheet.rows:

         for cell in row:

                   print(cell.value)

#因為是按列,所以返回A1,A2,A3這樣的順序

for column in sheet.columns:

         for cell in column:

                   print(cell.value)

因為sheet.rows是生成器類型,不能使用索引,轉換成list之后再使用索引,list(sheet.rows)[2]這樣就獲取到第二行的tuple對象。

獲得任意區間的單元格
可以使用range函數,下面的寫法,獲得了以A1為左上角,B3為右下角矩形區域的所有單元格。注意range要從1開始的,因為在openpyxl中為了和Excel保持一致,以1表示第一個值。

for i in range(1,4):

         for j in range(1,3):

                   print(sheet.cell(row=i,column=j))

寫入單元格
ws['A4'] = 4  #直接給單元格賦值
ws.cell(row = 4, column = 2).value = 'test' #通過cell函數給單元格賦值
ws.cell(row = 4, column = 2, value = 'test') #通過cell函數給單元格賦值

ws["A1"] = "=SUM(1, 1)"  #通過公式計算產生寫入的值
ws["A1"] = "=SUM(B1:C1)" #通過公式計算產生寫入的值
ws['B9']='=AVERAGE(B2:B8)' #通過公式計算產生寫入的值
但是如果是讀取的時候需要加上data_only=True這樣讀到B9返回的就是數字,如果不加這個參數,返回的將是公式本身'=AVERAGE(B2:B8)'

append函數按行寫入

append函數可以一次添加多行數據,從第一行空白行開始(下面都是空白行)寫入。append函數只能按行寫入

#添加一行
row=[1,2,3,4,5]
sheet.append(row)

#添加多行

import openpyxl
fe=openpyxl.Workbook("C:\\Programs\\22gg.xlsx")
fs=fe.create_sheet("tt")
rows=[
['Num','a','d'],
[2,40,30],
[3,40,25],
[4,50,30],
[5,30,10],
[6,25,5],
[7,50,10],
]

for row in rows:
    fs.append(row)
fe.save("C:\\Programs\\22gg.xlsx")
#-*-encoding:utf-*-
import openpyxl

ll=[]
fe=openpyxl.Workbook("C:\\Programs\\11gg.xlsx")
fs=fe.create_sheet("tt")

with open("C:\\Programs\\22gg.txt",'r',encoding="utf-8") as fwd:
    for line in fwd.readlines():
        yy=[]
        yy.append(line)#openpyxl中寫入Excel的數據需是列表型的,所先先將每行放入列表,再將列表放入列表
        ll.append(yy)

for rr in ll:
    fs.append(rr)
fe.save("C:\\Programs\\11gg.xlsx")

 

如果我們想按列寫入呢。如果把上面的列表嵌套看作矩陣。只要將矩陣轉置就可以了。使用zip()函數可以實現,不過內部的列表變成了元組就是了。都是可迭代對象,不影響。

sheet.append(list(zip(*rows)))

合並單元格cell
合並單元格,合並后只可以往左上角寫入數據,也就是區間中左邊的坐標。如果這些要合並的單元格都有數據,只會保留左上角的數據,其他則丟棄

wb = Workbook()
ws = wb.active

sheet.merge_cells('B1:G1')#合並一行中的幾個單元格
sheet.merge_cells('A1:C3')#合並一個矩形區域中的單元格

# or
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)

拆分單元格cell
拆分后,值回到A1位置。
sheet.unmerge_cells('A1:C3')

應用樣式
可以直接應用到單元格:
from openpyxl.workbook import Workbook
from openpyxl.styles import Font, Fill
wb = Workbook()
ws = wb.active
c = ws['A1']
c.font = Font(size=12)

可以對整行整列設置樣式,前提是單元格已創建。
col = ws.column_dimensions['A']
col.font = Font(bold=True)
row = ws.row_dimensions[1]
row.font = Font(underline="single")

復制樣式樣:
from openpyxl.styles import Font
ft1 = Font(name='Arial', size=14)
ft2 = ft1.copy(name="Tahoma") # 復制時指定字體為“Tahoma”,其他屬性均復制自ft1

數據格式
數據格式屬性number_format的值是字符串類型,不為對象,直接賦值即可。
openpyxl內置了一些數據格式查看openpyxl.styles.numbers,也支持excel自定義格式,以下兩種方式效果相同:

# 使用openpyxl內置的格式
from openpyxl.styles import numbers
ws.cell['D2'].number_format = numbers.FORMAT_GENERAL
ws.cell(row=2, column=4).number_format = numbers.FORMAT_DATE_XLSX15

# 直接使用字符串

import datetime
from openpyxl import Workbook
wb = Workbook()
ws = wb.active

ws.cell['D2].number_format = 'General'
ws['A1'] = datetime.datetime(2010, 7, 21)
ws.cell(row=2, column=4).number_format = 'd-mmm-yy'
ws['A1'].number_format #'yyyy-mm-dd h:mm:ss'

頁面設置
from openpyxl.workbook import Workbook

wb = Workbook()
ws = wb.active

ws.page_setup.orientation = ws.ORIENTATION_LANDSCAPE
ws.page_setup.paperSize = ws.PAPERSIZE_TABLOID
ws.page_setup.fitToHeight = 0
ws.page_setup.fitToWidth = 1

3.8折疊列(大綱)
import openpyxl
wb = openpyxl.Workbook()
ws = wb.create_sheet()
ws.column_dimensions.group('A','D', hidden=True)
wb.save('group.xlsx')

3.9獲得列號的字母

from openpyxl.utils import get_column_letter

for  x  in  range( 1, len(record)+ 1 ): 

    col = get_column_letter(x)    # 默認x從1開始

    ws.cell( '%s%s' %(col, i)).value = x

通過列字母獲取多個excel數據塊

cell_range = "E3:{0}28".format(get_column_letter(bc_col))

ws["A1"] = "=SUM(%s)"%cell_range

3.10保存到文件

wb = Workbook()
wb.save('balances.xlsx')#save會在不提示的情況下用現在寫的內容,覆蓋掉原文件中的所有內容

3.11插入一個圖片
from openpyxl import Workbook
from openpyxl.drawing.image import Image

wb = Workbook()
ws = wb.active
ws['A1'] = 'You should see three logos below'

# create an image
img = Image('logo.png')

# add to worksheet and anchor next to cells
ws.add_image(img, 'A1')
wb.save('logo.xlsx')

 

四、圖表

4.1創建一個圖表

至少有一個系列的圖表是由一個或更多的數據點。 系列 本身是由引用單元格范圍。
from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference, Series

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")
wb.save("SampleChart.xlsx")
默認圖的左上角是單元格E15和錨定大約5列14行。其他的錨 可能看到 openpyxl.drawing.spreadsheet_drawing 為進一步的信息。

4.2面積圖(二維)

面積圖類似於直線圖之外,下面的區域畫線。 不同的變異可通過設置分組€œstandarda€,一個€œstackeda€或€œpercentStackeda€; 一個€œstandarda€是默認的。

from openpyxl import Workbook from openpyxl.chart import AreaChart,Reference,Series wb = Workbook() ws = wb.active rows = [ ['Number', 'Batch 1', 'Batch 2'], [2, 40, 30], [3, 40, 25], [4, 50, 30], [5, 30, 10], [6, 25, 5], [7, 50, 10], ] for row in rows: ws.append(row) chart = AreaChart() chart.title = "Area Chart" chart.style = 13 chart.x_axis.title = 'Test' chart.y_axis.title = 'Percentage' cats = Reference(ws, min_col=1, min_row=1, max_row=7) data = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=7) chart.add_data(data, titles_from_data=True) chart.set_categories(cats) ws.add_chart(chart, "A10") wb.save("area.xlsx")

 

4.3面積圖(三維)

from openpyxl import Workbook from openpyxl.chart import AreaChart3D,Reference,Series wb = Workbook() ws = wb.active rows = [ ['Number', 'Batch 1', 'Batch 2'], [2, 30, 40], [3, 25, 40], [4 ,30, 50], [5 ,10, 30], [6, 5, 25], [7 ,10, 50], ] for row in rows: ws.append(row) chart = AreaChart3D() chart.title = "Area Chart" chart.style = 13 chart.x_axis.title = 'Test' chart.y_axis.title = 'Percentage' chart.legend = None cats = Reference(ws, min_col=1, min_row=1, max_row=7) data = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=7) chart.add_data(data, titles_from_data=True) chart.set_categories(cats) ws.add_chart(chart, "A10") wb.save("area3D.xlsx")

3 d區域圖

4.4柱狀圖表

垂直、水平和堆疊柱形圖表

from openpyxl import Workbook from openpyxl.chart import BarChart, Series, Reference wb = Workbook(write_only=True) ws = wb.create_sheet() rows = [ ('Number', 'Batch 1', 'Batch 2'), (2, 10, 30), (3, 40, 60), (4, 50, 70), (5, 20, 10), (6, 10, 40), (7, 50, 30), ] for row in rows: ws.append(row) chart1 = BarChart() chart1.type = "col" chart1.style = 10 chart1.title = "Bar Chart" chart1.y_axis.title = 'Test number' chart1.x_axis.title = 'Sample length (mm)' data = Reference(ws, min_col=2, min_row=1, max_row=7, max_col=3) cats = Reference(ws, min_col=1, min_row=2, max_row=7) chart1.add_data(data, titles_from_data=True) chart1.set_categories(cats) chart1.shape = 4 ws.add_chart(chart1, "A10") from copy import deepcopy chart2 = deepcopy(chart1) chart2.style = 11 chart2.type = "bar" chart2.title = "Horizontal Bar Chart" ws.add_chart(chart2, "G10") chart3 = deepcopy(chart1) chart3.type = "col" chart3.style = 12 chart3.grouping = "stacked" chart3.overlap = 100 chart3.title = 'Stacked Chart' ws.add_chart(chart3, "A27") chart4 = deepcopy(chart1) chart4.type = "bar" chart4.style = 13 chart4.grouping = "percentStacked" chart4.overlap = 100 chart4.title = 'Percent Stacked Chart' ws.add_chart(chart4, "G27") wb.save("bar.xlsx")

"Sample bar charts"

4.5柱狀圖表(三維)

from openpyxl import Workbook from openpyxl.chart import Reference,Series,BarChart3D wb = Workbook() ws = wb.active rows = [ (None, 2013, 2014), ("Apples", 5, 4), ("Oranges", 6, 2), ("Pears", 8, 3) ] for row in rows: ws.append(row) data = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=4) titles = Reference(ws, min_col=1, min_row=2, max_row=4) chart = BarChart3D() chart.title = "3D Bar Chart" chart.add_data(data=data, titles_from_data=True) chart.set_categories(titles) ws.add_chart(chart, "E5") wb.save("bar3d.xlsx")

"Sample 3D bar chart"

 

4.6泡沫圖表(bubble chart

泡沫圖類似於散點圖但使用第三個維度確定氣泡的大小。 圖表可以包括多個系列。

from openpyxl import Workbook from openpyxl.chart import Series, Reference, BubbleChart wb = Workbook() ws = wb.active rows = [ ("Number of Products", "Sales in USD", "Market share"), (14, 12200, 15), (20, 60000, 33), (18, 24400, 10), (22, 32000, 42), (), (12, 8200, 18), (15, 50000, 30), (19, 22400, 15), (25, 25000, 50), ] for row in rows: ws.append(row) chart = BubbleChart() chart.style = 18 # use a preset style # add the first series of data xvalues = Reference(ws, min_col=1, min_row=2, max_row=5) yvalues = Reference(ws, min_col=2, min_row=2, max_row=5) size = Reference(ws, min_col=3, min_row=2, max_row=5) series = Series(values=yvalues, xvalues=xvalues, zvalues=size, title="2013") chart.series.append(series) # add the second xvalues = Reference(ws, min_col=1, min_row=7, max_row=10) yvalues = Reference(ws, min_col=2, min_row=7, max_row=10) size = Reference(ws, min_col=3, min_row=7, max_row=10) series = Series(values=yvalues, xvalues=xvalues, zvalues=size, title="2014") chart.series.append(series) # place the chart starting in cell E1 ws.add_chart(chart, "E1") wb.save("bubble.xlsx")

"Sample bubble chart"

4.7線圖表

線圖表允許數據繪制與固定軸。類似於條形圖有三種線路圖:標准、堆放、percentStacked。

from datetime import date
from openpyxl import Workbook
from openpyxl.chart import LineChart,Reference
from openpyxl.chart.axis import DateAxis
from copy import deepcopy

wb = Workbook()
ws = wb.active

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)

#Line Chart
c1 = LineChart()
c1.title = "Line Chart"
c1.style = 13
c1.y_axis.title = 'Size'
c1.x_axis.title = 'Test Number'
data = Reference(ws, min_col=2, min_row=1, max_col=4, max_row=7)
c1.add_data(data, titles_from_data=True)

# Style the lines
s1 = c1.series[0]
s1.marker.symbol = "triangle"
s1.marker.graphicalProperties.solidFill = "FF0000" # Marker filling
s1.marker.graphicalProperties.line.solidFill = "FF0000" # Marker outline
s1.graphicalProperties.line.noFill = True

s2 = c1.series[1]
s2.graphicalProperties.line.solidFill = "00AAAA"
s2.graphicalProperties.line.dashStyle = "sysDot"
s2.graphicalProperties.line.width = 100050 # width in EMUs

s2 = c1.series[2]
s2.smooth = True # Make the line smooth

ws.add_chart(c1, "A10")

#Stacked Line Line表
stacked = deepcopy(c1)
stacked.grouping = "stacked"
stacked.title = "Stacked Line Chart"
ws.add_chart(stacked, "A27")

#Percent Stacked Line表
percent_stacked = deepcopy(c1)
percent_stacked.grouping = "percentStacked"
percent_stacked.title = "Percent Stacked Line Chart"
ws.add_chart(percent_stacked, "A44")

# date axis表
c2 = LineChart()
c2.title = "Date axis Chart"
c2.style = 2 #線條的style,Max value is 48 2 10

#設置Y軸
c2.y_axis.title = "Size"
#c2.y_axis.crossAx = 100
c2.y_axis.scaling.min = 0 #y坐標的區間
c2.y_axis.scaling.max = 70 #y坐標的區間

#設置X軸
c2.x_axis.title = "Date"
#c2.x_axis = DateAxis(crossAx=100)
c2.x_axis.number_format = 'd-mmm' #規定日期格式
c2.x_axis.majorTimeUnit = "days" #規定日期間隔
dates2 = Reference(ws, min_col=1, min_row=2, max_col=1, max_row=7) #引用由行列所描述的區域內的數據
c2.set_categories(dates2) #設置X軸坐標類別

#向圖表中加入數據
dates = Reference(ws, min_col=2, min_row=1, max_col=4, max_row=7) #引用由行列所描述的區域內的數據
c2.add_data(dates, titles_from_data=True)

#設置圖表在表格中的起始位置
ws.add_chart(c2, "A61")

#保存表格
wb.save("line.xlsx")

"Sample line charts"

4.8線圖表(三維)

from datetime import date from openpyxl import Workbook from openpyxl.chart import LineChart3D, Reference from openpyxl.chart.axis import DateAxis wb = Workbook() ws = wb.active 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) c1 = LineChart3D() c1.title = "3D Line Chart" c1.legend = None c1.style = 15 c1.y_axis.title = 'Size' c1.x_axis.title = 'Test Number' data = Reference(ws, min_col=2, min_row=1, max_col=4, max_row=7) c1.add_data(data, titles_from_data=True) ws.add_chart(c1, "A10") wb.save("line3D.xlsx")

"Sample 3D line chart"

4.9散點圖

分散、xy圖類似於一些線形圖。 的主要區別 是一個系列策划反對另一個值。 這是有用的, 值是無序的。

from openpyxl import Workbook from openpyxl.chart import ScatterChart,Reference,Series wb = Workbook() ws = wb.active rows = [ ['Size', 'Batch 1', 'Batch 2'], [2, 40, 30], [3, 40, 25], [4, 50, 30], [5, 30, 25], [6, 25, 35], [7, 20, 40], ] for row in rows: ws.append(row) chart = ScatterChart() chart.title = "Scatter Chart" chart.style = 13 chart.x_axis.title = 'Size' chart.y_axis.title = 'Percentage' xvalues = Reference(ws, min_col=1, min_row=2, max_row=7) for i in range(2, 4): values = Reference(ws, min_col=i, min_row=1, max_row=7) series = Series(values, xvalues, title_from_data=True) chart.series.append(series) ws.add_chart(chart, "A10") wb.save("scatter.xlsx")

"Sample scatter chart"

4.10餅圖

餅圖繪制數據作為一個圓片每片代表 整體的百分比。 片繪制在順時針方向為0° 在頂部的圓。 餅圖只能把一個系列的 數據。 圖表的標題將默認的標題。

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) 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" # Cut the first slice out of the pie 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" # split by value 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' # split by position ws.add_chart(projected_bar, "A27") wb.save("pie.xlsx")

"Sample pie chart"

4.11餅圖(三維)

from openpyxl import Workbook from openpyxl.chart import PieChart3D,Reference data = [ ['Pie', 'Sold'], ['Apple', 50], ['Cherry', 30], ['Pumpkin', 10], ['Chocolate', 40], ] wb = Workbook() ws = wb.active for row in data: ws.append(row) pie = PieChart3D() labels = Reference(ws, min_col=1, min_row=2, max_row=5) 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" ws.add_chart(pie, "D1") wb.save("pie3D.xlsx")

"Sample 3D pie chart"

 

4.12散列餅圖

油炸圈餅圖表類似於餅圖,除了他們使用一枚戒指 一個圓。 他們還可以情節幾個系列的數據如同心圓。

from openpyxl import Workbook from openpyxl.chart import DoughnutChart,Reference,Series from openpyxl.chart.series import DataPoint data = [ ['Pie', 2014, 2015], ['Plain', 40, 50], ['Jam', 2, 10], ['Lime', 20, 30], ['Chocolate', 30, 40], ] wb = Workbook() ws = wb.active for row in data: ws.append(row) chart = DoughnutChart() labels = Reference(ws, min_col=1, min_row=2, max_row=5) data = Reference(ws, min_col=2, min_row=1, max_row=5) chart.add_data(data, titles_from_data=True) chart.set_categories(labels) chart.title = "Doughnuts sold by category" chart.style = 26 # Cut the first slice out of the doughnut slices = [DataPoint(idx=i) for i in range(4)] plain, jam, lime, chocolate = slices chart.series[0].data_points = slices plain.graphicalProperties.solidFill = "FAE1D0" jam.graphicalProperties.solidFill = "BB2244" lime.graphicalProperties.solidFill = "22DD22" chocolate.graphicalProperties.solidFill = "61210B" chocolate.explosion = 10 ws.add_chart(chart, "E1") from copy import deepcopy chart2 = deepcopy(chart) chart2.title = None data = Reference(ws, min_col=3, min_row=1, max_row=5) series2 = Series(data, title_from_data=True) series2.data_points = slices chart2.series.append(series2) ws.add_chart(chart2, "E17") wb.save("doughnut.xlsx")

"Sample doughnut charts"

4.13雷達圖表

數據按行或列在一個表可以繪制 雷達圖表。 雷達圖表比較多個數據的聚合值 系列。 它實際上是一個圓軸的投影面積圖。

有兩種類型的雷達圖表:標准,該地區使用一個標記 行; ,在整個地區在哪里填滿。 額外的 輸入一個€œmarkera€沒有影響。 如果標記所需的這些可以設置 相關的系列。

from openpyxl import Workbook from openpyxl.chart import RadarChart,Reference wb = Workbook() ws = wb.active rows = [ ['Month', "Bulbs", "Seeds", "Flowers", "Trees & shrubs"], ['Jan', 0, 2500, 500, 0,], ['Feb', 0, 5500, 750, 1500], ['Mar', 0, 9000, 1500, 2500], ['Apr', 0, 6500, 2000, 4000], ['May', 0, 3500, 5500, 3500], ['Jun', 0, 0, 7500, 1500], ['Jul', 0, 0, 8500, 800], ['Aug', 1500, 0, 7000, 550], ['Sep', 5000, 0, 3500, 2500], ['Oct', 8500, 0, 2500, 6000], ['Nov', 3500, 0, 500, 5500], ['Dec', 500, 0, 100, 3000 ], ] for row in rows: ws.append(row) chart = RadarChart() chart.type = "filled" labels = Reference(ws, min_col=1, min_row=2, max_row=13) data = Reference(ws, min_col=2, max_col=5, min_row=1, max_row=13) chart.add_data(data, titles_from_data=True) chart.set_categories(labels) chart.style = 26 chart.title = "Garden Centre Sales" chart.y_axis.delete = True ws.add_chart(chart, "A17") wb.save("radar.xlsx")

 

4.14股票圖表

from datetime import date from openpyxl import Workbook from openpyxl.chart import BarChart,StockChart,Reference,Series from openpyxl.chart.axis import DateAxis, ChartLines from openpyxl.chart.updown_bars import UpDownBars wb = Workbook() ws = wb.active rows = [ ['Date', 'Volume','Open', 'High', 'Low', 'Close'], ['2015-01-01', 20000, 26.2, 27.20, 23.49, 25.45, ], ['2015-01-02', 10000, 25.45, 25.03, 19.55, 23.05, ], ['2015-01-03', 15000, 23.05, 24.46, 20.03, 22.42, ], ['2015-01-04', 2000, 22.42, 23.97, 20.07, 21.90, ], ['2015-01-05', 12000, 21.9, 23.65, 19.50, 21.51, ], ] for row in rows: ws.append(row) # High-low-close c1 = StockChart() labels = Reference(ws, min_col=1, min_row=2, max_row=6) data = Reference(ws, min_col=4, max_col=6, min_row=1, max_row=6) c1.add_data(data, titles_from_data=True) c1.set_categories(labels) for s in c1.series: s.graphicalProperties.line.noFill = True # marker for close s.marker.symbol = "dot" s.marker.size = 5 c1.title = "High-low-close" c1.hiLowLines = ChartLines() # Excel is broken and needs a cache of values in order to display hiLoLines :-/ from openpyxl.chart.data_source import NumData, NumVal pts = [NumVal(idx=i) for i in range(len(data) - 1)] cache = NumData(pt=pts) c1.series[-1].val.numRef.numCache = cache ws.add_chart(c1, "A10") # Open-high-low-close c2 = StockChart() data = Reference(ws, min_col=3, max_col=6, min_row=1, max_row=6) c2.add_data(data, titles_from_data=True) c2.set_categories(labels) for s in c2.series: s.graphicalProperties.line.noFill = True c2.hiLowLines = ChartLines() c2.upDownBars = UpDownBars() c2.title = "Open-high-low-close" # add dummy cache c2.series[-1].val.numRef.numCache = cache ws.add_chart(c2, "G10") # Create bar chart for volume bar = BarChart() data = Reference(ws, min_col=2, min_row=1, max_row=6) bar.add_data(data, titles_from_data=True) bar.set_categories(labels) from copy import deepcopy # Volume-high-low-close b1 = deepcopy(bar) c3 = deepcopy(c1) c3.y_axis.majorGridlines = None c3.y_axis.title = "Price" b1.y_axis.axId = 20 b1.z_axis = c3.y_axis b1.y_axis.crosses = "max" b1 += c3 c3.title = "High low close volume" ws.add_chart(b1, "A27") ## Volume-open-high-low-close b2 = deepcopy(bar) c4 = deepcopy(c2) c4.y_axis.majorGridlines = None c4.y_axis.title = "Price" b2.y_axis.axId = 20 b2.z_axis = c4.y_axis b2.y_axis.crosses = "max" b2 += c4 ws.add_chart(b2, "G27") wb.save("stock.xlsx")

 


免責聲明!

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



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