python 之 自己記錄的幾個快捷方式 - Excel 操作
阿新 • • 發佈:2022-03-31
python 之 自己記錄的幾個快捷方式 - Excel
# -*- coding:utf8 -*- import codecs from openpyxl.styles import Alignment from openpyxl.styles import PatternFill from openpyxl.styles import Font from openpyxl import Workbook, load_workbook from os import remove, path from openpyxl import * import xlrd import csv import xlwt import pandas as pd import xlwings as xw import win32com.client import xlwings as xw import pandas as pd import numpy as np # 將DataFrame轉換成格式化excel的工具 class XlsxSaver: """ 一個將DataFrame轉換成格式化excel的工具 """ def __init__(self, df_in, filename='a.xlsx', sheet_name='Sheet1'): """ df_in : 從一個DataFrame物件獲取表格內容 filename : 檔名 sheet_name : 表名 """ self.filename = filename # 儲存的xlsx檔案的名字 self.user_def = [] # 儲存由使用者自定義的列的列名,這些列不再參與自動計算列寬 if path.exists(filename): # 如果檔案存在,就直接開啟,新增Sheet self.wb = load_workbook(filename) self.sheet = self.wb.create_sheet(sheet_name) else: # 如果檔案不存在,就建立表格 self.wb = Workbook() self.sheet = self.wb.active self.sheet.title = sheet_name # 將df的內容複製給sheet self.df = df_in.copy() self.sheet.append(list(self.df.columns)) for row in range(0, len(list(self.df.index))): for col in range(0, len(list(self.df.columns))): self.sheet.cell(row+2, col+1).value = self.df.iloc[row, col] # 注意:sheet行列從1開始計數 def remove_file(self): remove(self.filename) def set_sheet_name(self, sheet_name): self.sheet.title = sheet_name def set_filename(self, filename): self.filename = filename def get_maxlength(self, series_in, col): """ 獲取一個型別為object的Series中的最大佔位長度,用於確定匯出的xlsx檔案的列寬 col : 表頭,也參與比較,解決有時候表頭過長的問題 """ series = series_in.fillna('-') # 填充空值,防止出現nan str_list = list(series) len_list = [] for elem in str_list + [col]: elem_split = list(elem) length = 0 for c in elem_split: if ord(c) <= 256: length += 1 else: length += 2 len_list.append(length) return max(len_list) def __auto_width(self): cols_list = list(self.df.columns) # 獲取列名 for i in range(0, len(cols_list)): col = cols_list[i] if col in self.user_def: continue self.sheet.cell(1, i+1).font = Font(bold=True) # 加粗表頭 letter = chr(i+65) # 由ASCII值獲得對應的列字母 max_len = self.get_maxlength(self.df[col].astype(str), col) if max_len <= 12: self.sheet.column_dimensions[letter].width = 12 elif max_len <= 50: self.sheet.column_dimensions[letter].width = max_len + 2 else: self.sheet.column_dimensions[letter].width = 50 for cell in self.sheet[letter]: cell.alignment = Alignment(wrap_text=True) def set_width(self, col_name, width): # 提供調整列寬的介面 index = list(self.df.columns).index(col_name) letter = chr(index+65) self.sheet.column_dimensions[letter].width = width self.user_def.append(col_name) def set_color(self, col_name, color, rule): # 提供設定顏色的介面,rule:規則函式 index = list(self.df.columns).index(col_name) letter = chr(index+65) for cell in self.sheet[letter]: if rule(cell.value): cell.fill = PatternFill(fill_type="solid", start_color=color, end_color=color) def set_center_alignment(self, col_name): index = list(self.df.columns).index(col_name) letter = chr(index+65) for cell in self.sheet[letter]: cell.alignment = Alignment(wrap_text=True, horizontal='center') def save(self): # 自動調整列寬,並儲存 self.__auto_width() self.wb.save(self.filename) def set_merge(self, col_name): self.user_def.append(col_name) # 設定為自定義列 # 設定一列合併單元格 index = list(self.df.columns).index(col_name) letter = chr(index+65) i = 1 while True: if i >= self.sheet.max_row: # 結束條件:單元格到底 break cell = self.sheet[letter+str(i)] j = i+1 # 第一步指向下一個單元格 while True: # 這個過程對j進行試探,最終j指向的單元格是與i連續相同的最後一個 cell_next = self.sheet[letter+str(j)] if cell_next.value != cell.value: j -= 1 break else: j += 1 if j > self.sheet.max_row: j -= 1 break if j-i >= 1 and cell.value != '' and cell.value: # 如果有連續兩格以上的單元格內容相同,進行融合 msg = '%s%d:%s%d'%(letter,i,letter,j) self.sheet.merge_cells(msg) # 控制一下格式 self.sheet[letter+str(i)].alignment = Alignment(horizontal='center', vertical='top', wrap_text=True) i = j+1 # 繼續指向下個單元格 # 判斷元素是否為數字 def is_number(s): try: if np.isnan(s) or s == False or s == True: return False except Exception: pass try: # 判斷是否為浮點數 float(s) return True except Exception: pass try: import unicodedata # 處理ASCii碼的包 # 把一個表示數字的字串轉換為浮點數返回的函式 unicodedata.numeric(s) return True except (TypeError, ValueError): pass return False # 獲取Excel class GetExcel(): def __init__(self,file): self.file = file self.wb = load_workbook(self.file) sheets = self.wb.get_sheet_names() self.sheet = sheets[0] self.ws = self.wb[self.sheet] #獲取表格的總行數和總列數 def getRowsClosNum(self): rows = self.ws.max_row columns = self.ws.max_column return rows,columns #獲取某個單元格的值 def getCellValue(self,row,column): cellvalue = self.ws.cell(row=row,column=column).value return cellvalue #獲取某列的所有值 def getColValues(self,column): rows = self.ws.max_row columndata=[] for i in range(1,rows+1): cellvalue = self.ws.cell(row=i,column=column).value columndata.append(cellvalue) return columndata #獲取某行所有值 def getRowValues(self,row): columns = self.ws.max_column rowdata=[] for i in range(1,columns+1): cellvalue = self.ws.cell(row=row,column=i).value rowdata.append(cellvalue) return rowdata #設定某個單元格的值 def setCellValue(self,row,colunm,cellvalue): try: self.ws.cell(row=row,column=colunm).value=cellvalue self.wb.save(self.file) except: self.ws.cell(row=row,column=colunm).value="writefail" self.wb.save(self.file) # xlsx轉csv def xlsx_to_csv(xlsxfile,csvfile): workbook = xlrd.open_workbook(xlsxfile) table = workbook.sheet_by_index(0) with codecs.open(csvfile, 'w', encoding='utf-8') as f: write = csv.writer(f) for row_num in range(table.nrows): row_value = table.row_values(row_num) write.writerow(row_value) # xlsx轉csv ,Pd模式 def xlsx_to_csv_pd(xlsxfile,csvfile): data_xls = pd.read_excel(xlsxfile, index_col=0,engine='xlrd') data_xls.to_csv(csvfile, encoding='utf-8') # csv轉xlsx def csv_to_xlsx(csvfile, xlsxfile): with open(csvfile, 'r', encoding='utf-8') as f: read = csv.reader(f) workbook = xlwt.Workbook() sheet = workbook.add_sheet('data') # 建立一個sheet表格 l = 0 for line in read: print(line) r = 0 for i in line: print(i) sheet.write(l, r, i) # 一個一個將單元格資料寫入 r = r + 1 l = l + 1 workbook.save(xlsxfile) # 儲存Excel # xlsx按行去重 def xlsx_del_weight(filename): app = xw.App(visible=False, add_book=False) wb = app.books.open(filename) sht = wb.sheets[0] myList = sht[0,0].current_region.value tags = [] # m = [] for ds in myList: if ds not in m: m.append(ds) tags.append(True) else: tags.append(False) clean_data = [ds for i,ds in enumerate(myList) if tags[i]] del_data = [ds for i,ds in enumerate(myList) if not tags[i]] del m sht.clear() sht['A1'].value = clean_data wb.save() wb.close() app.kill() # xls轉xlsx def xls_to_xlsx(filename): excel = win32com.client.gencache.EnsureDispatch('Excel.Application') wb = excel.Workbooks.Open(filename) wb.SaveAs(filename+"x", FileFormat = 51) #FileFormat = 51 is for .xlsx extension wb.Close() #FileFormat = 56 is for .xls extension excel.Application.Quit()
內容很雜,都是從其他很多大佬那裡copy過來修改的。如有看到自己內容,記得私聊博主,加上原文連結。(太雜了,很多找不到了,各位大佬見諒!)