为了账号安全,请及时绑定邮箱和手机立即绑定

使用python的xlrd,xlwt和xlutils.copy保留样式

使用python的xlrd,xlwt和xlutils.copy保留样式

慕慕森 2019-08-19 10:42:08
使用python的xlrd,xlwt和xlutils.copy保留样式我正在使用xlrd,xlutils.copy并xlwt打开模板文件,复制它,用新值填充它并保存。但是,似乎没有任何简单的方法来保留单元格的格式; 它总是被吹走,并被设置为空白。有什么简单的方法可以做到这一点吗?谢谢!/ YGA示例脚本:from xlrd import open_workbookfrom 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.1xlwt:0.7.2
查看完整描述

2 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

这有两个部分。

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

import xlrdimport xlutils.copy

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

其次,您必须处理这样一个事实,即更改单元格值会重置该单元格的格式。

这不太漂亮; 我使用以下hack手动复制格式索引(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 celldef 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 HACKoutSheet = outBook.get_sheet(0)setOutCell(outSheet, 5, 5, 'Test')outBook.save('output.xls')

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


查看完整回答
1 反对 回复 2019-08-19
  • 2 回答
  • 0 关注
  • 6098 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信