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)