2017-04-20 35 views
0

我有一个Python 2.7脚本,可以转换各种数据并通过OpenPyXL 2.4.5将它输出到XLSX。目前我正在遍历所有单元格,我使用“max_row”和“max_column”缩小了这些单元格的大小。这对我来说看起来不是很快或很有效。什么是设置以下最快的方法?如果你能提出一般的方法论,我将不胜感激。以下粗略基准测试适用于Windows 7 SP1 x64,配备16 GB RAM和Intel [email protected] GHz。格式化最快的方法

  • 边框(格式化35880个细胞花费40秒。)
  • 字体和对齐(格式化35880个细胞需要42s中。)
  • 底纹(格式化35880个细胞需要28S)
  • 隐藏未使用的行/列(隐藏16,380列×1,039,606行需要很多分钟,仅隐藏列需要0.2秒。)

以下是迭代方法。

def format_xlsx(csv_list, ws_to_format): 
    """ Use OpenPyXL to format a XLSX. """ 
    process_start = timer() 
    for row in csv_list: 
     count = count + 1 
     ws_to_format.append(row) 
    row_count = ws_to_format.max_row 
    column_count = ws_to_format.max_column 
    for y_axis in range(1, column_count+1): 
     for x_axis in range(1, row_count+1): 
      ws_to_format = xlsx_borders(ws_to_format, x_axis, y_axis) 
      ws_to_format = xlsx_shading(ws_to_format, x_axis, y_axis) 
      ws_to_format = xlsx_font_and_alignment(ws_to_format, x_axis, y_axis) 
    ws_to_format = xlsx_hide_unused_colrow(ws_to_format) 
    return 

以下是隐藏未使用的行/列的方法。

def xlsx_hide_unused_colrow(ws_to_format): 
    row_count = ws_to_format.max_row 
    column_count = ws_to_format.max_column 
    start_range = column_number_to_letter(column_count+2) 
    end_range = column_number_to_letter(16384) 
    ws_to_format.column_dimensions.group(start_range, end_range, hidden=True) 
    start_range = row_count+2 
    for y in xrange(start_range, 1048577): 
     ws_to_format.row_dimensions[y].hidden=True 

回答

0

,因为他们计算在每次他们是所谓的时间你不应该叫ws.max_rowws.max_column环内。由于工作表的大小在工作期间没有变化,因此只需要调用一次。

此外,将样式应用于行和列尺寸可能不会达到您期望的效果,请参阅相关文档。您需要将样式应用到相关行和列中的单元格。如果要格式化很多单元格,请使用命名样式。

+0

- 感谢指针。我是Python新手,所以请原谅这个问题是否愚蠢,但是我没有在for循环之外指定“max_row”/“max_column”吗? – Burzin

+0

您可以在嵌套函数中调用max_column,并在for循环中调用该函数。 –