Comment automatiser (créer, mettre à jour) des fichiers Excel à partir d'API avec Python et Openpyxl.

王林
Libérer: 2024-08-16 18:01:40
original
413 Les gens l'ont consulté

How to Automate(create, update) Excel Files from APIs with Python and Openpyxl.

Je sais donc que lorsque l'automatisation est évoquée, beaucoup de gens y pensent de manière très abstraite. peut-être même en pensant à un atelier de mécanique pour les réparations. mdr.
Quoi qu'il en soit, l'automatisation en programmation est exactement le code que vous écrivez mais avec d'autres techniques pour aider à l'exécuter correctement.

Quand j'ai commencé à utiliser Python, c'était pour écrire des structures de données et des algorithmes, mais j'ai ensuite progressé vers son utilisation pour d'autres choses, comme essayer le développement de mon modèle ML, puis Python pour la programmation.

Pour cet article, je fournirai un guide étape par étape sur la façon dont j'ai automatisé un fichier Excel et différentes feuilles sur un MacBook, sans utiliser Visual Basic pour les applications.

Tout d'abord, pour commencer, vous n'avez pas besoin d'être un développeur Python car je vais coller un extrait de code ici.

Outils requis

  • VScode bien sûr
  • Python installé/mis à jour
  • Un environnement virtuel pour exécuter toute nouvelle installation ou mise à jour de votre code Python.
  • L'environnement virtuel est le .venv. Vous le verrez dans votre vscode.
  • Installer openpyxyl
  • Installez toute autre dépendance nécessaire.
  • Commencez.

Les différents aspects que nous examinerons :

  • Création d'un nouveau fichier Excel avec python
  • Mise à jour d'un fichier Excel existant avec python Mise à jour d'une feuille de fichier Excel spécifique uniquement avec Python
  • Utilisation des API pour mettre à jour les fichiers Excel et les feuilles de fichiers Excel.
  • Création d'un bouton qui permet aux utilisateurs de mettre à jour en un clic.
  • Ajout de dates et d'heures dynamiques dans votre code
  • Une alternative au bouton Excel est cron ou le shell Windows
  • Au lieu de VBA, quoi d'autre est possible ?
  • Problèmes rencontrés lors de l'écriture de VBA sur un MacBook
  • Problèmes auxquels j'ai été confronté lors de la création du bouton
  • Pourquoi j'ai opté pour cron
  • Créer ceci pour les utilisateurs Windows et Mac
  • Autres outils pouvant être utilisés pour l'automatisation d'Excel
  • Requête puissante à partir de la fonctionnalité Web
  • Automatiser la puissance
  • Visual Basic dans Excel

Créer un nouveau fichier Excel avec python

Créer une feuille Excel en Python avec openpyxl est simple.
Tout ce que vous avez à faire est d'installer openpyxl, pandas et requêtes si vous obtenez des données d'une API.
Accédez à la documentation openpyxl pour savoir comment l'importer dans votre application et les packages que vous souhaitez utiliser.

import pandas
import requests
from openpyxl import Workbook, load_workbook
from openpyxl.utils import get_column_letter
Copier après la connexion

Ensuite,
vous créez un nouveau classeur
Définissez-le comme classeur actif
Ajoutez votre titre et votre en-tête et remplissez les données
Enregistrez le nouveau classeur avec votre nom Excel préféré et tada !
vous avez créé votre premier fichier Excel.

# create a new workbook
wb = Workbook()
ws = wb.active
ws.title = "Data"

ws.append(['Tim', 'Is', 'Great', '!'])
ws.append(['Sam', 'Is', 'Great', '!'])
ws.append(['John', 'Is', 'Great', '!'])
ws.append(['Mimi', 'Is', 'Great', '!'])
wb.save('mimi.xlsx')
Copier après la connexion

Création d'une nouvelle feuille dans un fichier Excel.

La création d'une feuille spécifique dans votre fichier Excel est un processus similaire. cependant, vous devez spécifier la feuille à créer avec un nom de feuille.

# create sheet
wb.create_sheet('Test')
print(wb.sheetnames)
Copier après la connexion

Modification d'une feuille Excel.

Pour modifier une feuille Excel et non le fichier complet,

Chargez le classeur que vous souhaitez modifier
Ils précisent la feuille particulière à modifier en utilisant son nom ou son index. Il est plus sûr d'utiliser l'index au cas où le nom finirait par changer.
Dans l'extrait de code ci-dessous, j'ai utilisé l'étiquette Sheet

