2017-07-27 20 views
1

Python 2.7 + openpyxlを使用してワークシート内のセル範囲を移動しようとしています。簡単で基本的な仕事のように思われたことは不可能に近いことが判明しました。ここで私はそれをExcelで見たいのですがどのようである:openpyxlでは、書式設定、結合セル、式、ハイパーリンクでセル範囲を移動またはコピーする方法

Excel copying pasting

タスクは簡単ですが、私は(最後の行と列に)データの末尾に与えられたセルの範囲を移動する必要があると仮定しましょうようにするには。私の最初のアイデアは簡単でした:

for i, column in enumerate(columns): 
    if i >= starting_col: 
     for j, cell in enumerate(column): 
      if j >= starting_row: 
       copy_cell(ws, j+1, i+1, j+1, i+movement) 

しかし、ちょっと、どのように効率的かつ完全に実現するにはcopy_cell? 私はコピーする必要が4つの物事に来ることをどうにか試行錯誤によって:

  1. スタイル
  2. ハイパーリンク
  3. 数値形式

これはかなりのように動作しませんでした私は期待していた - ほとんどのセルは正しくコピーされているが、ハイパーリンクは動作していないようで、.style属性のコピーは機能しなかった(したがって、働いていた_styleにアクセスしようとした)、最悪の問題が現れた。どのように対処するのですか?私copy_cell()は、現時点では次のようになります。

def copy_cell(ws, from_row, from_col, to_row, to_col): 
    # first value 
    ws.cell(row=to_row, column=to_col).value = ws.cell(row=from_row, column=from_col).value 
    # second formatting 
    from_style = ws.cell(row=from_row, column=from_col)._style 
    ws.cell(row=to_row, column=to_col)._style = from_style 
    ws.cell(row=to_row, column=to_col).hyperlink = ws.cell(row=from_row, column=from_col).hyperlink 
    ws.cell(row=to_row, column=to_col).number_format = ws.cell(row=from_row, column=from_col).number_format 

があり、全セル範囲をコピーするためのより良い、一般的な方法はありませんか?または少なくともその属性のすべてを持つセル全体ですか?そうでない場合、合併されたセル範囲を効率的に移動またはコピーする方法がありますか?

答えて

1

私はその内容を触れずにセルをコピーするために、この方法を構築しています:

def move_cell(source_cell, dest_row, dest_col, preserve_original=False): 
    """ 
    :param source_cell: cell to be moved to new coordinates 
    :param dest_row: 1-indexed destination row 
    :param dest_col: 1-indexed destination column 
    :param preserve_original: if True, does a copy instead of a move 
    """ 
    if preserve_original: 
     cell_to_move = copy.copy(source_cell) 
    else: 
     cell_to_move = source_cell 

    worksheet = cell_to_move.parent 
    source_address = (cell_to_move.row, cell_to_move.col_idx) 
    dest_address = (dest_row, dest_col) 

    cell_to_move.row = dest_row 
    cell_to_move.col_idx = dest_col 
    worksheet._cells[dest_address] = cell_to_move 
    if not preserve_original: 
     del worksheet._cells[source_address] 

    return cell_to_move 
+0

あなたは、おそらくそれは古い質問ですが、私はdeepcopy' 'に苦しんで覚え' deepcopy' –

+0

を使用する必要があります。再帰的にコピーを実行し、セル構造内の配列の1つで失敗します。 – Artur

+0

@CharlieClarkポインタのおかげで。これまでのところ、私は問題に遭遇していませんが、奇妙なものが発生した場合には 'deepcopy'を念頭に置いています。 –

関連する問題