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")
以下に、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ブロックでエラーをキャッチし、適切なメッセージを表示してプログラムを終了します。
load_workbook関数を使用してExcelファイルを読み込みます。data_only=Falseに設定して、数式をそのまま取得します。
ElementTreeを使用してXML構造を作成します。
ルート要素として<Workbook>を作成します。
各ワークシートに対して<Sheet>要素を作成し、name属性にシート名を設定します。