# wb = load_workbook('mimi.xlsx')

# modify sheet
ws = wb.active
ws['A1'].value = "Test"
print(ws['A1'].value)
wb.save('mimi.xlsx')
Copier après la connexion

Accéder à plusieurs cellules

Pour accéder à plusieurs cellules,
Chargez le classeur
Faites-en le classeur actif
parcourir ses lignes et ses colonnes

# Accessing multiple cells
 wb = load_workbook('mimi.xlsx')
 ws = wb.active

 for row in range(1, 11):
     for col in range(1, 5):
         char = get_column_letter(col)
         ws[char + str(row)] = char + str(row)
         print(ws[char + str(row)].value)

 wb.save('mimi.xlsx')
Copier après la connexion

Fusionner des cellules Excel

Pour fusionner différentes cellules dans Excel à l'aide de Python,
Chargez le classeur
Indiquez le classeur actif
indiquez les cellules que vous souhaitez fusionner

# Merging excel cells
wb = load_workbook('mimi.xlsx')
ws = wb.active

ws.merge_cells("A1:D2")
wb.save("mimi.xlsx")
Copier après la connexion

Cellules dissociées

Pour dissocier différentes cellules dans Excel à l'aide de Python,
Chargez le classeur
Indiquez le classeur actif
indiquez les cellules que vous souhaitez dissocier

# merging excel cells
wb = load_workbook('mimi.xlsx')
ws = wb.active

ws.unmerge_cells("A1:D1")
wb.save("mimi.xlsx")
Copier après la connexion

Insérer de nouvelles cellules Excel

Pour insérer de nouvelles cellules

Charger le classeur
Indiquez le classeur actif
utilisez insert_rows et insert_columns pour insérer de nouvelles lignes ou de nouvelles colonnes en fonction de vos préférences.

# inserting cells
wb = load_workbook('mimi.xlsx')
ws = wb. is active

ws.insert_rows(7)
ws.insert_rows(7)

ws.move_range("C1:D11", rows=2, cols=2)
wb.save("mimi.xlsx")
Copier après la connexion

Mise à jour d'un fichier Excel existant avec des données internes
Ajoutez vos tableaux et objets et saisissez les informations nécessaires

from openpyxl import Workbook, load_workbook
from openpyxl.utils import get_column_letter
from openpyxl.styles import Font

data = {
    "Pam" : {
        "math":65,
        "science": 78,
        "english": 98,
        "gym": 89
    },
    "Mimi" : {
        "math":55,
        "science": 72,
        "english": 88,
        "gym": 77
    },
    "Sid" : {
        "math":100,
        "science": 66,
        "english": 93,
        "gym": 74
    },
    "Love" : {
        "math":77,
        "science": 83,
        "english": 59,
        "gym": 91
    },
}

wb = Workbook()
ws = wb.active
ws.title = "Mock"
headings = ['Name'] + list(data['Joe'].keys())
ws.append(headings)

for a person in data:
    grades = list(data[person].values())
    ws.append([person] + grades)

for col in range(2, len(data['Pam']) + 2):
    char = get_column_letter(col)
    ws[char + '7'] = f"=SUM({char + '2'}:{char + '6'})/{len(data)}"

for col in range(1, 6):
    ws[get_column_letter(col) + '1'].font = Font(bold=True, color="0099CCFF")


wb.save("NewMock.xlsx")
Copier après la connexion

Mise à jour d'un fichier Excel existant avec Python et API

Pour mettre à jour un fichier Excel à l'aide de Python et des API, vous devez appeler les API dans votre fichier à l'aide d'une requête Get.
Définissez le fichier Excel actif comme décrit ci-dessus, puis exécutez votre script.
En voici un exemple :

from openpyxl import Workbook, load_workbook
import requests
from datetime import datetime, timedelta

import schedule
import time

api_url = "https://yourapi"
excel_file = "yourfilename.xlsx"

def fetch_energy_data(offset=0):
    response = requests.get(api_url + f"&offset={offset}")
    data = response.json()

    if response.status_code == 200:
        data = response.json()
        return data["results"], data["total_count"] 
    else:
        print(f"Error fetching data: {response.status_code}")
        return [], 0

