2023年5月31日分_Pythonのopenpyxlの応用編②

CHATGPTを4にアップデートしたので、以下の3ケースでPythonプログラムを書かせました
※実機チェックはしてないです

●openpyxlを使用して、ファイルの書式を別ファイルにコピーするプログラム

openpyxlを使用してAファイルの書式をBファイルにコピーする処理を行います。また、Bファイルのシート数を解析して抽出し、新しいExcelファイルに出力します。

from openpyxl import load_workbook
from openpyxl.styles import copy as style_copy

def copy_format(source_file, target_file):
    # Aファイルを読み込む
    source_workbook = load_workbook(source_file, read_only=True)

    # Bファイルを読み込む
    target_workbook = load_workbook(target_file)

    # Bファイルのシート数を解析して抽出する
    sheet_count = len(target_workbook.sheetnames)

    # Aファイルの書式をBファイルにコピーする
    for sheetname in source_workbook.sheetnames:
        source_sheet = source_workbook[sheetname]
        target_sheet = target_workbook.create_sheet(title=sheetname)

        # AファイルのA1からE20までのセル書式をコピーする
        for row in range(1, 21):
            for col in range(1, 6):
                source_cell = source_sheet.cell(row=row, column=col)
                target_cell = target_sheet.cell(row=row, column=col)
                target_cell._style = style_copy(source_cell._style)

    # 不要なデフォルトシートを削除する
    if 'Sheet' in target_workbook.sheetnames:
        default_sheet = target_workbook['Sheet']
        target_workbook.remove(default_sheet)

    # コピーした書式が適用されたBファイルを保存する
    target_workbook.save('新しいファイル名.xlsx')

# 使用例:A.xlsxのセル書式をB.xlsxにコピーする
copy_format('A.xlsx', 'B.xlsx')

●openpyxlを使用してファイルの2行のセル書式を別ファイルにコピーする方法

  1. openpyxlを使用してAファイルの2行のセル書式を、Bファイルの値が入っているすべての行に形式コピーする処理を行います。また、Bファイルを読み込んで解析し、空白でない列の範囲を特定します。最終的に新しいExcelファイルに出力します。

from openpyxl import load_workbook
from openpyxl.styles import copy as style_copy

def copy_format(source_file, target_file):
    # Aファイルを読み込む
    source_workbook = load_workbook(source_file, read_only=True)

    # Bファイルを読み込む
    target_workbook = load_workbook(target_file)
    target_sheet = target_workbook.active

    # Bファイルの空白でない列の範囲を解析する
    max_column = target_sheet.max_column

    # Aファイルの2行のセル書式をBファイルにコピーする
    for row in range(1, 3):  # Aファイルの2行の範囲に限定する
        for col in range(1, max_column + 1):
            source_cell = source_workbook.active.cell(row=row, column=col)
            target_cell = target_sheet.cell(row=row, column=col)
            target_cell._style = style_copy(source_cell._style)

    # 新しいファイルにBファイルの内容を保存する
    new_file = "新しいファイル名.xlsx"
    target_workbook.save(new_file)
    print(f"新しいファイル '{new_file}' を保存しました。")

# 使用例:A.xlsxの2行のセル書式をB.xlsxにコピーする
copy_format('A.xlsx', 'B.xlsx')

上記のコードでは、copy_format関数を定義しています。この関数は、指定されたAファイルの2行のセル書式を、Bファイルの値が入っているすべての行に形式コピーします。Bファイルを読み込んで解析し、空白でない列の範囲を特定します。

source_fileにAファイルのパス、target_fileにBファイルのパスを指定してください。指定されたAファイルの2行のセル書式がBファイルの対応する行にコピーされます。Bファイルの空白でない列の範囲を解析し、最終的に新しいファイルに出力します。

なお、read_only=Trueを指定してAファイルを読み込むことで、書き込み操作に関連する余分なメモリ使用量を削減することができます。また、Bファイルの値は変更せず、セル書式のみをコピーします。

●PANDASで条件抽出するコードを、openpyxlを使って同じ処理をする

openpyxlを使用してCSVファイルの条件抽出を行います。pandasを使用せずに、openpyxlだけで処理を行います。

●PANDASで処理

SummaryTable10=pd.read_csv(file_path)
SummaryTable20= SummaryTable10[(SummaryTable10["当日出来高/平均出来高"]>=5)]

●上記処理をopenpyxlで実行

from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

def extract_data(source_file, target_file):
    # ソースファイルを読み込む
    source_workbook = load_workbook(source_file, read_only=True)
    source_sheet = source_workbook.active

    # 条件抽出の条件を設定する(ここでは当日出来高/平均出来高が5以上の行を抽出する例)
    condition_column = "H"  # 当日出来高/平均出来高がある列(例えば、H列)
    condition_threshold = 5  # 抽出条件の閾値

    # 条件に合致する行のみを抽出して新しいシートに書き込む
    target_workbook = load_workbook(target_file)
    target_sheet = target_workbook.create_sheet(title="Extracted Data")

    for row in source_sheet.iter_rows(values_only=True):
        if row[source_sheet[condition_column].column - 1] >= condition_threshold:
            target_sheet.append(row)

    # ヘッダー行のスタイルを保持する
    header_style = source_sheet.row_dimensions[1].style

    # データが書き込まれたセルのスタイルを保持する
    data_styles = {}
    for cell in source_sheet[condition_column]:
        if cell.row != 1 and cell.value >= condition_threshold:
            data_styles[cell.coordinate] = cell.style

    # スタイルを適用して新しいシートに書き込む
    for row in dataframe_to_rows(target_sheet, index=False, header=False):
        target_sheet.append(row)
        row_index = target_sheet.max_row
        if row_index == 1:
            target_sheet.row_dimensions[row_index].style = header_style
        elif target_sheet.cell(row=row_index, column=condition_column).coordinate in data_styles:
            target_sheet.row_dimensions[row_index].style = data_styles[target_sheet.cell(row=row_index, column=condition_column).coordinate]

    # 不要なデフォルトシートを削除する
    if 'Sheet' in target_workbook.sheetnames:
        default_sheet = target_workbook['Sheet']
        target_workbook.remove(default_sheet)

    # ターゲットファイルを保存する
    target_workbook.save('新しいファイル名.xlsx')

# 使用例:source.csvから条件抽出してtarget.xlsxに保存する
extract_data('source.csv', 'target.xlsx')

●最後に

ChatGPT4はかなり優秀なので、業務でプログラムやExcelを頻繫に使用する方は、ぜひ有料版をお勧めます

この記事が気に入ったらサポートをしてみませんか?