代碼在最下方,伸手黨直接滾動到最後html
須要從Excel中加載到內存中,轉換爲class對象執行操做python
setattr、getattrapp
class Person(): name = None def __init__(self, name): self.name = name p = Person("laowang") n = getattr(p, "name") print(n) # 打印結果: laowang setattr(p, "name", "laoxu") n2 = getattr(p, "name") print(n2) # 打印結果: laoxu
反射實例化對象學習
class Person(): name = None def print_sth(self): print("測試實例化方法", self.name) def test(clazz): """ 實例化對象 :param clazz: 要實例化的類型 """ x = clazz() setattr(x, "name", "老王") x.print_sth() # 打印: 測試實例化方法 老王 test(Person)
建立Excel測試
from openpyxl import Workbook wb = Workbook() ws1 = wb.active ws1.append(['name', 'age', 'isManager', 'remark']) ws1.append(['', '', '', ' ']) ws1.append(['老王', '18', 'false', ' ']) ws1.append(['laoxu', '28.4', 'TRUE', 'zaoricaifuziyou']) ws1.append(['', '', '', ' ']) ws2 = wb.create_sheet("ws2") ws2.append(['name', 'age', 'isManager', 'remark']) ws2.append(['小李', '50', 'TRuE', 'fly knife']) ws2.append(['', '', '', ' ']) ws2.append(['aaa', '11', 'false', 'hehehe']) wb.save("test_convert_2_class.xlsx")
讀取Excelexcel
from openpyxl import Workbook def print_row(arr): """爲了顯示方便,打印行""" for item in arr: print(item,end="\t\t|") print() # 讀取上一個代碼塊建立的Excel代碼 work_book = load_workbook("test_convert_2_class.xlsx") result = [] for sheet_name in work_book.sheetnames: print("-----------------",sheet_name,"-----------------") ws = work_book[sheet_name] # 獲取表頭 table_heads = [] for title_row in ws.iter_rows(max_row=1): for cell in title_row: table_heads.append(cell.value) print_row(table_heads) # 獲取表數據 table = [] for row in ws.iter_rows(min_row=2): row_data=[] for column_index in range(len(row)): row_data.append(row[column_index].value) print_row(row_data) # 打印結果以下: # ----------------- Sheet ----------------- # name |age |isManager |remark | # None |None |None | | # 老王 |18 |false | | # laoxu |28.4 |TRUE |zaoricaifuziyou | # None |None |None | | # ----------------- ws2 ----------------- # name |age |isManager |remark | # 小李 |50 |TRuE |fly knife | # None |None |None | | # aaa |11 |false |hehehe |
excel_helper.pycode
import os import re from os.path import isfile from openpyxl import load_workbook, Workbook def _convert_value(value): """ 將單元格中數據,區分基本類型 相似"true"/"false"(不區分大小寫)轉換爲bool值 長得像數字的轉換爲float類型 其餘(空格、空行)轉換爲None :param value: 單元格的值 :return: 轉換後的類型 """ value_str = str(value).lower() if value_str == 'true': return True elif value_str == 'false': return False elif re.match(r"^[+|-]?\d+.?\d*$", value_str): return float(value_str) elif re.match(r"^\s*$", value_str): return None else: return value class ExcelHelper: """ Excel幫助類 """ @classmethod def convert_2_class(cls, file_path, clazz): """ 轉換爲class,可轉換多張sheet表,轉換爲統一clazz對象 過濾掉爲空行 :param file_path:Excel文件路徑 :param clazz:結果轉換爲clazz對象 :return: 對象列表的列表,結構爲[[clazz(),clazz()],[clazz()]] """ if not file_path.endswith(".xlsx"): raise ValueError("文件必須爲.xlsx結尾的Excel文件") if not isfile(file_path): raise FileNotFoundError("文件路徑 {0} 不存在".format(file_path)) work_book = load_workbook(file_path) result = [] for sheet_name in work_book.sheetnames: ws = work_book[sheet_name] # 獲取表頭 table_heads = [] for title_row in ws.iter_rows(max_row=1): for cell in title_row: table_heads.append(cell.value) # 獲取表數據 table = [] for row in ws.iter_rows(min_row=2): # 實例化對象 instance = clazz() for column_index in range(len(row)): setattr(instance, table_heads[column_index], _convert_value(row[column_index].value)) # 過濾空行(全部屬性均爲None的對象) is_valid = False for attr in instance.__dict__: if not attr.startswith("_") and instance.__dict__[attr] is not None: is_valid = True break if is_valid: table.append(instance) result.append(table) return result @classmethod def save(cls, file_path, tables): if not file_path.endswith(".xlsx"): raise ValueError("文件必須爲.xlsx結尾的Excel文件") work_book = Workbook() is_first = True for table in tables: if is_first: ws = work_book.active is_first = False else: ws = work_book.create_sheet() # 添加表頭 table_heads = [] for attr in table[0].__dict__: # 過濾"_"開頭的屬性 if not attr.startswith("_"): table_heads.append(attr) ws.append(table_heads) # 添加數據 for row in table: data = [] for head in table_heads: data.append(getattr(row, head)) ws.append(data) try: # 生成保存文件夾路徑 folder_index = max(file_path.rfind("\\"), file_path.rfind("/")) if folder_index != -1: folder_path = file_path[0:folder_index] if not os.path.exists(folder_path): os.mkdir(folder_path) work_book.save(file_path) except Exception: raise OSError("建立Excel失敗")
使用方法orm
# 導入類 from excel_helper import ExcelHelper # 示例對象 class A: name=None age=None isManager=None # 讀取Excel文件,並轉換爲指定類型對象列表 tables = ExcelHelper.convert_2_class("123.xlsx", A) # 保存爲Excel a1=A() table=[a1] ExcelHelper.save("456.xls", [table])
注意htm
表1-1對象
name | age | isManager |
---|---|---|
老王 | 18 | True |
Tom | 28 | FALSE |
參考資料
以上