def update_excel_data(data):
    try:
        wb = load_workbook(excel_file)
        ws = wb.worksheets[0]  

        for row in range(5, ws.max_row + 1):  
            for col in range(1, 9):  
                ws.cell(row=row, column=col).value = None  

                now = datetime.now()
                current_year = now.year
                current_month = now.month

        start_date = datetime(current_year,current_month, 1) 
        end_date = datetime(current_year, current_month, 24) 

        filtered_data = [
            result
            for result in data
            if start_date <= datetime.fromisoformat(result["datetime"]).replace(tzinfo=None) <= end_date]


        for i, result in enumerate(filtered_data):  
            row = i + 5  
            ws[f"A{row}"] = result["datetime"]
            ws[f"B{row}"] = result["yourinfo"]
            ws[f"C{row}"] = result["yourinfo"]
            ws[f"D{row}"] = result["yourinfo"]
            ws[f"E{row}"] = result["yourinfo"]
            ws[f"F{row}"] = result["yourinfo"]  
            ws[f"G{row}"] = result["yourinfo"]
            ws[f"H{row}"] = result["yourinfo"]

        for row in range(5, ws.max_row + 1):
            ws[f"I{row}"] = ws[f"I{row}"].value  
            ws[f"J{row}"] = ws[f"J{row}"].value  
            ws[f"K{row}"] = ws[f"K{row}"].value  
            ws[f"L{row}"] = ws[f"L{row}"].value  

        wb.save(excel_file)
        print(f"Excel file updated: {excel_file}")
    except FileNotFoundError:
        print(f"Excel file not found: {excel_file}")
    except KeyError:
        print(f"Sheet 'Forecast PV' not found in the Excel file.")
    schedule.every().hour.do(update_excel_data)

    while True:
             schedule.run_pending()

if __name__ == "__main__":
    all_data = []
    offset = 0
    total_count = 0
    while True:
        data, total_count = fetch_energy_data(offset)  
        if not data:
            break
        all_data.extend(data)
        offset += 100  
        if offset >= total_count:  
            break


    update_excel_data(all_data)


To update a particular sheet, use the method mentioned above. best practices are done with the excel sheets index number from 0 till n-1.
as sheet names can change but sheet positions can not change.

 wb = load_workbook(excel_file)
        ws = wb.worksheets[0]
Copier après la connexion
  • Creating a button that allows users to update on click. To achieve a button to automatically run your Python script, you need to create a button in your Excel file and write a program using the inbuilt programming language, Visual Basic for applications. Next, you write a program similar to this. An example of a VBA script is below.
Sub RunPythonScript()
    Dim shell As Object
    Dim pythonExe As String
    Dim scriptPath As String
    Dim command As String

     Path to your Python executable
    pythonExe = "C:\Path\To\Python\python.exe"

     Path to your Python script
    scriptPath = "C:\Path\To\Your\Script\script.py"

     Command to run the Python script
    command = pythonExe & " " & scriptPath

     Create a Shell object and run the command
    Set shell = CreateObject("WScript.Shell")
    shell.Run command, 1, True

     Clean up
    Set shell = Nothing
End Sub
Copier après la connexion

the issue with this is some functions do not run in non-windows applications seeing that Excel and VBA are built and managed by Microsoft, there are inbuilt Windows functions for this that can only work on Windows.

However, if you are not writing a very complicated program, it will run properly.

  • Adding dynamic dates and time in your code

To achieve dynamic dates and times, you can use the date.now function built into Python.

now = datetime.now()
 current_year = now.year
current_month = now.month
Copier après la connexion
  • An alternative to the Excel button is cron or Windows shell

For MacBook users, an alternative to the VBA and button feature, you can use a corn for MacBook and a Windows shell for Windows. to automate your task.

You can also make use of Google Clouds's scheduler. that allows you to automate tasks.

  • Instead of VBA, what else is possible?

Instead of VBA, direct Python codes can suffice. you can also use the script and run it as required.

  • Issues faced while writing VBA in a MacBook

The major issue lies in the fact that VBA is a Windows language and hence, has limited functions in a non-windows device.

  • Issues I faced while creating the button

The same issues are related to the VBA code.

  • Why I opted for cron
    I opted for corn because it is available and easy to use to achieve the goals.

  • Other tools that can be used for the automation of Excel

Other tools include:

  • Power query from web feature
  • Power automate
  • Visual Basic in Excel

Follow me on Twitter Handle: https://twitter.com/mchelleOkonicha

Follow me on LinkedIn Handle: https://www.linkedin.com/in/buchi-michelle-okonicha-0a3b2b194/
Follow me on Instagram: https://www.instagram.com/michelle_okonicha/

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal