Flask MongoDB数据库导出Excel文件

导出Excel,使用Python的xlwt库写入Excel表。

1.获取MongoDB数据:

case_obj = OneCaseScheam.objects(version_name=version_name, id=id).first()

其中,case_obj是获取到的对象,OneCaseScheam是数据库表的名称,通过版本名称和id对数据进行查询。

2.写入表头

 title_list = ["name", "text", "model_id"]
 for i, v in enumerate(title_list):
  sheet.write(0, i, v)

3.写入数据

	for data_key in case_list:
		row = 0
		data_list = all_data[data_key]
		for data in data_list:
			sheet.write(row, col, data)
			row += 1
		col += 1

其中,case_list是一个列表,因为我这里的需求是Excel没有表头,所以处理数据要麻烦一步,如果加上表头的话,直接提取字典的value就可以了。data_list是一个字典,字典的value是我每列数据值的列表。这里要特别注意row和col的对应,容易造成写入数据混乱。

4.uuid定义文件名,确保不会出现重复名称导致错误的现象。

fileName = 'case_%s.xls' % (uuid.uuid4().hex)
	

5.关于文件路径的组合

path = os.path.join('static', 'download')

不把路径直接写死是为了避免每个浏览器的路径处理的方式不同,比如斜杠的方向问题。

6.保存

book.save(file_name_store)

file_name_store为具体到文件名称的路径。

7.忘记最重要的了,xlwt的使用。

book = xlwt.Workbook(encoding='utf-8')
	sheet = book.add_sheet('sheet1')

sheet是在增加sheet页的用法,最近再考虑加入多个sheet页。

附上整个代码,虽然针对的项目不同,仅提供参考。

import xlwt
from models import *
import xlrd
import os
import uuid

def write_xls(ids_list, version_name):
	case_name_list = []
	case_text_list = []
	case_model_id_list = []
	module_path_id_list= []
	case_belong_list=[]
	id_lists = ids_list

	for id in id_lists:
		case_obj = OneCaseScheam.objects(version_name=version_name, id=id).first()
		module_obj = ModuleContainCaseScheam.objects(version_name=version_name, case_id=id).first()
		if case_obj:
			case_name_list.append(case_obj.name)
			case_text_list.append(case_obj.text)
			case_model_id_list.append(case_obj.model_id)
			module_path_id_list.append(module_obj.module_path_id)
			case_belong_list.append(module_obj.case_belong)
		else:
			return False ,u'ID为%s的用例导出失败'%id,None

	all_data={'module_path_id_list':module_path_id_list,'case_name_list':case_name_list,'case_text_list':case_text_list,
			  'case_model_id_list':case_model_id_list,'case_belong_list':case_belong_list}

	book = xlwt.Workbook(encoding='utf-8')
	sheet = book.add_sheet('sheet1')
	# 写入标题
	# title_list = ["name", "text", "model_id"]
	# for i, v in enumerate(title_list):
	# 	sheet.write(0, i, v)
	# print list(all_data.keys())
	col = 0
	case_list=['module_path_id_list','case_name_list','case_text_list','case_model_id_list','case_belong_list']
	for data_key in case_list:
		row = 0
		data_list = all_data[data_key]
		for data in data_list:
			sheet.write(row, col, data)
			row += 1
		col += 1

	fileName = 'case_%s.xls' % (uuid.uuid4().hex)
	current_path = os.path.split(os.path.abspath(__file__))[0]
	path = os.path.join('static', 'download')
	path_store = os.path.join(current_path, path)
	if not os.path.exists(path_store):
		os.makedirs(path_store)
	file_name_store = os.path.join(path_store, fileName)
	book.save(file_name_store)

	display_path_name = os.path.join('static', 'download', fileName)
	print 'display_path_name', display_path_name
	ret, msg, _ = export_data_check(all_data, file_name_store)
	if not ret:
		return False, msg, None

	return True, 'OK', display_path_name

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值