ファイルの操作

from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Border, Side
from openpyxl.worksheet.worksheet import Worksheet

# ワークブックとシートの作成
wb = Workbook()
ws = wb.active

# 結合セル
ws.merge_cells("A1:B1")
ws["A1"] = "結合されたセル"

# 色の設定
ws["A1"].fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")

# 関数の挿入
ws["C1"] = "=SUM(A2:A10)"

# 条件付き書式の設定
from openpyxl.formatting.rule import CellIsRule
ws.conditional_formatting.add("A2:A10", CellIsRule(operator="greaterThan", formula=["5"], fill=PatternFill(start_color="FF0000", end_color="FF0000", fill_type="solid")))

# 罫線の設定
thin_border = Border(left=Side(style="thin"), right=Side(style="thin"), top=Side(style="thin"), bottom=Side(style="thin"))
ws["A1"].border = thin_border

# 保存
wb.save("output.xlsx")

Excelを読み込んでxmlに出力する

以下に、openpyxlを使用してExcelデータを読み込み、シート名、セルの値、数式、色、罫線、結合状態を取得し、それらをXML形式で出力するPythonプログラムを作成しました。エラー処理も含めています。

import sys
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
import xml.etree.ElementTree as ET

def main():
    try:
        # Excelファイルの読み込み(ファイル名は適宜変更してください)
        workbook = load_workbook('sample.xlsx', data_only=False)
    except Exception as e:
        print(f"Excelファイルの読み込み中にエラーが発生しました: {e}")
        sys.exit(1)

    # XMLのルート要素を作成
    root = ET.Element('Workbook')

    try:
        # ワークシートごとに処理
        for sheet in workbook.worksheets:
            sheet_elem = ET.SubElement(root, 'Sheet', name=sheet.title)

            # 結合セルの範囲を取得
            merged_cells_ranges = sheet.merged_cells.ranges

            # 行と列をループ
            for row in sheet.iter_rows():
                for cell in row:
                    cell_elem = ET.SubElement(sheet_elem, 'Cell', {
                        'row': str(cell.row),
                        'column': get_column_letter(cell.column),
                        'address': cell.coordinate
                    })

                    # セルの値
                    value_elem = ET.SubElement(cell_elem, 'Value')
                    value_elem.text = str(cell.value) if cell.value is not None else ''

                    # 数式の取得
                    if cell.data_type == 'f':
                        formula_elem = ET.SubElement(cell_elem, 'Formula')
                        formula_elem.text = str(cell.value)

                    # スタイル情報
                    style_elem = ET.SubElement(cell_elem, 'Style')

                    # 色の取得
                    fill = cell.fill
                    if fill and fill.fgColor and fill.fgColor.type == 'rgb' and fill.fgColor.rgb:
                        fill_elem = ET.SubElement(style_elem, 'FillColor')
                        fill_elem.text = fill.fgColor.rgb

                    # 罫線の取得
                    border = cell.border
                    if border:
                        border_elem = ET.SubElement(style_elem, 'Border')
                        sides = ['left', 'right', 'top', 'bottom']
                        for side in sides:
                            side_border = getattr(border, side)
                            if side_border and side_border.style:
                                side_elem = ET.SubElement(border_elem, side)
                                side_elem.text = side_border.style

                    # 結合セルの判定
                    is_merged = any(cell.coordinate in merged_cell for merged_cell in merged_cells_ranges)
                    if is_merged:
                        merged_elem = ET.SubElement(cell_elem, 'Merged')
                        merged_elem.text = 'True'

    except Exception as e:
        print(f"Excelデータの処理中にエラーが発生しました: {e}")
        sys.exit(1)

    try:
        # XMLファイルへの書き込み
        tree = ET.ElementTree(root)
        tree.write('output.xml', encoding='utf-8', xml_declaration=True)
        print("XMLファイルへの出力が完了しました。")
    except Exception as e:
        print(f"XMLファイルの書き込み中にエラーが発生しました: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()

プログラムの説明

ライブラリのインポート:

openpyxl:Excelファイルの読み込みと操作に使用。

xml.etree.ElementTree:XMLデータの生成と操作に使用。

sys:エラー発生時にプログラムを終了するために使用。

エラー処理:

try-exceptブロックでエラーをキャッチし、適切なメッセージを表示してプログラムを終了します。

Excelファイルの読み込み:

load_workbook関数を使用してExcelファイルを読み込みます。data_only=Falseに設定して、数式をそのまま取得します。

XMLの生成:

ElementTreeを使用してXML構造を作成します。

ルート要素として<Workbook>を作成します。

ワークシートの処理:

各ワークシートに対して<Sheet>要素を作成し、name属性にシート名を設定します。