Ich habe zwei Blätter in einer Excel-Datei und die erste ist ein Deckblatt, das ich nicht bearbeiten muss. Es gibt nur wenige verbundene Zellen im Deckblatt. Aber wenn ich die Datei mit openpyxl bearbeiten nicht einmal das Deckblatt berühren, verliere ich Grenzen aus den verbundenen Zellen. Gibt es eine Lösung für dieses Problem? Ich verwende Load_workbook ('Excel-Datei'), um die Excel-Datei zu laden und sie unter einem anderen Dateinamen zu speichern.Verlieren fusionierte Zellen Grenze während der Bearbeitung von Excel-Datei mit openpyxl
3
A
Antwort
2
Aktuelle Lösung ist das Patchen der Bibliotheken Code durch Einschließen dieses Snippets nach dem Einschließen der Bibliothek, es behebt das Problem. (Hinweis: keine Sorge über fehlende Definitionen, beispielsweise COORD_RE, das heißt der Patch ist in sich abgeschlossen)
from itertools import product
import types
import openpyxl
from openpyxl import worksheet
from openpyxl.utils import range_boundaries
def patch_worksheet():
"""This monkeypatches Worksheet.merge_cells to remove cell deletion bug
https://bitbucket.org/openpyxl/openpyxl/issues/365/styling-merged-cells-isnt-working
Thank you to Sergey Pikhovkin for the fix
"""
def merge_cells(self, range_string=None, start_row=None, start_column=None, end_row=None, end_column=None):
""" Set merge on a cell range. Range is a cell range (e.g. A1:E1)
This is monkeypatched to remove cell deletion bug
https://bitbucket.org/openpyxl/openpyxl/issues/365/styling-merged-cells-isnt-working
"""
if not range_string and not all((start_row, start_column, end_row, end_column)):
msg = "You have to provide a value either for 'coordinate' or for\
'start_row', 'start_column', 'end_row' *and* 'end_column'"
raise ValueError(msg)
elif not range_string:
range_string = '%s%s:%s%s' % (get_column_letter(start_column),
start_row,
get_column_letter(end_column),
end_row)
elif ":" not in range_string:
if COORD_RE.match(range_string):
return # Single cell, do nothing
raise ValueError("Range must be a cell range (e.g. A1:E1)")
else:
range_string = range_string.replace('$', '')
if range_string not in self._merged_cells:
self._merged_cells.append(range_string)
# The following is removed by this monkeypatch:
# min_col, min_row, max_col, max_row = range_boundaries(range_string)
# rows = range(min_row, max_row+1)
# cols = range(min_col, max_col+1)
# cells = product(rows, cols)
# all but the top-left cell are removed
#for c in islice(cells, 1, None):
#if c in self._cells:
#del self._cells[c]
# Apply monkey patch
worksheet.Worksheet.merge_cells = merge_cells
patch_worksheet()
Quelle https://bitbucket.org/openpyxl/openpyxl/issues/365/styling-merged-cells-isnt-working