【python學習筆記】openpyxl操作excel高階操作


import openpyxl
import os
from openpyxl.styles import Font, PatternFill
from openpyxl import chart
path = os.path.join(os.getcwd(), '項目1', '問題單總體匯總.xlsx')
wb = openpyxl.load_workbook(path, data_only=True)  # 增加data_only=True參數,讀取單元格的內容不會顯示為公式
ws = wb.active
'插入公式'
ws['B82'] = '=sum(B2:B81)'
print(ws['B82'].value)  # 公式計算成功后要保存一次excel文件,要不然讀取的為None,保存一次重新運行獲取正常24548

'''設置行高列寬'''
ws.row_dimensions[1].height = 30  # 行高1個數值表示1/72英寸,大約0.35mm  注意行為數字而非字符串
ws.column_dimensions['A'].width = 70 # 列寬1個數值表示一個字符大小

'''合並和拆分單元格'''
ws.merge_cells('C2:D2')
ws['C2'] = '合並'
ws.unmerge_cells('C2:D2')

'''凍結窗口:凍結對應單元格上一行和左邊一列'''
ws.freeze_panes = 'A2'  # 凍結首行 兩條命令后覆蓋
ws.freeze_panes = 'B1'  # 凍結首列
ws.freeze_panes = 'B2'  # 凍結首行首列 注意沒有解凍

'''創建圖表 柱狀圖'''
'''創建圖表的步驟:
1、讀取數據
2、創建如表對象
3、將數據添加到圖表
4、將圖表添加到對應的表里面'''
maxCol = openpyxl.utils.column_index_from_string('J')
minCol = openpyxl.utils.column_index_from_string('D')
values = openpyxl.chart.Reference(ws, min_row=4, min_col=5, max_col=maxCol, max_row=18) # 引用工作表的單元范圍,用作圖表添加數據
labels = openpyxl.chart.Reference(ws, min_row=5, min_col=minCol, max_row=18) # 引用工作表的單元范圍,用作X軸標簽使用
# chart = openpyxl.chart.BarChart3D() # 柱狀3D圖
chart = openpyxl.chart.BarChart() # 柱狀圖
chart.title = '異常問題單分布情況'
# chart.y_axis.title = '異常問題數量'  # 設置y軸標題
# chart.x_axis.title = '組件' # 設置x軸標題
# chart.legend = None  #取消圖表圖例
chart.add_data(values, titles_from_data=True) # 圖表添加一個范圍數據,每個列視為一個數據系列
chart.set_categories(labels) # 圖表設置類別,X軸標簽
# chart.style = 13 # 圖標樣式 綠色
chart.grouping = "stacked"  # 堆積
# chart.shape = 4
# chart.grouping = "percentStacked"
# chart.type = "col"  # 定義垂直條形圖 默認值
# chart.type = "bar"  # 定義水平條形圖
chart.overlap = 100  # 層疊圖時需要設置重疊為100 來定義使用堆疊圖表
ws.add_chart(chart, 'D21') # 在表中的D21位置插入圖表
wb.save(path)   # 生成excel文件
"插入和刪除行列"
wb = openpyxl.load_workbook('test.xlsx')
ws = wb.active
ws1 = wb.get_sheet_by_name("Sheet1")
"excel寫入內容"
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:
    print(row)
    ws.append(row)
"在表格中插入空行、空列"
ws.insert_rows(3, 2)# 插入的位置、插入的數量:第三行插入兩行
# ws.insert_cols(4) # 插入的位置、插入的數量:第四列插入一列
ws.insert_cols(2, 10) # 插入的位置、插入的數量:第2行插入10列

"在表格中刪除空行、空列"
ws.delete_cols(2, 10)
ws.delete_rows(3, 2)
col = openpyxl.utils.column_index_from_string('D')  # 將字母轉換為數字 100
print(col)
ws.delete_cols(col, 10)

"移動單元格位置"
ws.move_range('A2:B2', rows=-1, cols=1) # 移動單元格范圍、rows參數大於0,向下移動,小於0向上移動,cols大於0向右移動,小於0向左移動;

"保存修改"
wb.save('test.xlsx')

 

"openpyxl提供numpy和pandas交互的接口,pandas基於numpy的基礎,主要使用數據結構是一維數據與二維數據DataFrame"
'''
import pandas as pd
from openpyxl.utils.dataframe import dataframe_to_rows
import numpy as np
'''
dates = pd.date_range("20211122", periods=6)
'''
np.random.randn(6, 4): dn表格每個維度,返回值為指定維度的array 6行4列
'''
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD')) # 行標和列標
print(df)
'''
                   A         B         C         D
2021-11-22 -1.159974 -0.082023 -0.486664 -1.815281
2021-11-23 -0.517931 -1.503639 -0.220602 -0.352718
2021-11-24 -0.150872  0.662365 -0.431215 -0.343600
2021-11-25 -1.298853 -1.774166  0.294895  0.426494
2021-11-26 -3.734309  2.097675 -0.779000 -0.174263
2021-11-27 -1.508636 -0.898556 -1.164526 -1.378445

'''
for r in dataframe_to_rows(df, index=True, header=True):
    ws1.append(r)  # 寫入到excel表格中
wb.save('test.xlsx')
df = pd.DataFrame(ws1.values)
print(df)
'''
           0         1         2         3         4
0        NaT         A         B         C         D
1        NaT      None      None      None      None
2 2021-11-22 -1.159974 -0.082023 -0.486664 -1.815281
3 2021-11-23 -0.517931 -1.503639 -0.220602 -0.352718
4 2021-11-24 -0.150872  0.662365 -0.431215   -0.3436
5 2021-11-25 -1.298853 -1.774166  0.294895  0.426494
6 2021-11-26 -3.734309  2.097675    -0.779 -0.174263
7 2021-11-27 -1.508636 -0.898556 -1.164526 -1.378445
'''

 

"單元格樣式"
from openpyxl.styles import Border, Side, PatternFill

filepath = os.path.join(os.getcwd(), '項目3', 'LLT-10月.xlsx')
wb = openpyxl.load_workbook(filepath)
ws = wb.get_sheet_by_name('1002')

# 設置邊框樣式
th = Side(style='thin', color='000000') #創建一個Side對象,其中框類型為細,顏色RGB為000000  細黑線
# db = Side(style='double', color='ff0000') # 雙層紅線
db = Side(style='thick', color='000000') # 粗線黑色

'''單元格邊框設置'''
# ws['M3'].border = Border(top=db)
# ws['M5'].border = Border(top=db, left=th, right=th, bottom=db)

'''批量邊框填充'''
line_num = 1
"獲取表的大小"
max_row = ws.max_row
max_column = ws.max_column
print(max_row, max_column)
a = openpyxl.utils.get_column_letter(max_column)  # 將數字轉換為字母  CV
end_num = a + str(max_row)
print(end_num)

for line in ws['A1':end_num]:
    for cell in line:
        if line_num == 1:
            cell.fill = PatternFill('solid',fgColor='00CDCD')
            cell.border = Border(left=th, right=th, top=th, bottom=db)
        else:
            cell.border = Border(left=th, top=th, right=th, bottom=th)
    line_num += 1

wb.save(filepath)

  


免責聲明!

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



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