简单地说,我想将一个Excel文件的所有格式保存到另一个Excel文件中。但是,尽管使用formatting_info=True
标志,但仅对更改行中的所有未更改单元格显示格式。有什么建议吗?
import xlrd, xlutils
from xlrd import open_workbook
from xlutils.copy import copy
inBook = xlrd.open_workbook(r"path/to/file/format_input.xls", formatting_info=True, on_demand=True)
outBook = xlutils.copy.copy(inBook)
outBook.get_sheet(0).write(0,0,'changed!')
outBook.save(r"path/to/file/format_output.xls")
在此输入图片说明
答案 0 :(得分:6)
xlwt.write
接受样式信息作为其第三个参数。不幸的是,xlrd和xlwt使用两种截然不同的XF对象格式。因此,您无法直接将单元格的样式从xlrd
读取的工作簿复制到xlwt
创建的工作簿。
解决方法是使用xlutils.XLWTWriter
复制文件,然后返回 对象的样式信息,以保存要更新的单元格的样式。
首先你需要John a very similar question提供的 patch 函数:
from xlutils.filter import process,XLRDReader,XLWTWriter
#
# suggested patch by John Machin
# https://stackoverflow.com/a/5285650/2363712
#
def copy2(wb):
w = XLWTWriter()
process(
XLRDReader(wb,'unknown.xls'),
w
)
return w.output[0][1], w.style_list
然后在你的主要代码中:
import xlrd, xlutils
from xlrd import open_workbook
from xlutils.copy import copy
inBook = xlrd.open_workbook(r"/tmp/format_input.xls", formatting_info=True, on_demand=True)
inSheet = inBook.sheet_by_index(0)
# Copy the workbook, and get back the style
# information in the `xlwt` format
outBook, outStyle = copy2(inBook)
# Get the style of _the_ cell:
xf_index = inSheet.cell_xf_index(0, 0)
saved_style = outStyle[xf_index]
# Update the cell, using the saved style as third argument of `write`:
outBook.get_sheet(0).write(0,0,'changed!', saved_style)
outBook.save(r"/tmp/format_output.xls")
答案 1 :(得分:2)
我在使用openpyxl时遇到了类似的问题 - 由于某种原因,这似乎在可用的模块中处理得不是很好。在我输入数据后,我最终只是根据需要重新设置单元格,使用以下语法:
#Formatting
from openpyxl.styles import Style, Color, PatternFill, Alignment, Font, NumberFormat
#Allows for conditional formatting
from openpyxl.formatting import CellIsRule #Allows for Conditional Formatting
for cell in changed_cells:
cell.style = Style(fill=PatternFill(patternType='solid', fgColor=Color('FFff8888')),
font=Font(name="Arial",size=11),
alignment=Alignment(horizontal="center"))
有关使用xlrd实现此类事情的语法的信息可以找到here。