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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章