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/
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:
after:
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.
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
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.
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