前言
RPA 設計器版本: 2020.2
Python 讀取三種不同存儲格式 Excel 文件
Excel 文件的存儲格式有多種, 有我們平常熟知的二進制格式,也有 HTML 格式,還有 XML 格式的等。
目前,小編接觸到 RPA 項目的 Excel 文件格式主要是上述說的三種格式(二進制、HTML 、XML )
這里需要注意的是:RPA 設計器 2020.2 只支持二進制格式的 Excel 文件讀取
Python 讀取二進制類型的 Excel 文件並返回 DataFrame 對象
這里我直接將讀取 Excel 的操作封裝成函數放在 全局函數 使用,也可以使用 RPA 設計器自帶的讀取 Excel 組件。
def get_data_from_binary_excel(file_path): """ 從 binary 二進制格式的 excel 中獲取數據 :param file_path: :return: DataFrame """ # 讀取Excel 使用 pandas 讀取二進制文件 excel pd_df = pd.read_excel(io=file_path) # 填充 NaN 將 nan 值用空字符串替換 df = rpa_pandas.fillna(df=pd_df) df = pd_df.fillna('') return df
Python 讀取 HTML 類型的 Excel 文件並返回 DataFrame 對象
這里我直接將讀取 Excel 的操作封裝成函數放在 全局函數 中使用
def get_data_from_html_excel(file_path, encoding='utf-8'): """ 從 html 格式的 excel 中獲取數據 :param file_path: :return: DataFrame """ dfs = pd.read_html(file_path, encoding=encoding) pd_df = dfs[0] df = pd_df.fillna('') return df
Python 讀取 XML 類型的 Excel 文件
思路:利用 Python 將 Excel 文件讀取到內存中, 再利用正則表達式從 XML 標簽中取出 Excel 表格中的數據
def get_data_from_xml_excel(file_path): """ 解決 pandas.read_excel() 讀取 excel 解析錯誤問題. 讀取 excel 文件,將每行數據都放入 list 列表中。 返回值有二個,第一個是 excel 表頭的長度,第二個是數據 list 集合 """ try: with open(file_path, 'rb') as tree: content = tree.read().decode('utf-8') # <ss:Cell ss:StyleID="headercell"><ss:Data ss:Type="String">單位</ss:Data></ss:Cell> # <ss:Cell ss:StyleID="headercell"><ss:Data ss:Type="String">單位</ss:Data><ss:NamedCell ss:Name="Print_Titles" /> pattern1 = r"""<ss:Cell ss:StyleID="headercell"><ss:Data ss:Type="String">(.+?)</ss:Data><ss:NamedCell ss:Name="Print_Titles" /></ss:Cell>""" \ r"""|<ss:Cell ss:StyleID="headercell"><ss:Data ss:Type="String">(.+?)</ss:Data></ss:Cell>""" head_iter = re.finditer(pattern1, content) head_list = [] for tpl in head_iter: for i in range(len(tpl.groups())): ele = tpl.groups()[i] if ele is not None: head_list.append(ele) break # <ss:Cell ss:StyleID="odd"><ss:Data ss:Type="String"></ss:Data></ss:Cell> pattern2 = r"""<ss:Cell ss:StyleID="even"><ss:Data ss:Type="String">([\s\S\w\W]*?)</ss:Data></ss:Cell>""" \ r"""|<ss:Cell ss:StyleID="odd"><ss:Data ss:Type="String">([\s\S\w\W]*?)</ss:Data></ss:Cell>""" \ r"""|<ss:Cell ss:StyleID="oddfloat"><ss:Data ss:Type="Number">([\s\S\w\W]*?)</ss:Data></ss:Cell>""" \ r"""|<ss:Cell ss:StyleID="oddfloat"><ss:Data ss:Type="String">([\s\S\w\W]*?)</ss:Data></ss:Cell>""" \ r"""|<ss:Cell ss:StyleID="evenfloat"><ss:Data ss:Type="Number">([\s\S\w\W]*?)</ss:Data></ss:Cell>""" \ r"""|<ss:Cell ss:StyleID="evenfloat"><ss:Data ss:Type="String">([\s\S\w\W]*?)</ss:Data></ss:Cell>""" data_iter = re.finditer(pattern2, content) data_list = [] count = 0 for tpl in data_iter: groups_len = len(tpl.groups()) # print(groups_len, tpl.groups(), tpl.span()) for i in range(groups_len): ele = tpl.groups()[i] # 排除不需要的臟數據 if ele is not None and ele != 'nan' and ele != 'null': data_list.append(ele) break count += 1 # 若為空數據,或者 nan, null ,用空字符串替換 if count == groups_len: data_list.append('') # 每次內循環后都要清零 count = 0 return len(head_list), data_list except Exception as e: print('解析 excel 發生異常 {}'.format(e)) return 0, []