python+luckysheet实现局域网多人协同表格(带数据库)

       首先声明没有用java,因为不会。在网上找了很久,在github上找到了基于pywss的web框架。地址在下面,第一个地址是pywss介绍,轻量级的python web框架,pywss 通过WebSocketUpgrade完成通讯升级,第二个地址是luckysheet项目。

GitHub - czasg/pywss: 一个轻量级的 Python Web 框架

GitHub - czasg/LuckySheetServer: luckysheet 多人在线协同编辑 python 实现

       在此的基础上我要做两件事,第一件事在打开网页的时候导入数据库,通过“celldata”:jsonData,将数据导入luckysheet,代码如下。

def DataToJson():
    conn = pymysql.Connect(host='127.0.0.1', port=3306, user='*****', passwd='******', charset='utf8', db='unicom')
    #  设置自己的mysql信息
    cur = conn.cursor()
    sql = "select * from testlog"  #  选择具体的数据库db='unicom'下的testlog
    cur.execute(sql)
    data = cur.fetchall()
    cur.close()
    conn.close()
    jsonData = []
    for i, cell in enumerate(data):
        for j, value in enumerate(cell):
            result = {}
            result['r'] = int(i)
            result['c'] = int(j)
            result['v'] = str(value)
            jsonData.append(result)
    return (jsonData)
    #  luckysheet的要求导出格式



def load(ctx: pywss.Context):
    jsonData = DataToJson()
    data = json.dumps([
        {
            "name": "Cell",
            "index": "sheet_01",
            "order": 0,
            "status": 1,
            "celldata": jsonData,
        }])  # json.dumps将一个Python数据结构转换为JSON
    # json.dumps()用于将dict类型的数据转成str
    ctx.write(data)  # 写入json的数据

        第二件事是在关闭网页的时候,将数据导出到数据库。前端采用jquery下的$.ajax,后端用python flask接收数据。注意luckysheet采用的js,是jquery,已经包含在了luckysheet.umd.js。数据已经给到了python后端,数据导出为test.xlsx,最后test.xlsx导出到mysql。

        数据先导出到.xlsx是因为我觉得luckysheet.getallsheets()的数据和openpyxl的数据很像,然后通过sqlalchemy和pandas将.xlsx导入到mysql数据库。index.html和**.py代码如下。

**.py

import openpyxl
from openpyxl import load_workbook
import os ,time
from urllib.parse import quote_plus as urlquote
from sqlalchemy import create_engine
import pandas as pd
import json
from flask import Flask, request

app = Flask(__name__)

def excel_to_mysql():
    userName = "root"
    password = "*******"
    dbHost = "127.0.0.1"
    dbPort = 3306
    dbName = "unicom"
    engine = create_engine(f'mysql+pymysql://{userName}:{urlquote(password)}@{dbHost}:{dbPort}/{dbName}?charset=utf8')
    data_frame = pd.read_excel('test.xlsx')
    data_frame = data_frame.where(data_frame.notnull(), '')
    data_frame.to_sql(name='testlog', con=engine, index=False, if_exists='replace')


@app.route('/test',methods=['GET','POST'])
def index():
    if request.method == "POST":
        a = request.form.get('exportdata')
        b = json.loads(a)
        for key, data in b.items():
            if key == 'celldata':
                list1 = []
                for i in data:
                    for j in i['v']:
                        if j == 'm':
                            row = i['r'] + 2
                            col = i['c'] + 1
                            value = i['v']['m']
                            list1.extend([[row, col, value]])
                #print(list1)
                if os.path.exists('test.xlsx') == False:
                    workbook = openpyxl.Workbook()
                    sheet = workbook.active
                    for i in list1:
                        sheet.cell(i[0], i[1]).value = i[2]
                    workbook.save('test.xlsx')
                    time.sleep(0.1)
                    excel_to_mysql()
                if os.path.exists('test.xlsx') == True:
                    os.remove('test.xlsx')
                    workbook = openpyxl.Workbook()
                    sheet = workbook.active
                    for i in list1:
                        sheet.cell(i[0], i[1]).value = i[2]
                    workbook.save('test.xlsx')
                    time.sleep(0.1)
                    excel_to_mysql()

