pythonでエクセルを扱えるopenpyxlを使って、範囲コピーを行う関数を作りました。結合済みのセル、書式のコピーまで対応してます。
コピー先に結合されたセルがある場合はうまくいきません。
その場合は、コピー先のセルの結合を解除するように改造してください。
#セルの範囲コピー
#sheet ワークシート
#min_col 範囲コピーの最小列番号
#min_row 範囲コピーの最小行番号
#max_col 範囲コピーの最大列番号
#max_row 範囲コピーの最大行番号
#shift_col コピー先の列のオフセット
#shift_row コピー先の行のオフセット
def RangeCopyCell( sheet, min_col, min_row, max_col, max_row, shift_col, shift_row ):
#コピー元の結合されたセルの結合を解除していく。
merged_cells = copy.deepcopy(sheet.merged_cells);
for merged_cell in merged_cells :
if merged_cell.min_row >= min_row \
and merged_cell.min_col >= min_col \
and merged_cell.max_row <= max_row \
and merged_cell.max_col <= max_col :
#結合を解除していく。
sheet.unmerge_cells(merged_cell.coord);
#全セルをコピー
for col in range( min_col, max_col+1):
for row in range( min_row, max_row+1):
fmt = "{min_col}{min_row}"
#コピー元のコードを作成。
copySrcCoord = fmt.format(
min_col = get_column_letter(col),
min_row = row );
#コピー先のコードを作成。
copyDstCoord = fmt.format(
min_col = get_column_letter(col + shift_col),
min_row = row + shift_row );
#コピー先に値をコピー。
if type(sheet[copySrcCoord]) != MergedCell :
sheet[copyDstCoord].value = sheet[copySrcCoord].value;
#書式があったら、書式もコピー。
if sheet[copySrcCoord].has_style :
sheet[copyDstCoord]._style = sheet[copySrcCoord]._style;
#結合解除したセルを再結合していく。
for merged_cell in merged_cells :
if merged_cell.min_row >= min_row \
and merged_cell.min_col >= min_col \
and merged_cell.max_row <= max_row \
and merged_cell.max_col <= max_col :
#結合していく。
sheet.merge_cells(merged_cell.coord);
#コピー先のセルの結合範囲情報を作成する。
newCellRange = copy.copy(merged_cell);
#コピー先のセルの結合範囲情報をずらす。ここではshiftRow分ずらしている。
newCellRange.shift(shift_col, shift_row);
sheet.merge_cells(newCellRange.coord);
return 0;
#サンプルコード
#ブックを開く。
book = px.load_workbook('demo.xlsx');
sheet = book.get_sheet_by_name("Sheet1");
#セルの範囲コピーを実行。
#[1,1]~[10,20]までの範囲のセルをコピー。
#コピー先は12行(shift_row)シフトした場所です。
RangeCopyCell(
sheet = newSheet,
min_col = 1,
min_row = 1,
max_col = 10,
max_row = 20,
shift_col = 0,
shift_row = 12
);