我正在使用xlrd
,xlutils.copy
和xlwt
打开模板文件,将其复制,填充新值并保存。
但是,似乎没有任何简单的方法来保存单元格的格式;它总是被吹走并设置为空白。有什么简单的方法可以做到这一点吗?
谢谢!
/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/