背景:

做数据分析的时候,有时候需要使用到 手工台账 ,但是手工台账大部分是多sheet的形式

实现方式有两种:

一:

帆软提供了多sheet文件数据集的插件,直接选用服务器上的excel文件就可以使用,不支持jsp文件

(需要注意的是如果下载了多sheet插件,之前的jsp文件展示的文件数据集可能辉失效导致模板无法访问)

二:

自己写接口

我的逻辑是这样的,用户自己上传多sheet的excel文件到对应接口,然后根据sheet名称进行拆分。

拆分完成的sheet分别保存为新的excel文件,再根据文件名再数据库里新建表,来存放对应的excel数据
示例:
下边文件夹存在三个表格文件 


directory = "C:\\Users\\86176\\Desktop\\ceshi"


帆软report 程序数据集 java接口 帆软文件数据集_python

数据库新建表单

帆软report 程序数据集 java接口 帆软文件数据集_html_02


脚本大致如下:


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脚本文件的位置

帆软report 程序数据集 java接口 帆软文件数据集_python_03

实现结果:

帆软report 程序数据集 java接口 帆软文件数据集_数据库_04


权限错误: [Errno 13] Permission denied: 'C:\\Users\\86176\\Desktop\\ceshi\\~$Y2024031101.xlsx'

注意权限的设置