Que dois-je faire pour créer / mettre à jour une feuille Excel (A) et acquérir / traiter des données (CSV, etc.) à ajouter à cette feuille (B)?
Il existe les modèles de traitement suivants.
Généralement, c'est OK si vous utilisez la bibliothèque openpyxl (certaines autres bibliothèques sont plus rapides, mais elles ne prennent en charge que la lecture = vous ne pouvez pas écrire (mettre à jour) sur l'objet du classeur, etc. Il y a des restrictions).
-① "Après avoir ajouté des données à l'objet, enregistrez-le sous un nom = créer un nouveau" Importer la bibliothèque
from openpyxl import Workbook
wb = Workbook()
-② "Lire un livre existant, ajouter des données, puis lui donner un nouveau nom = utiliser un modèle" -③ "Lire le livre existant, ajouter les données et lui donner le même nom = Mettre à jour la feuille existante"
from openpyxl import Workbook
wb = px.load_workbook(self.template_filepath)
ws = wb.worksheets[sheetnum] / wb.worksheets[self.sheetname]
--2-1. Acquisition de données ―― 2-2. Traitement des données --2-3. Substituer les données de manière séquentielle dans des objets de feuille de calcul (wb / ws / cell) (Plus tard, spécifiez le nom de fichier de l'objet et enregistrez-le).
Enregistrez les données ajoutées aux objets de feuille de calcul dans ce classeur dans le classeur réel.
--Pattern ③, si vous spécifiez un chemin de fichier existant --Si vous spécifiez un nouveau chemin de fichier, ce sera ① ou ②
wb.save(self.output_filepath)
Les modèles de mise en œuvre incluent les éléments suivants
Il existe les modèles suivants comme cette méthode
-① Utilisation normale avec ouvert -② Utiliser une bibliothèque spécialisée pour le traitement de données à grande échelle
S'il y a des données supplémentaires dans les données ou si une agrégation est requise, un prétraitement est effectué avec cela. Dans cette bibliothèque, les données sont acquises à partir de CSV, etc. dans un format appelé trame de données. Les données acquises sous forme de trame de données se présentent sous une forme facile à agréger et à calculer. Si vous souhaitez simplement traiter les données acquises et les exporter au lieu de mettre à jour la feuille de calcul ou d'utiliser le fichier existant comme modèle, c'est tout ce dont vous avez besoin.
Notez que la mémoire est souvent un problème, alors reportez-vous à ce qui suit. https://www.sejuku.net/blog/74447 Autre lié https://qiita.com/gangun/items/f97c40f5540f8011c252
wizh open(self.source_filepath, 'r', encoding='utf-8') as file:
while True:
line = file.readline()
row = next(line) #Cela souffre de l'histoire de l'élément suivant
ws.append(row) #C'est l'histoire de l'article suivant
--Comment ignorer la première ligne (colonne)
https://teratail.com/questions/107027
with open(self.source_filepath, 'r', encoding='utf-8') as file:
next(file)
Le type de données obtenu en premier par cette méthode est appelé une trame de données. J'utilise habituellement des pandas. Il est rapide de lire les données avec dask. Le traitement parallèle de multiprossess semble être le meilleur. Cependant, c'est aussi dans cet ordre qu'il n'y a pas l'habitude de l'utiliser et qu'il est difficile de trébucher. Les détails tels que la méthode d'agrégation sont divers et sont fondamentalement omis. Notez qu'une erreur se produira si le traitement est effectué sans prêter attention au type de données.
import pandas as pd / import dask as dd
Vous pouvez obtenir des données de type dataframe à partir de la source de données avec le code ci-dessous
df = pd.read_csv(self.source_filepath ,encoding=self.source_file_encoding)
df = dd.read_excel(self.source_filepath ,encoding=self.source_file_encoding)
--Remarque: Comment ignorer la première ligne (colonne)
We can use the header and skiprows option to tell Pandas not to use the column labels already in our spreadsheet. Note that both header=None and skiprows=1 must be set in this case, as the first row of actual data will be skipped if the header option is missing. https://wellsr.com/python/python-pandas-read_excel-to-import-excel-file-into-dataframe/
read_csv(self.source_filepath ,encoding=self.source_file_encoding, header=None, skiprows=1)
Comme c'est un gros problème, j'ai également expérimenté un modèle différent pour la taille des morceaux de Pandas. À partir de la conclusion, le traitement s'est terminé le plus rapidement autour de la taille du morceau = 30 000 pour 10 millions de lignes. https://qiita.com/gangun/items/17155a8b59079e37b075
read_csv(self.source_filepath ,encoding=self.source_file_encoding, chunksize=30000)
référence: https://qiita.com/hoto17296/items/586dc01aee69cd4915cc https://qiita.com/simonritchie/items/e174f243bc03fb25462e https://qiita.com/simonritchie/items/1ce3914eb5444d2157ac
--Cas pour obtenir des données à partir d'un objet classeur
référence: https://soudegesu.com/post/python/cell-excel-with-openpyxl/
· Lecture de lignes / colonnes
for col in ws.iter_cols(min_row=2):
...
for row in ws. iter_rows(min_row=2):
...
・ Acquisition d'unités cellulaires (Omis)
C'est la partie qui croise "A. Création / mise à jour d'une feuille". Parce qu'il est nécessaire d'ajouter les données acquises / traitées à l'objet feuille / cellule créé par OpenPyXl.
Les données ici incluent non seulement la valeur réelle de la cellule, mais également le type et le format des données (mise en page). Je ne ferai pas ici de note en détail. Lors de la recherche de ceux-ci, il existe de nombreuses explications telles que le traitement dans l'ordre ligne → cellule, ou même si une colonne est spécifiée, le traitement est finalement effectué en unités de cellule. Cependant, en ce qui concerne la mise en page, lorsqu'un classeur (modèle) existant est chargé avec OpenPyXl, il peut être possible de conserver entièrement le format d'origine si la mise en forme conditionnelle est définie sur la feuille. Cela permet, par exemple, de ne colorer que les lignes du sous-total.
for chunk in chunks:
rows = chunk.values
for row_data in rows_data:
row_data = row_data.tolist()
ws.append(row_data)
for i in dataframe_to_rows(df, index=False, header=True):
ws.append(row)
--Cas de l'ajout d'unités cellulaires
Exemple 1 https://gist.github.com/bisco/a65e71c8ba45337f91174e6ae3c139f9
Exemple 2 Rupture de ligne dans la cellule https://www.relief.jp/docs/openpyxl-line-feed.html
ws['A1'].value = 'AAA\nBBB'
ws['A1'].alignment = openpyxl.styles.Alignment(wrapText=True)
Exemple 3
rows_data = df.values.tolist()
for i, row_data in enumerate(rows_data):
for j, cell_data in enumerate(row_data):
if type(cell_data) is int:
ws.cell(row=i+1, column=j+1).number_format = '#'#currentFormat
ws.append(row_data)
--Lors de la récupération de données au format matriciel [[...], [...]]
et de leur ajout ligne par ligne
for row in matrix:
ws.append(row)
--Cas à ajouter dans une colonne spécifique
référence: https://medium.com/ns%E9%9B%91%E8%A8%98%E5%B8%B3/6-%E5%88%97%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%A6%E6%95%B0%E5%BC%8F%E3%82%92fill%E3%81%99%E3%82%8B-9ce61f29baa8
ws['B2'] = '=vlookup(A2,C:C,1,false)'
Traitement des cellules dans une colonne spécifique
for row, cellObj in enumerate(list(ws.columns)[col_num]: #col_num:Index des colonnes
n= '=vlookup(A%d,C:C,1,false)' %(row+1)
cellObj.value = n
df.reset_index().to_csv(self.output_filepath, encoding=self.output_file_encoding, index=False)
df.reset_index().to_excel(self.output_filepath, encoding=self.output_file_encoding, index=False)
#reset_index()Est facultatif
Il y a encore des articles qui ont été utiles, je prévois donc de les ajouter pendant mon temps libre.