2

简而言之,我想将一个 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")

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

4

2 回答 2

6

xlwt.write接受样式信息作为它的第三个参数。不幸的是,xlrd 和 xlwt 使用两种截然不同的 XF 对象格式。因此,您不能直接将单元格的样式从读取的工作簿复制xlrd到创建的工作簿中xlwt

解决方法是使用xlutils.XLWTWriter复制文件,然后取回对象的样式信息以保存您将更新的单元格的样式。

首先,您需要John Machin 在一个非常相似的问题中提供的补丁功能:

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")
于 2015-01-30T16:47:11.770 回答
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 实现这种东西的语法信息。

于 2015-01-30T16:49:53.060 回答