[PYTHON] J'ai essayé d'utiliser openpyxl

J'ai lu Excel en tant que modèle, je l'ai modifié et je voulais le sortir.J'ai donc essayé d'utiliser OpenPyXL, alors j'ai noté le résultat de son utilisation comme mémo. Voir ci-dessous pour l'utilisation de base. https://openpyxl.readthedocs.io/en/stable/

Les frontières des cellules fusionnées disparaissent

Certaines des bordures des cellules fusionnées par load → save disparaissent.

from openpyxl import load_workbook
wb = load_workbook('./test.xlsx')
wb.save('./test2.xlsx')

before: image

after: image

Quand j'ai lu le document, il semble qu'il n'y a pas d'autre choix que d'abandonner. http://openpyxl.readthedocs.io/en/default/styles.html#styling-merged-cells

Donc, dans Excel pour charger, il n'y a pas d'autre choix que de dessiner une bordure sans combiner et combiner avec merge_cells () après le chargement. .. Gênant.

Copier le style

Il semble que cela puisse être fait en utilisant copy. http://openpyxl.readthedocs.io/en/default/styles.html#copying-styles

Cependant, je ne savais pas quoi faire si je voulais copier tous les styles, alors quand je l'ai recherché, il a été suggéré de spécifier la bordure ou la police et de la copier. http://stackoverflow.com/questions/23332259/copy-cell-style-openpyxl#answer-34838233

for row in default_sheet.rows:
    for cell in row:
        new_cell = new_sheet.cell(
                   row=cell.row_idx, col=cell.col_idx, value= cell.value)
        if cell.has_style:
            new_cell.font = cell.font
            new_cell.border = cell.border
            new_cell.fill = cell.fill
            new_cell.number_format = cell.number_format
            new_cell.protection = cell.protection
            new_cell.alignment = cell.alignment

Pour être honnête, je ne connais pas tous les styles, donc quand j'ai regardé le code source d'openpyxl, j'ai dit target_cell._style = copy (source_cell._style) dans ʻopenpyxl.worksheet.copier._copy_cells` Je l'ai trouvé. https://bitbucket.org/openpyxl/openpyxl/src/644ea21bb4056f93184d3e743f4abf05c51f84af/openpyxl/worksheet/copier.py?at=default&fileviewer=file-view-default#copier.py-54

Donc, si vous souhaitez copier tous les styles, suivez les étapes ci-dessous.

to_cell._style = copy(cell._style)

Ou plutôt, lors de la copie de cellules, je pense que vous devriez vous référer à ʻopenpyxl.worksheet.copier._copy_cells`. https://bitbucket.org/openpyxl/openpyxl/src/644ea21bb4056f93184d3e743f4abf05c51f84af/openpyxl/worksheet/copier.py?at=default&fileviewer=file-view-default#copier.py-46:60

row_dimensions sont définis à partir du premier

Lors de la copie à partir d'un modèle ligne par ligne, vous souhaiterez peut-être obtenir la hauteur de ligne et la définir comme ligne de destination, mais dans ce cas, vous devez accéder à row_dimensions sur la feuille de calcul. Cependant, row_dimensions sur la première ligne n'est pas dans row_dimensions [0] mais dans row_dimensions [1], alors faites attention à ne pas faire d'erreur.

Spécifiez une plage et copiez

Je voulais copier et sortir des lignes de la feuille de modèle pour le nombre de certaines données, j'ai donc implémenté une fonction pour spécifier la plage et la copie.

def copy_cell_range(from_sheet, from_range_string, to_sheet, to_cell_string='A1'):
    to_cell = to_sheet[to_cell_string]
    to_row = to_cell.row
    to_col = to_cell.col_idx

    for row_num, row in enumerate(from_sheet[from_range_string]):
        if not row:
            continue

        #Copier la hauteur de la ligne
        to_row_dimension = to_sheet.row_dimensions[to_row + row_num]
        from_row_dimension = from_sheet.row_dimensions[row[0].row]
        to_row_dimension.height = from_row_dimension.height

        for col_num, cell in enumerate(row):
            to_cell = to_sheet.cell(row=to_row + row_num, column=to_col + col_num)

            #Copiez la valeur de la cellule
            to_cell.value = cell.value

            #Copier le style de cellule
            if cell.has_style:
                to_cell._style = copy(cell._style)

Je pense que row_dimension peut également être copié, mais il n'est pas confirmé. Si vous avez besoin d'autre chose que le style de cellule, vous pouvez le copier.

Recommended Posts

J'ai essayé d'utiliser openpyxl
J'ai essayé d'utiliser argparse
J'ai essayé d'utiliser anytree
J'ai essayé d'utiliser aiomysql
J'ai essayé d'utiliser Summpy
J'ai essayé d'utiliser coturn
J'ai essayé d'utiliser "Anvil".
J'ai essayé d'utiliser Hubot
J'ai essayé d'utiliser ESPCN
J'ai essayé d'utiliser Ipython
J'ai essayé d'utiliser PyCaret
J'ai essayé d'utiliser cron
J'ai essayé d'utiliser ngrok
J'ai essayé d'utiliser face_recognition
J'ai essayé d'utiliser Jupyter
J'ai essayé d'utiliser doctest
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser jinja2
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser la fenêtre de temps
[J'ai essayé d'utiliser Pythonista 3] Introduction
J'ai essayé d'utiliser easydict (mémo).
J'ai essayé la reconnaissance faciale avec Face ++
J'ai essayé d'utiliser RandomForest
J'ai essayé d'utiliser BigQuery ML
J'ai essayé d'utiliser Amazon Glacier
J'ai essayé d'utiliser git inspector
J'ai essayé d'utiliser magenta / TensorFlow
J'ai essayé d'utiliser AWS Chalice
J'ai essayé d'utiliser l'émojinateur Slack
J'ai essayé d'utiliser Rotrics Dex Arm # 2
J'ai essayé d'utiliser Rotrics Dex Arm
J'ai essayé d'utiliser GrabCut d'OpenCV
J'ai essayé d'utiliser Thonny (Python / IDE)
J'ai essayé de communiquer avec le client serveur en utilisant tmux
J'ai essayé l'apprentissage par renforcement avec PyBrain
J'ai essayé l'apprentissage en profondeur avec Theano
J'ai essayé d'utiliser le notebook jupyter d'une manière ou d'une autre
[Kaggle] J'ai essayé le sous-échantillonnage en utilisant un apprentissage déséquilibré
J'ai essayé de photographier une vague de tortue en utilisant OpenPose
J'ai essayé d'utiliser l'API checkio
J'ai essayé le traitement asynchrone en utilisant asyncio
J'ai essayé PyQ
J'ai essayé AutoKeras
J'ai essayé le moulin à papier
J'ai essayé django-slack
J'ai essayé Django
J'ai essayé spleeter
J'ai essayé cgo
J'ai essayé d'utiliser Amazon SQS avec django-celery
J'ai essayé d'utiliser Azure Speech to Text.
J'ai essayé de jouer au jeu ○ ✕ en utilisant TensorFlow
J'ai essayé d'utiliser l'API de données YOUTUBE V3
J'ai essayé d'utiliser du sélénium avec du chrome sans tête
J'ai essayé de dessiner une ligne en utilisant une tortue
[Kaggle] J'ai essayé l'apprentissage d'ensemble avec LightGBM