今天有朋友问我一个EXCEL的问题,她拿到了两个表,现在需要对表的内容进行融合,如下图所示:
图一所示的表格给出了相应字段的信息,图二就是需要填写的表格。
问题是,图二中存在单元格合并的问题,并且每一个人的信息后面还跟着一行“小计”,所以简单的excel复制粘贴不管用了。尝试使用excel中的vlookup函数,也不管用。总之就是这个合并单元格的问题很麻烦。而图一中的信息有几千条,要是人工一个字段一个字段的粘贴,估计是要死人的节奏。于是我想尝试用python来编写一个读写xls文件的程序,实现数据融合操作。
其中也费了很大的劲,参考了网上xlrt和xlwt模块的读写操作,发现读很容易,写就麻烦了。用网上的代码无法实现写入已有xls文件的操作。后来参考https://www.crifan.com/python_append_new_data_into_existing_excel_xls_file/ 这边的方法,成功实现了对已有xls文件的写入操作。
上面总结如下:
想要,往已经存在的xls文件中,写入新的行,新的数据,对应的逻辑为:
用xlrd.open_workbook打开已有的xsl文件
注意添加参数formatting_info=True,得以保存之前数据的格式
然后用,from xlutils.copy import copy;,之后的copy去从打开的xlrd的Book变量中,拷贝出一份,成为新的xlwt的Workbook变量
然后对于xlwt的Workbook变量,就是正常的:
通过get_sheet去获得对应的sheet
拿到sheet变量后,就可以往sheet中,写入新的数据
写完新数据后,最终save保存
result.write_merge(x, x + m, y, w + n, string, sytle)
x表示行,y表示列,m表示跨行个数,n表示跨列个数,string表示要写入的单元格内容,style表示单元格样式。其中,x,y,w,h,都是以0开始计算的。
具体代码如下:
# -*- coding:utf-8 -*-
import xlrd
import xlwt
from xlutils.copy import copy
def set_style():
style = xlwt.XFStyle() # 初始化样式
borders = xlwt.Borders()
borders.left = 1
borders.right = 1
borders.top = 1
borders.bottom = 1
borders.bottom_colour=0x3A
style.borders = borders
font = xlwt.Font()
font.name = 'Times New Roman'
style.font = font
return style
if __name__ == '__main__':
'''程序默认目的数据表在第一张'''
'''程序直接覆盖目的数据表,务必进行备份以免出现错误不可回退'''
rows = 66 #源数据行数
yuan = '1.xls' #源
mudi = '2.xls' #目的
start_row = 3 #合并单元格的起始行数
leap = 9 #合并单元格的数目
delta = 2 #合并单元格的变化行数
data = xlrd.open_workbook(yuan)
source = data.sheets()[0]
oldwb = xlrd.open_workbook(mudi,formatting_info = True)
newwb= copy(oldwb)
result = newwb.get_sheet(0)
for i in range(0,rows):
row = source.row_values(i)
result.write_merge(start_row,start_row+leap,0,0,i+1,set_style())
for j in range(1,5):
result.write_merge(start_row,start_row+leap,j,j,row[j],set_style())
start_row += leap + 2
if start_row == 14:
leap -= delta
newwb.save('2.xls')
最后记得保存。
上面有些增量的设定是根据上述问题中表格形状的实际情况设定的,反正具体问题具体分析。本文重点解决如何写入已有xls文件的问题。