使用 openpyxl 在 Python 中将工作表数据+样式从工作簿复制到另一个工作簿

问题描述

我有大量的 XLS 文件(超过 500 个),我需要全部替换第一张纸。需要是第一个工作表的数据+样式(字体、背景、边框、单元格对齐甚至图像)的完美副本。

我在 Python 中找到的所有使用 openpyxl 的解决方案只允许它复制数据,没有样式。并且使用 xlwings 不是一种选择,因为 Linux 目标机器没有 MS Office。

import openpyxl as pyxl
import re

basereportworkbook = pyxl.load_workbook(filename="base_template.xlsx")
testreportworkbook = pyxl.load_workbook(filename="file1_to_correct.xlsx")

sheetbase = basereportworkbook.get_sheet_by_name("Coverpage")
sheetreport = basereportworkbook.get_sheet_by_name("Coverpage")

# Remove the 1st page from the file to correct
testreportworkbook.remove(testreportworkbook["Coverpage"])
testreportworkbook.create_sheet("Coverpage")
sheetreport = testreportworkbook.get_sheet_by_name("Coverpage")


# copying the cell values from template excel file to destination excel file,one by one
mr = sheetbase.max_row 
mc = sheetbase.max_column 

for i in range (1,mr + 1): 
    for j in range (1,mc + 1): 
        # reading cell value from source excel file 
        c = sheetbase.cell(row = i,column = j) 
  
        # writing the read value to destination excel file 
        sheetreport.cell(row = i,column = j).value = c.value 

# Save the XLS file in the disk
testreportworkbook.save(filename="output.xlsx")

到目前为止,这是我的代码,它仅用于复制没有格式样式的数据。 谢谢!

解决方法

当您使用 c.value 时,您指定您只想复制值而不是任何其他单元格属性(格式等)。 您可以使用 copy 移动所有 _style 格式,例如:

from copy import copy

sheetreport.cell(row = i,column = j).value = c.value
if cell.has_style:
    sheetreport.cell(row = i,column = j)._style = copy(c._style)

...等等

但是,如果您只想复制整个工作表,我可能只会复制整个工作簿,然后删除所有其他工作表,而不是遍历每个单元格。

shutil.copyfile('base_template.xlsx','file1_to_correct.xlsx')
testreportworkbook = pyxl.load_workbook(filename='file1_to_correct.xlsx')

for ws in testreportworkbook.worksheets[1:]:
    testreportworkbook.remove_sheet(ws)

另请注意,来自文档:“您也无法在工作簿之间复制工作表。如果工作簿以只读或只写模式打开,则无法复制工作表。”

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...