wxapi/lib/excel.py
2020-08-06 13:57:22 +08:00

200 lines
6.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
from werkzeug.utils import secure_filename
import datetime
import random
from openpyxl import load_workbook, Workbook
from db import insertKeyword, getAllKeywordList
# 获取本文件目录地址
basedir = os.path.abspath(os.path.dirname(__file__))
# 设置允许的文件尾缀
ALLOWED_EXTENSIONS = set(['xlsx'])
# 判断允许的文件尾缀
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
#生成唯一的名称字符串,防止重名问题
def create_uuid():
# 生成当前时间
nowTime = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
# 生成的随机整数n其中0<=n<=100
randomNum = random.randint(0, 100)
if randomNum <= 10:
randomNum = str(0) + str(randomNum)
uniqueNum = str(nowTime) + str(randomNum)
return uniqueNum
# 接受前端传来的文件
def upload_excel(request):
# 文件夹地址
file_dir = os.path.join(basedir, '../upload')
# 文件夹不存在就创建
if not os.path.exists(file_dir):
os.makedirs(file_dir)
# 获取文件
f = request.files['excel']
# 文件格式判断拦截器
if f and allowed_file(f.filename):
fname = secure_filename(f.filename)
ext = fname.rsplit('.', 1)[1]
# 生成新文件名
new_filename = create_uuid() + '.' + ext
# 保存文件
f.save(os.path.join(file_dir, new_filename))
return {'errcode': 200, 'filename': new_filename}
else:
return {'errcode': 700, 'errmsg': '文件格式不符'}
# 函数用途:用于将含有“ ”的字符串,以“ ”分隔成数组形式
# 参数str: string
# 返回值arr: list
def strToArr(str):
return str.split(" ")
# 加载excel文件
def loadData(file_name, sheet_index):
# 根据文件名加载文件
addr_cache = '/app/upload/' + file_name
wb = load_workbook(addr_cache)
# 根据参数获取sheet
ws = wb[wb.sheetnames[sheet_index]]
# 计数器
index = 0
# 数据表
data_list = []
for row in ws.rows:
# 排除表头
if index != 0:
data = {}
# 关键词
data['keywords'] = row[0].value
# 内容
data['content'] = row[1].value
# 浏览量
data['num'] = row[2].value
# 日期
data['date'] = row[3].value
# 标题
data["news"] = {}
data["news"]["title"] = row[4].value
# 摘要
data["news"]["digest"] = row[5].value
# 更新时间
data["news"]["update_time"] = row[6].value
# 封面图链接
data["news"]["cover"] = row[7].value
# 图文链接
data["news"]["url"] = row[8].value
# 图文类型
data["news"]["type"] = strToArr(row[9].value) if isinstance(row[9].value,str) else []
data_list.append(data)
index += 1
return data_list
# 组织记录内容
def packageData(data):
return {
'keywords': data['keywords'],
'content': data['content'],
'num': data['num'],
'date': data['date'],
'news': {
"title": data["news"]["title"],
"digest": data["news"]["digest"],
"update_time": data["news"]["update_time"],
"cover": data["news"]["cover"],
"url": data["news"]["url"],
"type": data["news"]["type"],
}
}
# 插入到数据库中
def insertToDB(data_list):
# 插入错误列表
err_list = []
for data in data_list:
ins_content = packageData(data)
res = insertKeyword(ins_content)
# 插入失败处理
if res['errcode'] != 200:
res['keywords'] = ins_content['keywords']
res['content'] = ins_content['content']
err_list.append(res)
if len(err_list) != 0:
return {'errcode': 701, 'errmsg': 'keyword插入失败', 'err_list': err_list}
return {'errcode': 200, 'errmsg': 'ok'}
# 创建工作簿
def createWorkBook(data_list):
try:
# 实例化
wb = Workbook()
# 激活 worksheet
ws = wb.active
index = 1
# 加上表头
data_list.insert(0, packageTitle())
# 遍历数据表
for keywords in data_list:
# 第一列放关键词
ws.cell(row=index, column= 1).value = keywords['keywords']
# 第二列放内容
ws.cell(row=index, column= 2).value = keywords['content']
# 浏览量
ws.cell(row=index, column= 3).value = keywords["num"]
# 日期
ws.cell(row=index, column= 4).value = keywords["date"]
# 标题
ws.cell(row=index, column= 5).value = keywords["news"]["title"]
# 摘要
ws.cell(row=index, column= 6).value = keywords["news"]["digest"]
# 更新时间
ws.cell(row=index, column= 7).value = keywords["news"]["update_time"]
# 封面图
ws.cell(row=index, column= 8).value = keywords["news"]["cover"]
# 链接
ws.cell(row=index, column= 9).value = keywords["news"]["url"]
# 类型
ws.cell(row=index, column= 10).value = ' '.join(keywords["news"]["type"])
index += 1
# 获取一个唯一的文件名
new_filename = create_uuid() + '.xlsx'
addr_cache = '/app/saveExcel/' + new_filename
# 保存到指定地址用nginx暴露这个文件夹映射到/excel/get
wb.save(addr_cache)
# 返回给前端的相对地址
addr = '/excel/get/' + new_filename
except Exception as e:
print(e)
return {'errcode': 900, 'errmsg': '创建工作簿失败'}
return {'errcode': 200, 'errmsg': 'ok', 'addr': addr}
# 获取当前数据库中的信息
def getkeywordsList():
# 获取所有记录
res_list = getAllKeywordList()
# 获取失败拦截器
if res_list['errcode'] != 200:
return res_list
# 获取到记录集合
arr = res_list['arr']
return {'errcode': 200, 'errmsg': 'ok', 'data_list': arr}
# 组织表头
def packageTitle():
return {
'keywords': '关键词(多个关键词以空格隔开)',
'content': '内容',
'num': '浏览量',
'date': '日期',
'news': {
"title": '图文标题',
"digest": '图文摘要',
"update_time": '图文更新时间',
"cover": '图文封面链接',
"url": '图文链接',
"type": '图文类型',
}
}