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’。