1.讀取Excel
最簡單的方式:使用xlrd模塊
import xlrd xlrd.open_workbook('filename.xls')
注意,可能出現問題,由於可能不是標准的xls文件,可能出現錯誤,如下:
xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b'<html xm'
在StackOverflow上查找原因與解決辦法發現,非標准的Excel文件都會發生該錯誤。使用VsCode打開xls文件,內容頭部如下
此處編碼是html形式,並非標准的Excel, 所以更換模塊pandas進行數據處理,代碼如下:
import pandas as pd from xml.dom.minidom import parse def xls_2_dict_list(xls_path): #列表記錄每一行的數據 bill_list = list() #導入pandas模塊以html形式讀取文件,返回類型為list data_list = pd.read_html(xls_path) for i in range(len(data_list[2])): #使用字典的key-value形式記錄數據(偽代碼) bill_dict = dict().fromkeys(key_list)#key_list為字典的所有key #data_list[0]為Panas處理后的數據幀,類型pandas.core.frame.DataFrame,包含的方法請復制自查,包含多行多列的數據 #使用iat獲取指定行和列的數據 bill_dict['key1'] = data_list[0].iat[1,1] bill_dict['key2'] = data_list[2].iat[i,7] bill_dict['key3'] = data_list[2].iat[i,8] bill_dict['key4'] = data_list[2].iat[i,0] #將字典添加到鏈表中,代表一行數據 bill_list.append(bill_dict) return bill_list
2.操作XML
根據要求:目的是替換節點的值,所以先獲取元素再替換值,然后將模型寫入。代碼如下:
from xml.dom.minidom import parse def dict_2_xml(xml_path,xml_dict): #從文件中解析dom模型 dom = parse('bill_formwork.xml') for k,v in xml_dict.items(): #獲取元素,並替換值 dom.getElementsByTagName(k)[0].childNodes[0].data = v #將更新后的dom模型使用字節流寫入xml文件中 with open(xml_path,'wb',encoding='utf-8') as f: f.write(dom.toxml(encoding='utf-8'))
注意,如果將寫入代碼替換為以下代碼可能會出現中文亂碼的問題(建議使用上面的方法)。原因可能是字符串寫入導致的問題,所以建議使用上面利用字節流寫入而非字符流。
#使用字符流容易造成亂碼問題 with open(xml_path,'w') as f: dom.writexml(f,encoding='utf-8')
其他解決方法,打開文件流時,指定編碼格式,即open函數內添加參數encoding=‘utf-8’。