Preserving styles using python's xlrd,xlwt, and xlutils.copy?

Here's an example of usage of code that I'll propose as a patch against 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, coloursrowx, fancy_stylesrowx) 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.

Output01, 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_listxf_index) wtbook. Save('demo_copy2_out.

Xls') create_input_file() update_content().

Here's an example of usage of code that I'll propose as a patch against 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, coloursrowx, fancy_stylesrowx) 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.

Output01, 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_listxf_index) wtbook. Save('demo_copy2_out.

Xls') create_input_file() update_content().

There are two parts to this. 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. 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.

I cant really gove you an answer,but what I can give you is a way to a solution, that is you have to find the anglde that you relate to or peaks your interest. A good paper is one that people get drawn into because it reaches them ln some way.As for me WW11 to me, I think of the holocaust and the effect it had on the survivors, their families and those who stood by and did nothing until it was too late.

Related Questions