Dmitriy Shesterkin 9 years ago
parent 107f7684df
commit f9121c9c16
  1. 6
      src/commons/xls/__init__.py
  2. 37
      src/commons/xls/get_xlwt_style_list.py
  3. 89
      src/commons/xls/useful_tools.py

@ -1,3 +1,3 @@
from commons.xls.useful_tools import * from commons.xls.useful_tools import * # noqa
from commons.xls.get_xlwt_style_list import * from commons.xls.get_xlwt_style_list import * # noqa
from commons.xls.xls_to_response import * from commons.xls.xls_to_response import * # noqa

@ -5,13 +5,9 @@ def get_xlwt_style_list(rdbook):
wt_style_list = [] wt_style_list = []
for rdxf in rdbook.xf_list: for rdxf in rdbook.xf_list:
wtxf = xlwt.Style.XFStyle() wtxf = xlwt.Style.XFStyle()
#
# number format # number format
#
wtxf.num_format_str = rdbook.format_map[rdxf.format_key].format_str wtxf.num_format_str = rdbook.format_map[rdxf.format_key].format_str
#
# font # font
#
wtf = wtxf.font wtf = wtxf.font
rdf = rdbook.font_list[rdxf.font_index] rdf = rdbook.font_list[rdxf.font_index]
wtf.height = rdf.height wtf.height = rdf.height
@ -20,49 +16,43 @@ def get_xlwt_style_list(rdbook):
wtf.outline = rdf.outline wtf.outline = rdf.outline
wtf.shadow = rdf.outline wtf.shadow = rdf.outline
wtf.colour_index = rdf.colour_index wtf.colour_index = rdf.colour_index
wtf.bold = rdf.bold #### This attribute is redundant, should be driven by weight # This attribute is redundant, should be driven by weight
wtf._weight = rdf.weight #### Why "private"? wtf.bold = rdf.bold
# Why "private"?
wtf._weight = rdf.weight
wtf.escapement = rdf.escapement wtf.escapement = rdf.escapement
wtf.underline = rdf.underline_type #### wtf.underline = rdf.underline_type
# wtf.???? = rdf.underline #### redundant attribute, set on the fly when writing # wtf.???? = rdf.underline #### redundant attribute, set on the fly when writing
wtf.family = rdf.family wtf.family = rdf.family
wtf.charset = rdf.character_set wtf.charset = rdf.character_set
wtf.name = rdf.name wtf.name = rdf.name
#
# protection # protection
#
wtp = wtxf.protection wtp = wtxf.protection
rdp = rdxf.protection rdp = rdxf.protection
wtp.cell_locked = rdp.cell_locked wtp.cell_locked = rdp.cell_locked
wtp.formula_hidden = rdp.formula_hidden wtp.formula_hidden = rdp.formula_hidden
#
# border(s) (rename ????) # border(s) (rename ????)
#
wtb = wtxf.borders wtb = wtxf.borders
rdb = rdxf.border rdb = rdxf.border
wtb.left = rdb.left_line_style wtb.left = rdb.left_line_style
wtb.right = rdb.right_line_style wtb.right = rdb.right_line_style
wtb.top = rdb.top_line_style wtb.top = rdb.top_line_style
wtb.bottom = rdb.bottom_line_style wtb.bottom = rdb.bottom_line_style
wtb.diag = rdb.diag_line_style wtb.diag = rdb.diag_line_style
wtb.left_colour = rdb.left_colour_index wtb.left_colour = rdb.left_colour_index
wtb.right_colour = rdb.right_colour_index wtb.right_colour = rdb.right_colour_index
wtb.top_colour = rdb.top_colour_index wtb.top_colour = rdb.top_colour_index
wtb.bottom_colour = rdb.bottom_colour_index wtb.bottom_colour = rdb.bottom_colour_index
wtb.diag_colour = rdb.diag_colour_index wtb.diag_colour = rdb.diag_colour_index
wtb.need_diag1 = rdb.diag_down wtb.need_diag1 = rdb.diag_down
wtb.need_diag2 = rdb.diag_up wtb.need_diag2 = rdb.diag_up
#
# background / pattern (rename???) # background / pattern (rename???)
#
wtpat = wtxf.pattern wtpat = wtxf.pattern
rdbg = rdxf.background rdbg = rdxf.background
wtpat.pattern = rdbg.fill_pattern wtpat.pattern = rdbg.fill_pattern
wtpat.pattern_fore_colour = rdbg.pattern_colour_index wtpat.pattern_fore_colour = rdbg.pattern_colour_index
wtpat.pattern_back_colour = rdbg.background_colour_index wtpat.pattern_back_colour = rdbg.background_colour_index
#
# alignment # alignment
#
wta = wtxf.alignment wta = wtxf.alignment
rda = rdxf.alignment rda = rdxf.alignment
wta.horz = rda.hor_align wta.horz = rda.hor_align
@ -74,6 +64,5 @@ def get_xlwt_style_list(rdbook):
wta.shri = rda.shrink_to_fit wta.shri = rda.shrink_to_fit
wta.inde = rda.indent_level wta.inde = rda.indent_level
# wta.merg = ???? # wta.merg = ????
#
wt_style_list.append(wtxf) wt_style_list.append(wtxf)
return wt_style_list return wt_style_list

