import http.server
import urllib.parse
import os
import io
import openpyxl
import pandas as pd
import json
PORT = 8000
html_template = '''
Excel Editor
Excel Editor
'''
class ExcelHandler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write(html_template.encode('utf-8'))
def do_POST(self):
content_length = int(self.headers['Content-Length'])
content_type = self.headers['Content-Type']
if 'multipart/form-data' in content_type:
boundary = content_type.split("=")[1].encode()
remaining_bytes = content_length
line = self.rfile.readline()
remaining_bytes -= len(line)
if boundary in line:
line = self.rfile.readline()
remaining_bytes -= len(line)
headers = {}
while line.strip():
key, value = line.decode().split(": ", 1)
headers[key] = value.strip()
line = self.rfile.readline()
remaining_bytes -= len(line)
if 'filename' in headers.get('Content-Disposition', ''):
line = self.rfile.readline()
remaining_bytes -= len(line)
file_data = b''
while remaining_bytes > 0:
line = self.rfile.readline()
remaining_bytes -= len(line)
file_data += line
file_data = file_data.split(b"\r\n")[0] # Remove boundary at the end
excel_data = self.process_excel(file_data)
self.send_response(200)
self.send_header("Content-type", "application/json")
self.end_headers()
self.wfile.write(excel_data.encode('utf-8'))
else:
self.send_response(400, 'No file uploaded')
elif content_type == 'application/json':
post_data = self.rfile.read(content_length)
data = json.loads(post_data.decode('utf-8'))
self.save_excel(data)
self.send_response(200)
self.end_headers()
def process_excel(self, file_data):
workbook = openpyxl.load_workbook(io.BytesIO(file_data))
sheet = workbook.active
data = []
for row in sheet.iter_rows(values_only=True):
data.append(list(row))
df = pd.DataFrame(data[1:], columns=data[0])
return df.to_json(orient='records')
def save_excel(self, data):
df = pd.DataFrame(data)
with pd.ExcelWriter('output.xlsx') as writer:
df.to_excel(writer, index=False)
def run_server():
server = http.server.HTTPServer(('0.0.0.0', PORT), ExcelHandler)
print(f"Server running on port {PORT}")
server.serve_forever()
if __name__ == '__main__':
run_server()