12
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【python】openpyxlを使ったエクセルの範囲コピー

Last updated at Posted at 2019-02-11

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 
);
12
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?