반응형
Python의 xlrd, xlwt 및 xlutils.copy를 사용하여 스타일 유지
내가 사용 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.1xlwt
: 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')
이렇게하면 거의 모든 서식이 유지됩니다. 하지만 셀 주석은 복사되지 않습니다.
다음은 xlutils 1.4.1에 대한 패치로 제안 할 코드 사용의 예입니다.
# coding: ascii
import xlrd, xlwt
# Demonstration of copy2 patch for xlutils 1.4.1
# Context:
# xlutils.copy.copy(xlrd_workbook) -> xlwt_workbook
# copy2(xlrd_workbook) -> (xlwt_workbook, style_list)
# style_list is a conversion of xlrd_workbook.xf_list to xlwt-compatible styles
# Step 1: Create an input file for the demo
def create_input_file():
wtbook = xlwt.Workbook()
wtsheet = wtbook.add_sheet(u'First')
colours = 'white black red green blue pink turquoise yellow'.split()
fancy_styles = [xlwt.easyxf(
'font: name Times New Roman, italic on;'
'pattern: pattern solid, fore_colour %s;'
% colour) for colour in colours]
for rowx in xrange(8):
wtsheet.write(rowx, 0, rowx)
wtsheet.write(rowx, 1, colours[rowx], fancy_styles[rowx])
wtbook.save('demo_copy2_in.xls')
# Step 2: Copy the file, changing data content
# ('pink' -> 'MAGENTA', 'turquoise' -> 'CYAN')
# without changing the formatting
from xlutils.filter import process,XLRDReader,XLWTWriter
# Patch: add this function to the end of xlutils/copy.py
def copy2(wb):
w = XLWTWriter()
process(
XLRDReader(wb,'unknown.xls'),
w
)
return w.output[0][1], w.style_list
def update_content():
rdbook = xlrd.open_workbook('demo_copy2_in.xls', formatting_info=True)
sheetx = 0
rdsheet = rdbook.sheet_by_index(sheetx)
wtbook, style_list = copy2(rdbook)
wtsheet = wtbook.get_sheet(sheetx)
fixups = [(5, 1, 'MAGENTA'), (6, 1, 'CYAN')]
for rowx, colx, value in fixups:
xf_index = rdsheet.cell_xf_index(rowx, colx)
wtsheet.write(rowx, colx, value, style_list[xf_index])
wtbook.save('demo_copy2_out.xls')
create_input_file()
update_content()
반응형
'programing' 카테고리의 다른 글
PHP를 사용하여 두 날짜 사이에 임의의 날짜를 생성하는 방법은 무엇입니까? (0) | 2021.01.16 |
---|---|
"|"는 무엇입니까? (0) | 2021.01.15 |
EasyMock andReturn () 대 andStubReturn () (0) | 2021.01.15 |
'cl'은 내부 또는 외부 명령으로 인식되지 않습니다. (0) | 2021.01.15 |
request.user는 SimpleLazyObject를 반환합니다. 어떻게 "깨우기"합니까? (0) | 2021.01.15 |