OpenPyXLでExcelファイル読み書き。

# はじめに
PythonでのExcelファイル操作はpandasで大体できるが、書式指定の読み書き等細かい操作はopenpyxlの方が得意だったりする。この記事では、openpyxlのファイル読み書きから書式指定までの一連の操作をまとめる。

# 目次
+ [前準備](#前準備)
+ [Excelファイル操作基本](#excelファイル操作基本)
+ [シート操作](#シート操作)
+ [セル操作](#セル操作)

## 前準備
openpyxlのライブラリをpipより取得する。openpyxlをimportする際、pxに別名設定(エイリアス)して使う。必須ではないが、この記事では以降、pxとして記述する。
```python:openpyxl_example.py
import openpyxl as px
```
公式サイトはこちら

https://openpyxl.readthedocs.io/en/stable/

[戻る](#目次) 

## Excelファイル操作基本
Excelファイルの　Open～Save/Close　までの一連の操作方法は以下の通り。
操作|コマンド
--|--
新規作成|wb = px.Workbook()
Open|wb = px.load_workbook( file_name )
Open(ReadOnly)|wb = px.load_workbook( file_name , read_only=True)
Close|wb.close()
Save|wb.save(file_name)<br>　Openと同じfile_nameであれば上書き。
アクティブSheet|ws = wb.active
セル読み書き|cell=ws['A1'].value<br>ws['A1'].value  = cell

```python:openpyxl_example.py
import openpyxl as px

#新規作成=========================================
wb = px.Workbook()

#Activeなシート指定
ws = wb.active

#セルA:1に文字を書き込み
ws['A1'].value  = 'あいうえお'

#Save保存
wb.save('openpyxl_test.xlsx')

#読み込み指定でOpen/Closeする===================
wb = px.load_workbook('openpyxl_test.xlsx',read_only=True)

#Activeなシート指定
ws = wb.active

#A:1のデータ読み出し
print(ws['A1'].value)
# あいうえお

#Close
wb.close()
```
[戻る](#目次)

## シート操作

操作|コマンド
--|--
Sheet一覧|sheet_list = wb.sheetnames
アクティブSheet|ws = wb.active
Sheet指定|ws = wb[ sheet_name ]
Sheet追加|wb.create_sheet(sheet_name, index=0)<br>　indexで挿入場所指定0は先頭
Sheet削除|wb.remove(wb[ sheet_name ])
Sheet移動|wb.move_sheet(sheet_name, offset=0)<br>　offsetで移動場所指定0は先頭
Sheet名変更|ws.title = sheet_name 
Sheetコピー|wb.copy_worksheet(wb[sheet_name])


```python:openpyxl_example.py
import openpyxl as px

#新規作成
wb = px.Workbook()

#シート追加---
wb.create_sheet('test_1', index=0)	#先頭に'test_1'追加
wb.create_sheet('test_2', index=0)	#先頭に'test_2'追加
wb.create_sheet('test_A')			#最後に'test_A'追加
print(wb.sheetnames)
# ['test_2', 'test_1', 'Sheet', 'test_A']

#シート削除---
wb.remove(wb['test_2'])				#'test_2'削除
print(wb.sheetnames)
# ['test_1', 'Sheet', 'test_A']

#シート移動---
#逆順
sheet_list=wb.sheetnames
sheet_list=sheet_list[::-1]
#シート移動
for i, sheet in enumerate(sheet_list):
	wb.move_sheet(sheet, offset=i)
print(wb.sheetnames)
# ['test_A', 'Sheet', 'test_1']

#シート名変更---
ws = wb['Sheet']
ws.title ='modify_sheet'
print(wb.sheetnames)
# ['test_A', 'modify_sheet', 'test_1']

#Save保存
wb.save('openpyxl_test.xlsx')
```
[戻る](#目次)

## セル操作
操作|コマンド
--|--
セル指定|cell = ws['B1']<br>cell = ws.cell(1,2)	#ws.cell(行,列)
行最大数|ws.max_row
列最大数|ws.max_column
行指定|cell_tuple=ws['1']
列指定|cell_tupple=ws['A']
範囲指定|cell_tuple=ws['A1':'D11']

**openpyxl_example.xlsx**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299802/f4c26b80-2fe7-815f-c9e0-3cf6bbe864d1.png)



```python:openpyxl_example.py
import openpyxl as px

wb = px.load_workbook('openpyxl_example.xlsx')
ws = wb['example_1']

#読み出し単セル
cell = ws['A1']
print(cell.value)
# アルファベット

cell = ws.cell(2,1)	#ws.cell(行,列)
print(cell.value)
# a

#行最大数
print(ws.max_row)
# 11

#列最大数
print(ws.max_column)
# 4

#列指定(A列)
cell_tupple=ws['A']
colmun_list=[]
for cell in cell_tupple:
	if cell.value is None:	#セル空白判定
		break
	else:
		colmun_list.append(cell.value)
print(colmun_list)
# ['アルファベット', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
		
#行指定(1行)
cell_tuple=ws['1']
row_list=[]
for cell in cell_tuple:
	if cell.value is None:	#セル空白判定
		break
	else:
		row_list.append(cell.value)
print(row_list)
# ['アルファベット', 'ひらがな', '整数', '小数']


#複数セル指定
wb.create_sheet('example_2')
ws2=wb['example_2']

cell_tuple=ws['A1':'D11']
for i, column in enumerate(cell_tuple):
	for j, cell in enumerate(column):
		if cell.value is None:	#セル空白判定
			break
		else:
			# 'example_1'の内容を'example_2'へ複製する
			ws2.cell(i+1,j+1).value = cell.value

#Save保存
wb.save('openpyxl_example.xlsx')
```
[戻る](#目次)

## 書式付き処理
+ [フォント](#フォント)
+ [セル色](#セル色)
[戻る](#目次)

### フォント
```from openpyxl.styles import Font```でフォントのライブラリをコールする。
```Font(各種パラメータ)```で書式を選択し、```.font```でセルへ設定する。各種パラメータは下記の通り。

操作|パラメータ
----|----
フォント|name=#フォント名
文字色|color='00FF0000' #カラーコード
サイズ|size=2
太字|bold=True
斜体|italic=True
取り消し線|strike=True
下線|underline ='single'

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299802/d2833ecb-b128-8e35-40f1-87a1963178be.png)

```python:openpyxl_example.py
import openpyxl as px
from openpyxl.styles import Font

wb = px.load_workbook('openpyxl_example.xlsx')
ws = wb['example_1']

font1 = Font(color='00FF0000', size=18 ,underline='single', bold=True,  name='HGSｺﾞｼｯｸE')
ws['A1'].font = font1

#Save保存
wb.save('openpyxl_example.xlsx')
```
[戻る](#書式付き処理)

### セル色
```from openpyxl.styles import PatternFill```でセル色のライブラリをコールする。
```PatternFill(patternType='solid', fgColor='カラーコード')```で色設定をし、```.fill```でセルへ設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299802/69a5e333-b8aa-1829-155e-a9ab0c1d269c.png)


```python:openpyxl_example.py
import openpyxl as px
from openpyxl.styles import PatternFill

wb = px.load_workbook('openpyxl_example.xlsx')
ws = wb['example_1']

fill_type = PatternFill(patternType='solid', fgColor='0000FFFF')

ws['A1'].fill = fill_type

#Save保存
wb.save('openpyxl_example.xlsx')
```
[戻る](#書式付き処理)