Python で excel・wordの読み書き

## はじめに

コピペが面倒だったので、Python で excel・wordの読み書き行いました。
しばらくしたら忘れそう＆とにかく動かしたい時のために、書き置きしておきます。
動作確認は、2020年3月20日に行っています。

## 環境

- OS : Windows10
- Python : 3.7.6
- openpyxl : 3.0.3
- python-docx :0.8.10

扱うのがExcel・Wordファイルなので、Windows上のPythonで実行しています。
実行はすべてコマンドプロンプトから行っています。


## Excelファイルの操作で必要なモジュールのインストール

Excelの操作にopenpyxl モジュールを使用しています。

```shell
>pip install openpyxl
```

参考：[openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files](https://openpyxl.readthedocs.io/en/stable/tutorial.html)

## Wordファイルの操作で必要なモジュールのインストール

Word操作にpython-docx モジュールを使用しています。

```shell
>pip install python-docx
```

参考：[python-docx 0.8.10 documentation](https://python-docx.readthedocs.io/en/latest/)

## Excelファイルへ書き込む

九九の表をExcelファイル（kuku.xlsx）に書き込みます。
Excelファイルは存在しなければ新規作成、存在すれば上書きします。


```python:excelwrite.py
#!/usr/bin/env python

from openpyxl import Workbook

# ファイル名
excel_write_file_name = "kuku.xlsx"

# シート名
sheet_name = "kuku"

# ワークブックオブジェクトの作成
# <class 'openpyxl.workbook.workbook.Workbook'>
wb = Workbook()

# ワークシートオブジェクトの作成
# <class 'openpyxl.worksheet.worksheet.Worksheet'>
sheet = wb.active

# シート名変更
sheet.title = sheet_name

# シート選択
ws = wb[sheet_name]

# 九九をワークシートオブジェクトに書き込み
for i in range(1, 10):
  for j in range(1, 10):
    sheet.cell(row=i, column=j, value=i * j)

# excel ファイルに書き込み
wb.save(excel_write_file_name)
```

実行します。

```shell
>excelwrite.py
```
実行結果として、「kuku.xlsx」ファイルが作成されています。
画面出力はありません。

実行時にExcelファイルを開いていると、書き込みに失敗してエラーになります。


## Excelファイルから読み込む

Excelファイル（kuku.xlsx）から九九の表を読み込み、表示します。


```python:excelread.py
#!/usr/bin/env python

from openpyxl import load_workbook

# ファイル名
excel_read_file_name = "kuku.xlsx"

# ワークブックオブジェクトの作成
# <class 'openpyxl.workbook.workbook.Workbook'>
wb = load_workbook(excel_read_file_name)

# シート名の一覧を取得
sheetname = wb.sheetnames

# 1つ目のシートを指定して、ワークシートオブジェクトを作成
# <class 'openpyxl.worksheet.worksheet.Worksheet'>
sheet = wb[sheetname[0]]

# 最大行数の取得
max_row = sheet.max_row

# 最大列数の取得
max_col = sheet.max_column

# 取得データの表示
for i in range(1, max_row + 1):
  for j in range(1, max_col + 1):
    cell = sheet.cell(column=j, row=i).value
    print(str(cell).rjust(2, " ") + " ", end="")
  print("")
```

実行します。

```shell
> excelread.py
```

実行結果です。
うまく読めると下記のように表が表示されさます。

```shell
 1  2  3  4  5  6  7  8  9
 2  4  6  8 10 12 14 16 18
 3  6  9 12 15 18 21 24 27
 4  8 12 16 20 24 28 32 36
 5 10 15 20 25 30 35 40 45
 6 12 18 24 30 36 42 48 54
 7 14 21 28 35 42 49 56 63
 8 16 24 32 40 48 56 64 72
 9 18 27 36 45 54 63 72 81
```


## Wordファイルへ書き込む

Wordファイル（word.docx）へテキストを書き込みます。
Wordファイルは存在しなければ新規作成、存在すれば上書きします。

```python:wordwrite.py
#!/usr/bin/env python

from docx import Document

# ファイル名
word_write_file_name = "word.docx"

# ドキュメントオブジェクト作成
# <class 'docx.document.Document'>
document = Document()

# テキスト書き込み
document.add_paragraph("Hello Word 1 page.")
document.paragraphs[0].add_run("add text")

# 改ページ追加
document.add_page_break()

# テキスト書き込み
document.add_paragraph("Hello Word 2 page.")
document.add_paragraph("Hello Word 3 page?")

# word ファイルに書き込み
document.save(word_write_file_name)
```

実行します。

```shell
>wordwrite.py
```

実行結果として、「wordwrite.py」ファイルが作成されています。
画面出力はありません。

Wordファイルを開いていると、書き込みに失敗してエラーになります。


## Wordファイルから読み込む

Wordファイル（word.docx）からテキストを読み込み、表示します。

```python:worderad.py
#!/usr/bin/env python

from docx import Document

# ファイル名
word_read_file_name = "word.docx"

# ドキュメントオブジェクト作成
# <class 'docx.document.Document'>
document = Document(word_read_file_name)

# データの表示
for i in document.paragraphs:
  print(i.text)
```


実行します。

```shell
>worderad.py
```

実行結果です。
うまく読めると下記のように表が表示されさます。

```shell
Hello Word 1 page.add text


Hello Word 2 page.
Hello Word 3 page?

```


## 最後に

Excelの作成時は、手作業でちまちまコピペしていましたが、これで一気に自動化が出来ました。
時間が経って、必要になったときにまた調べることになりそうなので、メモ代わりに書きました。

今回、Windowsで実行していて気が付きました。
シバンが`#!/usr/bin/env python`なのに、Windowsで動くんですね。
.py 拡張子でpythonが起動して、シバンはコメント扱いなのでしょうね。