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