PythonによるExcelワークシートとXMLの相互変換

XML（Extensible Markup Language）は超文書マークアップ言語であり、ファイル形式でもあります。XMLは、カスタムタグを設定でき、拡張性があり、読み書きしやすく、転送が容易などの特長があり、アプリケーション間のデータ交換の最も一般的なツールになっています。XML形式は、転送が容易で、開発者が表を操作しやすく、一般ユーザーに届ける際には、xlsやxlsxなどの形式で表示する必要があるため、ユーザーが読み書きしやすいです。本稿では、**XMLファイルとExcelスプレッドシートの相互変換**の方法について説明します。

本稿で紹介する方法では、[Spire.XLS for Python](https://www.e-iceblue.com/Introduce/xls-for-python.html)が必要であり、[公式ウェブサイトからダウンロードする](https://www.e-iceblue.com/Download/Spire-XLS-Python.html)か、pipでインストール（Dispatch 1.7.4も同時にインストール）することができます：
```
pip install Spire.XLS-for-Python
pip install plum-dispatch==1.7.4
```

## ExcelスプレッドシートをXMLに変換する
**SaveAsXML(fileName: str)** メソッドまたは **SaveToFile(fileName: str, FileFormat.XML)** メソッドを使用して、ExcelワークブックをXMLファイルに変換することができます。XMLファイルに変換すると、フォント、フォントサイズなどのスタイルだけが保持されます。次に詳細な操作手順を示します：

- **Workbook** クラスのオブジェクトを作成します。
- **Workbook.LoadFromFile()** メソッドでExcel表を読み込みます。
- **Workbook.SaveAsXml()** メソッドまたは **Workbook.SaveToFile()** メソッドで表をXMLファイルに変換して保存します。

**Python**
```Python
from spire.xls import *
from spire.common import *

# Workbookクラスのオブジェクトを作成
workbook = Workbook()

# Excelワークブックをロード
workbook.LoadFromFile("G:/文書/例.xlsx")

# XMLファイルに変換して保存
workbook.SaveAsXml("output/ワークブック.xml")

# workbook.SaveToFile("output/ワークブック.xml", FileFormat.XML)
```

**ワークブック**
![XMLファイルとExcelスプレッドシートの相互変換](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/186a1ad8-0e66-8647-6e92-1e1184757f62.png)

**変換結果**
![ExcelスプレッドシートをXMLに変換する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/74888a21-ac04-ab39-54a7-8b4230c069dd.png)

## 標準的なXMLファイルをExcelワークシートに変換する
Excelの標準に準拠したXMLファイルであれば、ワークブックに直接変換することができます。操作手順は以下の通りです：

- **Workbook** クラスのオブジェクトを作成します。
- **Workbook.LoadFromXml()** メソッドでXMLファイルを読み込みます
- **Workbook.SaveToFile()** メソッドでXMLファイルをExcelワークブックに変換して保存します。

**Python**
```Python
from spire.xls import *
from spire.common import *

# Workbookクラスのオブジェクトを作成
workbook = Workbook()

# XMLファイルをロード
workbook.LoadFromXml("output/ワークブック.xml")

# XMLファイルをExcelワークブックに変換して保存
workbook.SaveToFile("output/XMLからExcelへの変換.xlsx", FileFormat.Version2016)
```

**変換結果**
![標準的なXMLファイルをExcelワークシートに変換する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/311ea69c-e639-4f23-e0ee-be714f34ff48.png)

## XMLデータを読み取り、Excelワークブックに保存する
Excelの標準に準じていないXMLファイルの場合、その中のデータを読み取り、Excelワークブックに保存することで変換を実現することができます。
以下のXMLファイルを読み取るためのものです：
```XML
<students>
  <student>
    <姓名>ジョン</姓名>
    <年齢>25</年齢>
    <性別>男</性別>
    <住所>アメリカのどこかの町123番地</住所>
    <電話番号>(123) 456-7890</電話番号>
  </student>
  <student>
    <姓名>ジェーン</姓名>
    <年齢>30</年齢>
    <性別>女</性別>
    <住所>アメリカのどこかの町456番地</住所>
    <電話番号>(123) 456-7891</電話番号>
  </student>
  <student>
    <姓名>ジャック</姓名>
    <年齢>35</年齢>
    <性別>男</性別>
    <住所>アメリカのどこかの町789番地</住所>
    <電話番号>(123) 456-7892</電話番号>
  </student>
  <student>
    <姓名>サラ</姓名>
    <年齢>28</年齢>
    <性別>女</性別>
    <住所>アメリカのどこかの町321番地</住所>
    <電話番号>(123) 456-7893</電話番号>
  </student>
  <student>
    <姓名>デイビッド</姓名>
    <年齢>40</年齢>
    <性別>男</性別>
    <住所>アメリカのどこかの町654番地</住所>
    <電話番号>(123) 456-7894</電話番号>
  </student>
  <student>
    <姓名>エミリー</姓名>
    <年齢>22</年齢>
    <性別>女</性別>
    <住所>アメリカのどこかの町987番地</住所>
    <電話番号>(123) 456-7895</電話番号>
  </student>
  <student>
    <姓名>マイケル</姓名>
    <年齢>33</年齢>
    <性別>男</性別>
    <住所>アメリカのどこかの町246番地</住所>
    <電話番号>(123) 456-7896</電話番号>
  </student>
  <student>
    <姓名>レイチェル</姓名>
    <年齢>27</年齢>
    <性別>女</性別>
    <住所>アメリカのどこかの町135番地</住所>
    <電話番号>(123) 456-7897</電話番号>
  </student>  
</students>
```

詳細な操作手順は以下の通りです：

- **Workbook** クラスのオブジェクトを作成します。
- XMLデータをロードします。
- 最初のstudentノードを取得して列数とヘッダーを決定します。
- **Worksheet.Name** プロパティを通してワークシートの名前を設定します。
- **Worksheet.SetValue()** メソッドでデータを書き込みます。
- **Workbook.SaveToFile()** メソッドでワークブックを新しい Excel ファイルとして保存します。

**Python**
```Python
from spire.xls import *
from spire.common import *
import xml.etree.ElementTree as ET

# Workbookクラスのオブジェクトを作成
workbook = Workbook()

# XMLデータをロード
xml_tree = ET.parse("G:/文書/例.xml")
xml_root = xml_tree.getroot()

# 列数とヘッダーを決定するために最初のstudentノードを取得
first_student = xml_root.find("student")
header = list(first_student.iter())[1:]  # 最初のノードをスキップ

# ワークシートを追加し、ワークシート名を設定
worksheet_name = xml_root.tag
worksheet = workbook.Worksheets[0]
worksheet.Name = worksheet_name

# ヘッダーを書き込む
for col_index, header_node in enumerate(header, start=1):
    header_text = header_node.tag
    worksheet.SetValue(1, col_index, header_text)

# 学生データを書き込む
row_index = 2
for student in xml_root.iter("student"):
    for col_index, data_node in enumerate(list(student.iter())[1:], start=1):  # 最初のノードをスキップ
        value = data_node.text
        worksheet.SetValue(row_index, col_index, value)
    row_index += 1

# ワークブックを新しいExcelファイルとして保存
workbook.SaveToFile("output/new_workbook.xlsx")
```

**結果ファイル**
![XMLデータを読み取り、Excelワークブックに保存する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/04c5736d-4be2-3695-fdab-1a86ea697ed7.png)

> **以上がXMLとExcelシートの相互変換についての紹介です。Spire.XLS for Pythonには他にも多くの機能がありますので、[Spire.XLS for Pythonのチュートリアル](https://www.e-iceblue.com/Tutorials/Python/Spire.XLS-for-Python/Program-Guide/Spire.XLS-for-Python-Program-Guide-Content.html)で詳細をご覧いただけます。何か問題があれば、[Spire.XLSのフォーラム](https://www.e-iceblue.com/forum/spire-xls-f4.html?sid=b03b4170102eb831344482b1d2efbf60)で議論に参加してください。**