[PYTHON] Ich habe versucht, openpyxl zu verwenden

Ich habe Excel als Vorlage gelesen, bearbeitet und wollte es ausgeben. Deshalb habe ich versucht, OpenPyXL zu verwenden, also habe ich das Ergebnis der Verwendung als Memo notiert. Siehe unten für die grundlegende Verwendung. https://openpyxl.readthedocs.io/en/stable/

Grenzen verschmolzener Zellen verschwinden

Einige der Ränder der Zellen, die durch Laden → Speichern zusammengeführt wurden, verschwinden.

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

before: image

after: image

Wenn ich das Dokument lese, scheint es keine andere Wahl zu geben, als aufzugeben. http://openpyxl.readthedocs.io/en/default/styles.html#styling-merged-cells

Beim Laden von Excel bleibt also keine andere Wahl, als einen Rahmen zu zeichnen, ohne ihn nach dem Laden zu kombinieren und mit merge_cells () zu kombinieren. .. Problematisch.

Kopierstil

Es scheint, dass es mit copy gemacht werden kann. http://openpyxl.readthedocs.io/en/default/styles.html#copying-styles

Ich war mir jedoch nicht sicher, was ich tun sollte, wenn ich alle Stile kopieren wollte. Als ich sie nachschlug, wurde mir vorgeschlagen, einen Rahmen oder eine Schriftart anzugeben und sie zu kopieren. 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

Um ehrlich zu sein, kenne ich nicht alle Stile. Als ich mir den Quellcode von openpyxl ansah, sagte ich "target_cell._style = copy (source_cell._style)" in "openpyxl.worksheet.copier._copy_cells". Ich habe es gefunden. https://bitbucket.org/openpyxl/openpyxl/src/644ea21bb4056f93184d3e743f4abf05c51f84af/openpyxl/worksheet/copier.py?at=default&fileviewer=file-view-default#copier.py-54

Wenn Sie also alle Stile kopieren möchten, führen Sie die folgenden Schritte aus.

to_cell._style = copy(cell._style)

Wenn Sie Zellen kopieren möchten, sollten Sie sich auf "openpyxl.worksheet.copier._copy_cells" beziehen. https://bitbucket.org/openpyxl/openpyxl/src/644ea21bb4056f93184d3e743f4abf05c51f84af/openpyxl/worksheet/copier.py?at=default&fileviewer=file-view-default#copier.py-46:60

row_dimensions werden von Anfang an festgelegt

Wenn Sie zeilenweise aus einer Vorlage kopieren, möchten Sie möglicherweise die Zeilenhöhe abrufen und als Zielzeile festlegen. In diesem Fall müssen Sie jedoch auf row_dimensions im Arbeitsblatt zugreifen. Row_dimensions in der ersten Zeile befindet sich jedoch nicht in row_dimensions [0], sondern in row_dimensions [1]. Achten Sie also darauf, keinen Fehler zu machen.

Geben Sie einen Bereich an und kopieren Sie ihn

Ich wollte Zeilen aus dem Vorlagenblatt für die Anzahl bestimmter Daten kopieren und ausgeben, daher implementierte ich eine Funktion zum Festlegen des Bereichs und des Kopierens.

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

        #Zeilenhöhe kopieren
        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)

            #Kopieren Sie den Wert der Zelle
            to_cell.value = cell.value

            #Zellenstil kopieren
            if cell.has_style:
                to_cell._style = copy(cell._style)

Ich denke, dass row_dimension auch kopiert werden kann, aber es ist nicht bestätigt. Wenn Sie etwas anderes als den Zellenstil benötigen, können Sie es kopieren.

Recommended Posts

Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, aiomysql zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe versucht, Coturn zu verwenden
Ich habe versucht, "Anvil" zu verwenden.
Ich habe versucht, Hubot zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe versucht, Ipython zu verwenden
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, doctest zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
[Ich habe versucht, Pythonista 3 zu verwenden] Einführung
Ich habe versucht, easydict (Memo) zu verwenden.
Ich habe versucht, das Gesicht mit Face ++ zu erkennen
Ich habe versucht, RandomForest zu verwenden
Ich habe versucht, BigQuery ML zu verwenden
Ich habe versucht, Amazon Glacier zu verwenden
Ich habe versucht, Git Inspector zu verwenden
Ich habe versucht, Magenta / TensorFlow zu verwenden
Ich habe versucht, AWS Chalice zu verwenden
Ich habe versucht, Slack Emojinator zu verwenden
Ich habe versucht, Rotrics Dex Arm # 2 zu verwenden
Ich habe versucht, Rotrics Dex Arm zu verwenden
Ich habe versucht, GrabCut von OpenCV zu verwenden
Ich habe versucht, Thonny (Python / IDE) zu verwenden.
Ich habe versucht, mit dem Server-Client über tmux zu kommunizieren
Ich habe versucht, mit PyBrain verstärkt zu lernen
Ich habe versucht, mit Theano tief zu lernen
Ich habe irgendwie versucht, ein Jupyter-Notebook zu verwenden
[Kaggle] Ich habe versucht, mit unausgeglichenem Lernen zu unterabtasten
Ich habe versucht, mit OpenPose eine Schildkrötenwelle zu schießen
Ich habe versucht, die checkio-API zu verwenden
Ich habe versucht, asynchrone Verarbeitung mit Asyncio
Ich habe PyQ ausprobiert
Ich habe AutoKeras ausprobiert
Ich habe es mit Papiermühle versucht
Ich habe versucht, Django-Slack
Ich habe es mit Django versucht
Ich habe es mit Spleeter versucht
Ich habe es mit cgo versucht
Ich habe versucht, Amazon SQS mit Django-Sellerie zu verwenden
Ich habe versucht, Azure Speech to Text zu verwenden.
Ich habe versucht, ○ ✕ mit TensorFlow zu spielen
Ich habe versucht, YOUTUBE Data API V3 zu verwenden
Ich habe versucht, Selen mit Headless-Chrom zu verwenden
Ich habe versucht, mit einer Schildkröte eine Linie zu ziehen
[Kaggle] Ich habe versucht, Ensemble mit LightGBM zu lernen