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