使用python操作Excel——xlrd、xlwt、xlutils库

一、使用xlrd进行读操作

打开workbook

import xlrd
wb = xlrd.open_workbook('mywokbook.xls')

检查表单名字

wb.sheet_names()

获取sheet表

sh = wb.sheet_by_index(0)  # 索引获取
sh = wb.sheet_by_name('Sheet01')  # 名字获取

递归打印所有行数据

for n in range(sh.nrows):
    print sh.row_values(n)

返回第N列数据

first_column = sh.col_values(N)

通过索引读取某单元格数据

cell_A1 = sh.cell(0, 0).value

 

二、使用xlwt进行写操作

初始化workbook对象,之后才能进行写入操作

import xlwt
wbk = xlwt.Workbook()
sheet = wbk.add_sheet('sheet2')

写入数据

sheet.write(0, 1, 'new text')

保存文件

wbk.save('new.xls')

注意:修改表单内容,需要使用cell_overwrite_ok=True来创建worksheet

sheet2 = wbk.add_sheet('sheet2', cell_overwrite_ok=True)
sheet2.write(0, 0, 'text')
sheet2.write(0, 0, 'altertext')

 

三、使用xlutils进行修改操作

Python中一般使用xlrd(excel read)来读取Excel文件,使用xlwt(excel write)来生成Excel文件(可以控制Excel中单元格的格式),需要注意的是,用xlrd读 取excel是不能对其进行操作的:xlrd.open_workbook()方法返回xlrd.Book类型,是只读的,不能对其进行操作。而 xlwt.Workbook()返回的xlwt.Workbook类型的save(filepath)方法可以保存excel文件。因此对于读取和生成Excel文件都非常容易处理,但是对于已经存在的Excel文件进行修改就比较麻烦了。不过,还有一个xlutils(依赖于xlrd和xlwt)提供复制excel文件内容和修改文件的功能。其实际也只是在xlrd.Book和xlwt.Workbook之间建立了一个管道而已,如下图:

xlutils.copy模块的copy()方法实现这个功能

from xlrd import open_workbook
from xlutils.copy import copy

rb = open_workbook('D:\\text.xls')

# 通过get_sheet()获取的sheet才有write()方法
wb = copy(rb)
ws = wb.get_sheet(0)
ws.write(0, 0, 'changed!')

wb.save('D:\\new.xls')

 

四、实际工作使用

将公司采购单转换成苗木平台生成的Excel模板,采购单总共76条数据,模板14种苗木分类。

采购数据样式:

使用python操作Excel——xlrd、xlwt、xlutils库_第1张图片

苗木平台模板数据样式:

使用python操作Excel——xlrd、xlwt、xlutils库_第2张图片

生成的Excel表格

使用python操作Excel——xlrd、xlwt、xlutils库_第3张图片

偷了个懒,比如时间数据的格式没进行设置,实际代码如下

import re
import xlrd
import xlwt
from xlutils.copy import copy


# 打开sheet表
def open_sheet(xl_name):
	xl = xlrd.open_workbook(xl_name)
	xl_sheet = xl.sheets()[0]
	return xl_sheet


# 将原文件的采购行插入匹配模板的采购行
def insert_mb(L, line_no, ws):
	for x in range(len(L)):
		one_tree = L[x]
		line_no += 1
		for i in range(mb_sheet.nrows):
			if i == 1:
				ws.write(line_no, i, tree_classify(one_tree[2]))
			if i == 2:
				ws.write(line_no, i, one_tree[2])
			if i == 3:
				ws.write(line_no, i, one_tree[7])
			if i == 4:
				ws.write(line_no, i, '43485')
			if i == 7:
				ws.write(line_no, i, tree_classify(str(one_tree[3])))
			if i == 8:
				ws.write(line_no, i, one_tree[4])
			if i == 9:
				ws.write(line_no, i, one_tree[5])
			if i == 12:
				ws.write(line_no, i, one_tree[-1])


# 处理采购项名称
def tree_classify(tree_name):
	s = re.sub('[A-Z]', '', tree_name)
	s = s.split('(')[0]
	return s


# 查找模板中苗木某种分类的行号
def search_no(sheet, class_no):
	for i in range(len(col_data)):
		if class_no == 1 and col_data[i] == '一':
			line_no = i
		elif class_no == 2 and col_data[i] == '二':
			line_no = i
		elif class_no == 3 and col_data[i] == '三':
			line_no = i
		elif class_no == 4 and col_data[i] == '四':
			line_no = i
		elif class_no == 5 and col_data[i] == '五':
			line_no = i
		elif class_no == 6 and col_data[i] == '六':
			line_no = i
	return line_no


# 读取所有的采购项并按序号分类
def load_class_no(class_no, sheet):
	L = []
	for i in range(4, sheet.nrows-6):
		one_tree = sheet.row_values(i)[:-8]
		if one_tree[0] == class_no:
			L.append(one_tree)
	return L


# copy模板才可以修改
def copy_alter(sheet):
	cp_sheet = copy(sheet)



if __name__ == '__main__':
	order_name = '副本径河项目苗木采购审批表.xlsx'
	mb_name = 'Copy of importBuyList_ex.xls'
	tree_sheet = open_sheet(order_name)
	mb_sheet = open_sheet(mb_name)
	# 模板中第一列的数据
	col_data = mb_sheet.col_values(0)

	# copy后模板才可以修改
	mb = xlrd.open_workbook(mb_name)
	cp_sheet = copy(mb)
	wr_sheet = cp_sheet.get_sheet(0)

	for no in range(1, 7):
		class_trees = load_class_no(no, tree_sheet)
		line_no = search_no(wr_sheet, no)
		insert_mb(class_trees, line_no, wr_sheet)

	cp_sheet.save('new.xls')

 

你可能感兴趣的:(python)