# Insertion des tableaux excel dans les tables respectives(Meudon & Roissy). import streamlit as st import pandas as pd import mysql.connector # 🔐 Identifiants MySQL MYSQL_HOST = "54.36.188.119" MYSQL_USER = "michel" MYSQL_PASSWORD = "#SO2&1nf%mZ@jfh" # Connexion à la base MySQL def get_connection(database_name): return mysql.connector.connect( host=MYSQL_HOST, user=MYSQL_USER, password=MYSQL_PASSWORD, database=database_name ) # Fonction d'insertion def inserer_donnees(conn, data, date_choisie): cursor = conn.cursor() for _, row in data.iterrows(): cursor.execute(""" INSERT INTO Inventaire (Id_Article, Quantité, Prix, Date) VALUES (%s, %s, %s, %s) """, (row['Id_Article'], row['Quantité'], row['Prix'], date_choisie)) conn.commit() cursor.close() # Interface Streamlit st.title("📦 Import Inventaire dans MySQL") uploaded_file = st.file_uploader("📥 Charger le fichier Excel (.xlsx)", type="xlsx") if uploaded_file: try: df = pd.read_excel(uploaded_file, sheet_name="Inventaire", usecols="C:E", header=1) df.columns = ["Id_Article", "Prix", "Quantité"] df = df[["Id_Article", "Quantité", "Prix"]] # Réorganisation # Nettoyage : retirer les lignes où Quantité est vide ou invalide df = df.dropna(subset=["Quantité"]) df = df[df["Quantité"].astype(str).str.strip() != ""] df = df[pd.to_numeric(df["Quantité"], errors='coerce').notnull()] colonnes_attendues = ["Id_Article", "Quantité", "Prix"] if all(col in df.columns for col in colonnes_attendues): st.success("✅ Fichier reconnu") st.dataframe(df) # 🔍 Validation des types pour Quantité et Prix try: df["Quantité"] = df["Quantité"].astype(float).round(2) df["Prix"] = df["Prix"].astype(float).round(2) except ValueError as ve: st.error("❌ Erreur : La colonne 'Quantité' ou 'Prix' contient une valeur non numérique.") st.stop() # ✅ Optionnel : vérifier qu’aucune valeur n’est négative if (df["Quantité"] < 0).any() or (df["Prix"] < 0).any(): st.warning("⚠️ Certaines valeurs de 'Quantité' ou 'Prix' sont négatives.") date_choisie = st.date_input("🗓️ Choisir la date pour cet inventaire") # Mapping affichage vers noms de base MySQL base_mapping = { "Roissy": "Roissy", "Meudon": "Meudon" } base_affichee = st.selectbox("📍 Choisir la base de destination", list(base_mapping.keys())) nom_base_mysql = base_mapping[base_affichee] if st.button("✅ Insérer dans la base sélectionnée"): try: conn = get_connection(nom_base_mysql) inserer_donnees(conn, df, date_choisie) conn.close() st.balloons() st.success(f"✅ Insertion réussie dans {base_affichee}") st.toast(f"{len(df)} lignes ajoutées pour la date {date_choisie}", icon="📦") except Exception as e: st.error(f"❌ Erreur lors de l'insertion : {e}") else: st.error(f"❌ Le fichier doit contenir les colonnes : {colonnes_attendues}") except Exception as e: st.error(f"❌ Erreur de lecture du fichier : {e}")