@ -1,19 +1,18 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
def copy_cells(src_sheet, dst_sheet, style_list, def copy_cells(src_sheet, dst_sheet, style_list, row_from=0, row_to=None, dst_row_shift=0,
row_from=0, row_to=None, dst_row_shift=0, col_from=0, col_to=None, dst_col_shift=0):
col_from=0, col_to=None, dst_col_shift=0):
""" """
Скопировать блок ячеек из диапазона строк [row_from, row_to] и колонок Скопировать блок ячеек из диапазона строк [row_from, row_to] и колонок
[col_from, col_to] исходного листа в новый лист с сохранением их контента, [col_from, col_to] исходного листа в новый лист с сохранением их контента,
исходных стилей форматирования, объединения и высоты строк. исходных стилей форматирования, объединения и высоты строк.
""" """
row_to = row_to or src_sheet.nrows-1 row_to = row_to or src_sheet.nrows - 1
col_to = col_to or src_sheet.ncols-1 col_to = col_to or src_sheet.ncols - 1
for row in range(row_from, row_to+1): for row in range(row_from, row_to + 1):
for col in range(col_from, col_to+1): for col in range(col_from, col_to + 1):
cell = src_sheet.cell(row, col) cell = src_sheet.cell(row, col)
# скопировать контент и стиль ячейки # скопировать контент и стиль ячейки
dst_sheet.write( dst_sheet.write(
@ -27,26 +26,23 @@ def copy_cells(src_sheet, dst_sheet, style_list,
height_rows(src_sheet, dst_sheet, row_from, row_to, dst_row_shift) height_rows(src_sheet, dst_sheet, row_from, row_to, dst_row_shift)
# объединить ячейки # объединить ячейки
merge_cells(src_sheet, dst_sheet, style_list, merge_cells(src_sheet, dst_sheet, style_list, row_from,
row_from, row_to, dst_row_shift, row_to, dst_row_shift, col_from, col_to, dst_col_shift)
col_from, col_to, dst_col_shift)
def height_rows(src_sheet, dst_sheet, def height_rows(src_sheet, dst_sheet, row_from=0, row_to=None, dst_row_shift=0):
row_from=0, row_to=None, dst_row_shift=0):
"""Задать в диапазоне строк [row_from, row_to] высоту как в исходном листе. """Задать в диапазоне строк [row_from, row_to] высоту как в исходном листе.
""" """
row_to = row_to or src_sheet.nrows-1 row_to = row_to or src_sheet.nrows - 1
for row in range(row_from, row_to+1): for row in range(row_from, row_to + 1):
src_rowinfo = src_sheet.rowinfo_map.get(row) src_rowinfo = src_sheet.rowinfo_map.get(row)
if src_rowinfo: if src_rowinfo:
dst_sheet.row(row+dst_row_shift).height = src_rowinfo.height dst_sheet.row(row + dst_row_shift).height = src_rowinfo.height
dst_sheet.row(row+dst_row_shift).height_mismatch = True dst_sheet.row(row + dst_row_shift).height_mismatch = True
def merge_cells(src_sheet, dst_sheet, style_list, def merge_cells(src_sheet, dst_sheet, style_list, row_from=0,
row_from=0, row_to=None, dst_row_shift=0, row_to=None, dst_row_shift=0, col_from=0, col_to=None, dst_col_shift=0):
col_from=0, col_to=None, dst_col_shift=0):
""" """
Объединить ячейки в заданном блоке нового листа, ограниченном строками Объединить ячейки в заданном блоке нового листа, ограниченном строками
[row_from, row_to] и колонками [col_from, col_to], если в исходном листе [row_from, row_to] и колонками [col_from, col_to], если в исходном листе
@ -55,7 +51,7 @@ def merge_cells(src_sheet, dst_sheet, style_list,
row_to = row_to or src_sheet.nrows row_to = row_to or src_sheet.nrows
col_to = col_to or src_sheet.ncols col_to = col_to or src_sheet.ncols
for r1,r2,c1,c2 in src_sheet.merged_cells: for r1, r2, c1, c2 in src_sheet.merged_cells:
if r1 < row_from or r1 > row_to: if r1 < row_from or r1 > row_to:
continue continue
if c1 < col_from or c1 > col_to: if c1 < col_from or c1 > col_to:
@ -64,23 +60,9 @@ def merge_cells(src_sheet, dst_sheet, style_list,
cell = src_sheet.cell(r1, c1) cell = src_sheet.cell(r1, c1)
style = style_list[cell.xf_index] style = style_list[cell.xf_index]
# сохранить границы "крайней" ячейки
# нафиг пока эту фичу - из-за нее повылазили какие-то границы,
# которых не было вообще
# brd_1 = style.borders
# cell_2 = src_sheet.cell(r2-1, c2-1)
# brd_2 = style_list[cell_2.xf_index].borders
# print r1,c1,r2,c2,
# print 'borders 1 (left, right, top, bottom)',
# print brd_1.left, brd_1.right, brd_1.top, brd_1.bottom,
# print 'border 2 (same)',
# print brd_2.left, brd_2.right, brd_2.top, brd_2.bottom
# brd_1.right = brd_2.right
# brd_1.right_colour = brd_2.right_colour
dst_sheet.merge( dst_sheet.merge(
r1+dst_row_shift, r2+dst_row_shift-1, r1 + dst_row_shift, r2 + dst_row_shift - 1,
c1+dst_col_shift, c2+dst_col_shift-1, c1 + dst_col_shift, c2 + dst_col_shift - 1,
style) style)
@ -88,15 +70,15 @@ def width_cols(src_sheet, dst_sheet, col_from=0, col_to=None, dst_col_shift=0):
"""Задать в диапазоне колонок [col_from, col_to] ширину """Задать в диапазоне колонок [col_from, col_to] ширину
как в исходном листе. как в исходном листе.
""" """
col_to = col_to or src_sheet.ncols-1 col_to = col_to or src_sheet.ncols - 1
for col in range(col_from, col_to+1): for col in range(col_from, col_to + 1):
dst_sheet.col(col+dst_col_shift).width = ( dst_sheet.col(col + dst_col_shift).width = (
src_sheet.computed_column_width(col)) src_sheet.computed_column_width(col))
def mm_to_twips(x): def mm_to_twips(x):
"""Перевести из миллиметров в twips.""" """Перевести из миллиметров в twips."""
return int(x/25.4*72*20) return int(x / 25.4 * 72 * 20)
def horz_page_break(dst_sheet, row): def horz_page_break(dst_sheet, row):
@ -104,25 +86,22 @@ def horz_page_break(dst_sheet, row):
dst_sheet.horz_page_breaks.append((row, 0, 255)) dst_sheet.horz_page_breaks.append((row, 0, 255))
# -------------------------------------------------------------- прочие хелперы def clone_row(src_sheet, dst_sheet, style_list, src_row, n_times=1, dst_row_shift=0):
def clone_row(src_sheet, dst_sheet, style_list,
src_row, n_times=1, dst_row_shift=0):
""" """
Размножить n_times раз строку из исходного листа, с сохранением стилей Размножить n_times раз строку из исходного листа, с сохранением стилей
форматирования. форматирования.
""" """
for offset in range(n_times+1): for offset in range(n_times + 1):
copy_cells(src_sheet, dst_sheet, style_list, copy_cells(src_sheet, dst_sheet, style_list,
row_from=src_row, row_to=src_row, row_from=src_row, row_to=src_row,
dst_row_shift=dst_row_shift+offset) dst_row_shift=dst_row_shift + offset)
# задать высоту строк # задать высоту строк
height_rows(src_sheet, dst_sheet, src_row, src_row, dst_row_shift) height_rows(src_sheet, dst_sheet, src_row, src_row, dst_row_shift)
# объединить ячейки # объединить ячейки
merge_cells(src_sheet, dst_sheet, style_list, merge_cells(src_sheet, dst_sheet, style_list,
src_row, src_row, dst_row_shift) src_row, src_row, dst_row_shift)
def merge_cells_in_row(src_sheet, dst_sheet, style_list, src_row, dst_row): def merge_cells_in_row(src_sheet, dst_sheet, style_list, src_row, dst_row):
@ -130,19 +109,20 @@ def merge_cells_in_row(src_sheet, dst_sheet, style_list, src_row, dst_row):
Объединить ячейки в заданной строке нового листа, если в исходном листе они Объединить ячейки в заданной строке нового листа, если в исходном листе они
были объединены, с сохранением исходных стилей форматирования. были объединены, с сохранением исходных стилей форматирования.
""" """
for r1,r2,c1,c2 in src_sheet.merged_cells: for r1, r2, c1, c2 in src_sheet.merged_cells:
if r1 != src_row: if r1 != src_row:
continue continue
cell = src_sheet.cell(r1, c1) cell = src_sheet.cell(r1, c1)
dst_sheet.merge(dst_row, dst_row, c1, c2-1, style_list[cell.xf_index]) dst_sheet.merge(dst_row, dst_row, c1, c2 - 1, style_list[cell.xf_index])
def sum_src_heights(src_sheet, row_from, row_to): def sum_src_heights(src_sheet, row_from, row_to):
"""Суммарная высота всех строк диапазона [row_from, row_to] """
Суммарная высота всех строк диапазона [row_from, row_to]
исходного листа. исходного листа.
""" """
result = 0 result = 0
for row in range(row_from, row_to+1): for row in range(row_from, row_to + 1):
src_rowinfo = src_sheet.rowinfo_map.get(row) src_rowinfo = src_sheet.rowinfo_map.get(row)
if src_rowinfo: if src_rowinfo:
result += src_rowinfo.height result += src_rowinfo.height
@ -150,10 +130,11 @@ def sum_src_heights(src_sheet, row_from, row_to):
def sum_dst_heights(dst_sheet, row_from, row_to): def sum_dst_heights(dst_sheet, row_from, row_to):
"""Суммарная высота всех строк диапазона [row_from, row_to] """
Суммарная высота всех строк диапазона [row_from, row_to]
на новом листе. на новом листе.
""" """
result = 0 result = 0
for row in range(row_from, row_to+1): for row in range(row_from, row_to + 1):
result += dst_sheet.row(row).height result += dst_sheet.row(row).height
return result return result

Loading…
Cancel
Save