使用 python 的 xlrd、xlwt 和 xlutils.copy 保留样式 [英] Preserving styles using python's xlrd,xlwt, and xlutils.copy

查看:141
本文介绍了使用 python 的 xlrd、xlwt 和 xlutils.copy 保留样式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 xlrdxlutils.copyxlwt 打开一个模板文件,复制它,用新的填充它值,然后保存.

I'm using xlrd, xlutils.copy, and xlwt to open up a template file, copy it, fill it with new values, and save it.

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

However, there doesn't seem to be any easy way to preserve the formatting of the cells; it always gets blown away and set to blank. Is there any simple way I can do this?

谢谢!/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
  • xlrd: 0.7.1
  • xlwt: 0.7.2

推荐答案

这有两个部分.

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

First, you must enable the reading of formatting info when opening the source workbook. The copy operation will then copy the formatting over.

import xlrd
import xlutils.copy

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

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

Secondly, you must deal with the fact that changing a cell value resets the formatting of that cell.

这不太漂亮;我使用以下 hack 手动复制格式索引 (xf_idx):

This is less pretty; I use the following hack where I manually copy the formatting index (xf_idx) over:

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')

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

This preserves almost all formatting. Cell comments are not copied, though.

这篇关于使用 python 的 xlrd、xlwt 和 xlutils.copy 保留样式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