我正在使用xlrdxlutils.copyxlwt打开模板文件,将其复制,填充新值并保存。

但是,似乎没有任何简单的方法来保存单元格的格式;它总是被吹走并设置为空白。有什么简单的方法可以做到这一点吗?

谢谢!
/YGA

示例脚本:

from xlrd import open_workbook
from xlutils.copy import copy
rb = open_workbook('output_template.xls',formatting_info=True)
rs = rb.sheet_by_index(0)
wb = copy(rb)
ws = wb.get_sheet(0)
for i,cell in enumerate(rs.col(8)):
    if not i:
        continue
    ws.write(i,2,22,plain)
wb.save('output.xls')

版本:
  • xlrd:0.7.1
  • xlwt:0.7.2
  • 最佳答案

    这有两个部分。

    首先,您必须在打开源工作簿时启用对格式信息的读取。复制操作随后将复制格式。

    import xlrd
    import xlutils.copy
    
    inBook = xlrd.open_workbook('input.xls', formatting_info=True)
    outBook = xlutils.copy.copy(inBook)
    

    其次,您必须处理以下事实:更改单元格值会重置该单元格的格式。

    这不太漂亮;我使用以下技巧,在其中手动复制格式索引(xf_idx):
    def _getOutCell(outSheet, colIndex, rowIndex):
        """ HACK: Extract the internal xlwt cell representation. """
        row = outSheet._Worksheet__rows.get(rowIndex)
        if not row: return None
    
        cell = row._Row__cells.get(colIndex)
        return cell
    
    def setOutCell(outSheet, col, row, value):
        """ Change cell value without changing formatting. """
        # HACK to retain cell style.
        previousCell = _getOutCell(outSheet, col, row)
        # END HACK, PART I
    
        outSheet.write(row, col, value)
    
        # HACK, PART II
        if previousCell:
            newCell = _getOutCell(outSheet, col, row)
            if newCell:
                newCell.xf_idx = previousCell.xf_idx
        # END HACK
    
    outSheet = outBook.get_sheet(0)
    setOutCell(outSheet, 5, 5, 'Test')
    outBook.save('output.xls')
    

    这将保留几乎所有格式。但是,不会复制单元格注释。

    关于python - 使用python的xlrd,xlwt和xlutils.copy保留样式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3723793/

    10-09 20:15