Risolto Consiglio su come automatizzare aggiornamento connessione incorporata in Excel e invio via mail

Borghese

Utente abituale
Original poster
2 Gennaio 2020
345
29
28
43
In giro per il Centro e Sud Italia
Microsoft 365
ciao ragazzi, spero sia la sezione giusta

Ho un file Excel che contiene al suo interno una query sql a un progetto su Google Big Query, e mi crea una tabella con dei dati.
Io ho necessità di automatizzare un processo che, tutti i giorni a una certa ora, apra il file Excel, aggiorni i dati con la connessione incorporata, invii una mail con la tabella dati aggiornata, salvi e chiuda il file.

Sono indeciso, e da qua la richiesta di consiglio, se meglio :

1) Utilizzare VBA per aggiornare la connessione dati e inviare la mail, e gestire con Powershell l'apertura del file, l'esecuzione della macro stessa e la chiusura del file.
2) Fare tutto in python

Entrambe le soluzioni sarebbero operative su un pc server che è up&running 24/7

Voi cosa mi suggerite tra le due soluzioni ?

p.s
So che sarebbe meglio puntare direttamente alla query su GCP, ma purtroppo è una risorsa aziendale, e non ho privilegi per le API

grazie a tutti in anticipo
 

Borghese

Utente abituale
Original poster
2 Gennaio 2020
345
29
28
43
In giro per il Centro e Sud Italia
Microsoft 365
se può essere utile a qualcuno, sono riuscito con python :

Visual Basic:
import os
import pandas as pd
from openpyxl import load_workbook
import win32com.client as win32
from datetime import datetime, timedelta

# Percorso del file Excel
file_path = 'C:/Users/xxxxx.xlsx'

# Percorso e nome del file Excel temporaneo
attachment_filename = 'C:/Users/xxxxx_Temp.xlsx'

# Aggiorna le connessioni dati nel file Excel
def update_excel(file_path):
    wb = load_workbook(file_path)
    ws = wb.active
    # Se hai connessioni di dati specifiche usa wb.refresh_data_connections()
    wb.save(file_path)

update_excel(file_path)

# Ottieni i dati dalla tabella
df = pd.read_excel(file_path, sheet_name='Assist')

# Salva il DataFrame in un file Excel temporaneo
attachment_filename = 'xxxx_NRT.xlsx'
df.to_excel(attachment_filename, index=False)

# Calcola la data del giorno precedente
yesterday = datetime.now() - timedelta(days=1)
yesterday_str = yesterday.strftime('%d/%m/%Y')  # Formatta la data come desideri

# Preparazione per inviare via mail
sender = 'xxxx'
receiver = 'xxxx'
subject = 'Report'
content = f'''
Buongiorno,

In allegato il report aggiornato al {yesterday_str}

xxxxx
'''

# Invio dell'email tramite Outlook
outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
mail.To = receiver
mail.Subject = subject
mail.Body = content

# Aggiungi l'allegato
attachment_path = os.path.abspath(attachment_filename)
mail.Attachments.Add(attachment_path)

# Invia l'email
mail.Send()

# Pulizia: eliminando il file temporaneo dell'allegato
os.remove(attachment_filename)

print("Email inviata con successo!")
 
  • Like
Reactions: Terio and Rubik72