PythonでExcelのワークシートデータをCSV、XML、テキストに書き込む

Excelワークブックは一般的なスプレッドシート形式であり、多くのデータの表示、データ分析、データレポートに使用されます。しかし、実際のデータ管理、分析、または自動化プロセスの構築では、これらのExcelデータを他のデータシステムに移行したり、他のプログラムとのインタラクションのためにテキスト形式で保存したりする必要があります。Pythonは強力で柔軟なプログラミング言語であり、この目的を効率的に達成することができます。この記事では、Pythonプログラミング言語を使用して**Excelワークシートの豊富なデータをCSV、XML、またはテキストにインポートする方法**を示します。また、記事中の方法を使用してデータを他のファイルやデータシステムに読み込み、書き込むこともできます。

- **[Excelワークシートを直接CSVに変換する](#excelワークシートを直接csvに変換する)**
- **[Excelワークシートのデータを読み込んでCSVに保存する](#excelワークシートのデータを読み込んでcsvに保存する)**
- **[ExcelワークブックをOpenXMLに変換する](#excelワークブックをopenxmlに変換する)**
- **[Excelワークシートのデータを読み込んでXMLに書き込む](#excelワークシートのデータを読み込んでxmlに書き込む)**
- **[Excelワークシートのデータをテキストとして保存する](#excelワークシートのデータをテキストとして保存する)**

この記事では、[Spire.XLS for Python](https://www.e-iceblue.com/Download/Spire-XLS-Python.html)を使用します。公式ウェブサイトから入手するか、PyPIを通じてインストールできます：`pip install Spire.XLS`。

**[無料ライセンスの申請](https://www.e-iceblue.com/TemLicense.html)**


サンプルExcelファイル

![PythonでExcelファイルを読み込む](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/5ee9e7e0-b45d-660b-7e2e-3fb7c0ada668.png)

## Excelワークシートを直接CSVに変換する
このAPIを使用すると、指定したワークシートを直接CSVファイルに変換できます。以下に手順を示します：
1. 必要なモジュールをインポートします。
2. `Workbook`クラスのオブジェクト`wb`を作成します。
3. `wb.LoadFromFile()`メソッドを使用して指定されたパスのExcelファイルをロードします。
4. 指定したインデックス位置のワークシート`ws`を取得します。
5. `Worksheet.SaveToFile(string fileName, string Separator, Encoding)`メソッドを使用してワークシートをCSVファイルに変換し、保存します。
6. リソースを解放します。

**コード例**
```python
from spire.xls import *
from spire.xls.common import *

# Workbookオブジェクトの作成
wb = Workbook()

# Excelファイルの読み込み
wb.LoadFromFile("サンプル.xlsx")

# ワークシートの取得
ws = wb.Worksheets.get_Item(0)

# ワークシートをCSVファイルとして保存
ws.SaveToFile(f"output/{ws.Name}.csv", ",", Encoding.get_UTF8())
wb.Dispose()
```

**抽出結果**
![Python ExcelをCSVに変換](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/f198685e-7534-e3f2-bf03-0ae4b53ab35b.png)

## Excelワークシートのデータを読み込んでCSVに保存する
直接変換するだけでなく、指定したセル範囲のデータを読み込み、CSVファイルに書き込むことで、カスタムのデータ抽出を実現することもできます。以下は手順です：
1. 必要なモジュールをインポートします。
2. `Workbook`クラスのオブジェクト`wb`を作成します。
3. `wb.LoadFromFile()`メソッドを使用して指定されたパスのExcelファイルをロードします。
4. 指定したインデックス位置のワークシート`ws`を取得します。
5. ワークシートの使用範囲（つまりデータが存在する部分）を`usedRange`として確定します。
6. `usedRange`の各行と各列を反復処理します：
   - セルの値を取得し、カンマを含む文字列のセルの値にはダブルクォーテーションを追加します。
   - 処理されたセルの値を`rowData`リストに追加します。
7. 各行の`rowData`リストを処理し、カンマ区切りの文字列に変換し、末尾に改行文字を追加して`data`文字列に結果を追加します。
8. CSVファイル（現在のワークシート名で命名）を書き込みモードとUTF-8エンコーディングで開き、`data`文字列の内容をファイルに書き込みます。
9. `wb.Dispose()`メソッドを使用してリソースを解放し、メモリをクリアします。

**コード例**
```python
from spire.xls import *
from spire.xls.common import *

# Workbookオブジェクトの作成
wb = Workbook()

# Excelファイルの読み込み
wb.LoadFromFile("サンプル.xlsx")

# ワークシートの取得
ws = wb.Worksheets.get_Item(0)

# 使用範囲の取得
usedRange = ws.AllocatedRange

data = ""
# 使用範囲の繰り返し処理
for i in range(1, usedRange.Rows.Count + 1):
    rowData = []
    for j in range(1, usedRange.Columns.Count + 1):
        # セルの値の取得
        cellValue = usedRange[i, j].Value
        # カンマを含むデータには引用符を追加
        if isinstance(cellValue, str) and ',' in cellValue:
            cellValue = f'"{cellValue}"'
        rowData.append(str(cellValue))
    data += ",".join(rowData) + "\n"

# データをCSVファイルに書き込む
with open(f"output/CSV/{ws.Name}.csv", "w", encoding='utf-8') as f:
    f.write(data)
wb.Dispose()
```

**抽出結果**
![PythonワークシートデータをCSVに書き込む](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/c3c274b0-82c8-f192-fc18-316c246eca2a.png)

## ExcelワークブックをOpenXMLに変換する
WorkbookクラスのSaveAsXmlメソッドを使用すると、ワークブックを直接Open XMLファイルに変換できます。以下は手順です：
1. 必要なモジュールをインポートします。
2. `Workbook`クラスのオブジェクト`wb`を作成します。
3. `wb.LoadFromFile()`メソッドを使用して指定されたパスのExcelファイルをロードします。
4. `Workbook.SaveAsXml()`メソッドを使用してワークブックをOpen XMLファイルに変換し、保存します。
6. リソースを解放します。

**コード例**
```python
from spire.xls import *
from spire.xls.common import *

# Workbookオブジェクトの作成
wb = Workbook()

# Excelファイルの読み込み
wb.LoadFromFile("サンプル.xlsx")

# OpenXMLファイルとして保存
wb.SaveAsXml("output/WorkbookToOpenXML.xml")
wb.Dispose()
```

**抽出結果**
![Python ExcelをOpen XMLに変換](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/ec41e207-f982-444b-564f-79fccf81f8a1.png)

## Excelワークシートのデータを読み込んでXMLに書き込む
ワークブックを直接Open XMLファイルに変換するだけでなく、表データを読み込んでカスタムのXMLファイルを作成することもできます。`xml.etree.ElementTree`を導入してXMLの書き込みを容易にすることができます。以下は手順の例です：
1. 必要なモジュールをインポートします。
2. `Workbook`クラスのオブジェクト`wb`を作成します。
3. `wb.LoadFromFile()`メソッドを使用して指定されたパスのExcelファイルをロードします。
4. インデックスが0のワークシート`ws`を取得します。
5. ワークシートの使用範囲`usedRange`を取得します。
6. "Worksheet"という名前のXMLのルート要素`root`を作成します。
7. XMLのルート要素の下に"Name"という子要素を作成し、そのテキストコンテンツを現在のワークシートの名前に設定します。
8. 使用範囲（行単位）を反復処理します：
   - 各行に対して、"Row"という子要素を作成します。
   - その行の各セルを反復処理します（列単位）：
     - セルの値を取得します。
     - "Row"要素の下に"Cell"という子要素を作成します。
     - "Cell"要素の下にさらに"Data"という子要素を作成し、セルの値を文字列に変換してそのテキストコンテンツに設定します。
9. 生成されたすべてのXML要素を完全なXMLツリー構造に組み立て、`xml_tree`変数に保存します。
10. `xml_tree.write()`メソッドを使用してXMLデータを「ワークシート書き込みXML.xml」という名前のファイルに書き込みます。同時にUTF-8エンコーディングとXML宣言を指定します。
11. 最後に、`wb.Dispose()`メソッドを呼び出してリソースを解放し、Excelワークブックオブジェクトを閉じてクリーンアップします。

**コード例**
```python
import xml.etree.ElementTree as ET
from spire.xls import *
from spire.xls.common import *

# Workbookオブジェクトの作成
wb = Workbook()

# Excelファイルの読み込み
wb.LoadFromFile("サンプル.xlsx")

# ワークシートの取得
ws = wb.Worksheets.get_Item(0)

# 使用範囲の取得
usedRange = ws.AllocatedRange

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

# ワークシート名を設定
name_element = ET.SubElement(root, "Name")
name_element.text = ws.Name

# 使用範囲の繰り返し処理
for i in range(1, usedRange.Rows.Count + 1):
    row_element = ET.SubElement(root, "Row")
    for j in range(1, usedRange.Columns.Count + 1):
        # セルの値の取得
        cellValue = usedRange[i, j].Value
        # セル要素の作成
        cell_element = ET.SubElement(row_element, "Cell")
        # データ要素の作成
        data_element = ET.SubElement(cell_element, "Data")
        data_element.text = str(cellValue)

# XMLドキュメントの作成
xml_tree = ET.ElementTree(root)
# データをXMLファイルに書き込む
xml_tree.write("output/XML/WorksheetToXML.xml", encoding="utf-8", xml_declaration=True)
wb.Dispose()
```

**抽出結果**
![Python ExcelワークシートをXMLに書き込む](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/890147da-63e9-9c91-8dee-91655f64bae1.png)

## Excelワークシートのデータをテキストとして保存する
データを直接変換するだけでなく、Excelのワークシートからデータを読み込んでテキストファイルに保存することもできます。以下は手順です：
1. 必要なモジュールをインポートします。
2. `Workbook`クラスのインスタンス`wb`を初期化します。
3. `wb.LoadFromFile()`関数を使用してExcelファイルをロードします。
4. インデックス0のワークシートを選択し、変数`ws`に代入します。
5. ワークシートの使用範囲を取得し、変数`usedRange`に格納します。
6. 空の文字列`data`を初期化し、すべてのセルのデータを収集するために使用します。
7. 使用範囲の行と列を反復処理します：
   - 各行について（2行目から開始します。Excelのインデックスは1から始まるため）、次の操作を行います：
     - その行の各セルについて：
       - セルの値を取得し、文字列に変換して`data`の末尾に追加します。
       - 現在のセルが行内の最後のセルでない場合、タブ文字`\t`を追加してデータを区切ります。
     - 1行のすべてのセルの処理が完了したら、`data`の末尾に改行文字`\n`を追加します。これにより、出力時に異なる行のデータを区別します。
8. `with open()`文を使用して新しいファイルを「書き込み」モードで開きます。ファイル名は現在のワークシートの名前に基づいて拡張子`.txt`を付けたものであり、パスは「output/」ディレクトリに設定されます。
9. 事前に結合したすべてのセルデータを含む文字列`data`を、作成したテキストファイルに書き込みます。
10. ファイルストリームを閉じて、データが正常に書き込まれたことを確認します。
11. `wb.Dispose()`メソッドを呼び出してリソースを解放し、Excelのワークブックオブジェクトを閉じてクリーンアップします。

**コード例**
```python
from spire.xls import *
from spire.xls.common import *

# Workbookオブジェクトの作成
wb = Workbook()

# Excelファイルの読み込み
wb.LoadFromFile("サンプル.xlsx")

# ワークシートの取得
ws = wb.Worksheets.get_Item(0)

# 使用範囲の取得
usedRange = ws.AllocatedRange

data = ""
# 使用範囲の繰り返し処理
for i in range(1, usedRange.Rows.Count + 1):
    for j in range(1, usedRange.Columns.Count + 1):
        # セルの値の取得
        cellValue = usedRange[i, j].Value
        data += str(cellValue)
        if j < usedRange.Columns.Count:
            data += "\t"
    data += "\n"

# データをテキストファイルに書き込む
with open(f"output/{ws.Name}.txt", "w", encoding='utf-8') as f:
    f.write(data)
wb.Dispose()
```

**抽出結果**
![Python Excelワークシートデータをテキストに書き込む](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/7c59d902-5619-3299-4b35-cbd90a9a1aca.png)


以上の内容は、Pythonを使用してExcelデータをCSV、XML、テキストファイルに変換する方法を示しています。
[その他のExcel操作記事](https://www.e-iceblue.com/Tutorials/Python/Spire.XLS-for-Python/Program-Guide/Spire.XLS-for-Python-Program-Guide-Content.html)
[技術サポート](https://www.e-iceblue.com/forum/spire-xls-f4.html)