导出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