if __name__ == '__main__':
    app.run(host="127.0.0.1", port=5000)

index.html(html上的日志按钮,是我在浏览器后台看数据的时候加的console.log())

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel='stylesheet' href='/static/css/pluginsCss.css'/>
    <link rel='stylesheet' href='/static/css/plugins.css'/>
    <link rel='stylesheet' href='/static/css/luckysheet.css'/>
    <link rel='stylesheet' href='/static/css/iconfont.css'/>
    <script src="/static/js/plugin.js"></script>
    <script src="/static/js/luckysheet.umd.js"></script>
</head>
<body>
<div id="lucky" style="margin:0px;padding:0px;position:absolute;width:100%;height:100%;left: 0px;top: 20px;"></div>
</body>
<script>
var options = {
  container: 'lucky',
  title: "Pywss",
  lang: 'zh',
  allowUpdate: true,
  loadUrl: "/luckysheet/api/loadUrl",
  updateUrl: `ws://${document.location.host}/luckysheet/api/updateUrl`,
  functionButton: '<button id="" class="btn btn-primary btn-danger" style=" padding:3px 6px; font-size: 12px; margin-right: 85px;" onclick="testlog()">日志</button>',
}
$(function () {luckysheet.create(options)})

function testlog() {console.log(luckysheet.getAllSheets()[0])}

$(window).bind('unload', function() {
   $.ajax({
       url: 'http://127.0.0.1:5000/test',
       method: 'POST',
       data: {exportdata: JSON.stringify(luckysheet.getAllSheets()[0])},
       });
})

</script>
</html>

       基于此,实现了局域网下的多人协同办公表格,和微信上的在线表格类似的使用感受,但是是局域网的。注意luckysheet的js文件和css文件均从本地导入。使用的web框架不同,js,css文件存放的位置不同,比如static和templates。最后把mysql(navicat for mysql)也放一下,部分截图。

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
实现一个多人聊天室需要涉及到网络编程以及并发编程。在Python中,可以通过TCP协议来实现多人聊天室。 下面是一个跨主机的Python+TCP实现多人聊天室的简单示例代码: ```python import socket import threading # 服务器IP地址和端口号 SERVER_HOST = '0.0.0.0' SERVER_PORT = 8000 # 客户端列表 clients = [] def broadcast(message): """ 广播消息给所有客户端 """ for client in clients: client.send(message) def handle_client(client): """ 处理客户端连接 """ while True: try: message = client.recv(1024) if message: print(f"[{client.getpeername()}]: {message.decode('utf-8')}") message_to_broadcast = f"[{client.getpeername()}]: {message.decode('utf-8')}".encode('utf-8') broadcast(message_to_broadcast) else: remove(client) except: remove(client) def remove(client): """ 客户端断开连接 """ if client in clients: clients.remove(client) client.close() if __name__ == "__main__": # 创建服务器套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.bind((SERVER_HOST, SERVER_PORT)) server_socket.listen() print(f"[*] Listening on {SERVER_HOST}:{SERVER_PORT}") while True: client_socket, client_address = server_socket.accept() print(f"[*] Accepted connection from {client_address[0]}:{client_address[1]}") clients.append(client_socket) client_thread = threading.Thread(target=handle_client, args=(client_socket,)) client_thread.start() ``` 在上述代码中,我们使用了Python的socket模块来创建TCP服务器和客户端套接字,使用了Python的threading模块来进行并发处理。我们定义了一个`broadcast`函数来广播消息给所有客户端,定义了一个`handle_client`函数来处理客户端连接,定义了一个`remove`函数来处理客户端断开连接。 在`handle_client`函数中,我们使用了一个死循环来持续处理客户端发送的消息。当接收到消息时,我们使用`broadcast`函数将该消息广播给所有客户端。当客户端断开连接时,我们使用`remove`函数将该客户端从客户端列表中移除。 在`__main__`函数中,我们创建服务器套接字,监听客户端连接。当有新的客户端连接时,我们将其添加到客户端列表中,并使用一个新的线程来处理该客户端连接。 这是一个简单的跨主机Python+TCP实现多人聊天室的示例代码,你可以在此基础上进行扩展和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

国服小闲鱼请战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值