背景:
做数据分析的时候,有时候需要使用到 手工台账 ,但是手工台账大部分是多sheet的形式
实现方式有两种:
一:
帆软提供了多sheet文件数据集的插件,直接选用服务器上的excel文件就可以使用,不支持jsp文件
(需要注意的是如果下载了多sheet插件,之前的jsp文件展示的文件数据集可能辉失效导致模板无法访问)
二:
自己写接口
我的逻辑是这样的,用户自己上传多sheet的excel文件到对应接口,然后根据sheet名称进行拆分。
拆分完成的sheet分别保存为新的excel文件,再根据文件名再数据库里新建表,来存放对应的excel数据
示例:
下边文件夹存在三个表格文件
directory = "C:\\Users\\86176\\Desktop\\ceshi"
数据库新建表单
脚本大致如下:
python:
from openpyxl.workbook import Workbook
import mysql.connector
from flask import Flask, request, render_template
from flask_cors import CORS # 实现跨域
from gevent import pywsgi # 使用WSGI启动服务
import logging # 日志记录
from flask import request
from openpyxl import load_workbook
import os
import pandas as pd
"""
拆解sheet文件,有几个sheet就有几个文件
"""
# 配置日志记录的级别和输出格式
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# 创建一个 Logger 对象
logger = logging.getLogger(__name__)
# Flask 架构
app = Flask(__name__) # 获取实例
CORS(app) # 解决跨域问题
@app.route("/file/info")
def index():
# 默认打开文件,在当前项目目录下的templates去找,在该页面上传文件
return render_template("sheets.html")
@app.route("/Salvage_Sheet", methods=["POST"])
def Get_Sheet():
# 拆解上传文件的sheet,一个sheet一个表格文件
file = request.files["file"]
logger.info(f'请求成功, 文件名称: {file.filename}')
# 获取服务器保存文件的路径
upload_folder = r"C:\Users\86176\Desktop\个人文件"
if not os.path.exists(upload_folder):
os.makedirs(upload_folder)
# # 保存文件到服务器
# file.save(os.path.join(upload_folder, file.filename))
# logger.info(f'文件保存成功, 文件路径: {os.path.join(upload_folder, file.filename)}')
# 保存整个文件
file_path = os.path.join(upload_folder, file.filename)
file.save(file_path)
logger.info(f'整个文件保存成功, 文件路径: {file_path}')
# 读取整个Excel文件
wb = load_workbook(file_path)
# 逐个保存工作表
for sheet in wb.sheetnames:
sheet_name = sheet.replace('/', '-') # 避免在文件名中使用斜杠
sheet_filename = os.path.join(upload_folder, f"{sheet_name}.xlsx")
ws = wb[sheet]
new_wb = Workbook()
new_ws = new_wb.active
for row in ws:
for cell in row:
new_ws[cell.coordinate].value = cell.value
new_wb.save(sheet_filename)
logger.info(f'工作表 {sheet} 保存成功, 文件路径: {sheet_filename}')
return 'OK'
def Salvage_Sheet():
# 把保存的单sheet表格信息写入数据库
# 数据库连接
connection = mysql.connector.connect(
host="****", # 数据库主机地址
user="****", # 数据库用户名
password="****", # 数据库密码
port='****',
database="****", # 数据库名
buffered=True
)
cursor = connection.cursor()
# 读取 Excel 文件,注意路径的权限
directory = "C:\\Users\\86176\\Desktop\\ceshi"
try:
for filename in os.listdir(directory):
if filename.endswith(".xlsx"):
file_path = os.path.join(directory, filename)
# 从 Excel 文件中读取数据
df = pd.read_excel(file_path)
# 获取表名
table_name = os.path.splitext(filename)[0]
# 将DataFrame转换为SQL语句
table_creation_sql = f"CREATE TABLE IF NOT EXISTS {table_name} (" + \
', '.join([f"{column} VARCHAR(255)" for column in df.columns]) + \
")"
# 将数据插入表格
for row in df.itertuples(index=False):
insert_sql = f"INSERT INTO {table_name} VALUES ({', '.join(['%s'] * len(row))})"
cursor.execute(insert_sql, tuple(row))
print(f"数据已成功写入表格 {table_name}")
except PermissionError as e:
print(f"权限错误: {e}")
except Exception as e:
print(f"发生其他错误: {e}")
# 提交事务
connection.commit()
# 关闭游标和连接
cursor.close()
connection.close()
print("数据已成功写入数据库。")
if __name__ == '__main__':
# app.run(host='****.****.****.****', port=****, debug=False)
if __name__ == '__main__':
print('{:-^30}'.format('接口开始运行'))
host = '****.****.****.****'
port = '****'
print('http://{}:{}/'.format(host, int(port)))
server = pywsgi.WSGIServer((host, int(port)), app) # 使用WSGI启动服务
server.serve_forever()
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>上传表格文件</title>
</head>
<body>
<h2>上传表格文件</h2>
<form id="uploadForm" enctype="multipart/form-data">
<label for="fileInput" id="file">选择文件:</label>
<input type="file" id="fileInput" accept=".csv, .xls, .xlsx">
<button type="button" οnclick="uploadFile()">上传</button>
</form>
<script>
function uploadFile() {
var fileInput = document.getElementById("fileInput");
var file = fileInput.files[0];
var formData = new FormData();
formData.append("file", file);
var xhr = new XMLHttpRequest();
xhr.open("POST", "/Salvage_Sheet", true);
xhr.onload = function () {
if (xhr.status === 200) {
console.log("上传成功");
} else {
console.error("上传失败");
}
};
xhr.send(formData);
}
</script>
</body>
</html>
注意python脚本文件和html脚本文件的位置
实现结果:
权限错误: [Errno 13] Permission denied: 'C:\\Users\\86176\\Desktop\\ceshi\\~$Y2024031101.xlsx'
注意权限的设置