ライブラリ openpyxl
※pandasのto_excel内でも使われている。
(import pandas as pd)
pd.read_excel()
pd.to_excel()
xlwings (import xlwings as xw) xlrd(黒字), xlwt(オレンジ)
※pandas内でも使われている。
xlsxwriter
※pandasのto_excel内でも使われている。
参考サイト https://gammasoft.jp/support/how-to-use-openpyxl-for-excel-file/ read_excel https://ysko909.github.io/posts/edit-excel-with-python-and-xlwings/ https://note.nkmk.me/python-xlrd-xlwt-usage/ https://www.python-izm.com/third_party/excel/xlsxwriter/xlsxwriter_write/
公式 to_excel アドイン化 公式
  at_iat_loc_iloc 公式の翻訳版  
サポート拡張子 .xlsx
※.xls非サポート
.xlsx, .xls
※read_cvs, to_csvなら.csvも扱える。
.xlsx .xlsx, .xls
(xlwtは.xlsのみ対応)
.xlsx
データの定義 - df = pd.DataFrame([[11, 21, 31], [12, 22, 32], [31, 32, 33]],
         index=['one', 'two', 'three'], columns=['a', 'b', 'c'])
- - -
ブック操作 新規作成 wb = openpyxl.Workbook() df.to_excel(''Sample.xlsx", sheet_name="Sheet1")
※データdfの定義が先。
※ファイルがなければ新規作成
wb = xw.Book() wb1 = xlwt.Workbook() wb  = xlsxwriter.Workbook('Sample.xlsx')
保存 wb.save("Sample.xlsx") df.to_excel(''Sample.xlsx", sheet_name="Sheet1")
※データdfの定義が先。
※ファイルが存在する場合は上書き保存
wb.save("Sample.xlsx") wb1.save("Sample.xls")
※このwbはxlwtのみ対応。xlrdしたwbのsaveは非対応。
※add_sheet後に保存可
wb.close()
※既存ファイル名を指定すると上書き保存
既存Excelファイルの読み込み wb = openpyxl.load_workbook("Sample.xlsx")
※ワークブック型として読み込む。
df = pd.read_excel('Sample.xlsx', sheet_name=0)
※sheet_name引数を省略すると一番左のシート内データが読み込まれる。
wb = xw.Book("Sample.xlsx")
※実行するとExcelが開く。
wb = xlrd.open_workbook('Sample.xlsx') -
with pd.ExcelWriter("Sample.xlsx", engine="openpyxl", mode="a") as writer:
※read_excelはデータを読み込むのに対し、ExcelWriterは実質wbオブジェクト(データを書き込む対象とするexcelファイル)を定義する。
※engineはxlsxwriterも使用可
※mode="a"で追記モードが使える。
シート操作 シート取得(シート名で) ws = wb["Sheet1"] ・・・(A)
※データだけではなくシートそのもの(データ込み)を定義するイメージ。
df = pd.read_excel('Sample.xlsx', sheet_name="Sheet1")
※シートオブジェクトではなく、DataFrameオブジェクト(シート内のデータ)の取得になる。
※pandasではwbはパス指定だけで直にシートの中身を見に行く。
ws = wb.sheets["Sheet1"] ws = wb.sheet_by_name('Sheet1') -
シート取得(番号で) ws = wb.worksheets[0] df = pd.read_excel('Sample.xlsx', sheet_name=0) ws = wb.sheets[0] ws = wb.sheet_by_index(0) -
複数シートの中身取得 - df_sheet_multi = pd.read_excel('Sample.xlsx', sheet_name=[0, "sheet2"])
※indexもしくはシート名で取得。それらをkeyとしてシートの中身がvalueの辞書.
- - -
複数シートから取得した中身の読み出し - df_sheet_multi[0]
df_sheet_multi["sheet2"]
- - -
全シートの中身取得 - ws_all = pd.read_excel('Sample.xlsx', sheet_name=None)
※None指定により全シート一括取得になる。
※sheet_nameを指定しないとindex0のシートが選択される。
- ws = wb.sheets() -
wb内シート名リストの取得 ws_list = wb.sheetnames -   - -
シート名の取得 ws.title -   - -
シート名変更 (A)を前提として
ws.title = "Sheet2"
-   - -
指定シートを指定wb内にコピー(末尾に) ws2 = wb.copy_worksheet(wb["Sheet2"])
※("ws2 ="の部分はなくてもよい)
with pd.ExcelWriter('Sample.xlsx') as writer:
    df.to_excel(writer, sheet_name='sheet1')
    df2.to_excel(writer, sheet_name='sheet2')
※事前にdf, df2を用意
  - -
シート追加 ws3 = wb.create_sheet(title="Sheet3") with pd.ExcelWriter('Sample.xlsx') as writer:
    df.to_excel(writer, sheet_name='sheet1_copy')
  ws = wb.add_sheet("Sheet2")
wb.save("Sample.xls") ※xlsのみ対応。
ws = wb.add_worksheet('Sheet3')
シート追加(指定indexに) ws3 = wb.create_sheet(title="Sheet3", index=2) ※上記ブック保存参照   - -
指定シートの削除 wb.remove(ws3) -   - -
末尾のシートの削除 wb.remove(wb.worksheets[-1]) -   - -
行・列幅指定 - -   - ws.set_row(3, 50)  ※3行目を幅50
ws.set_column("A:A", 50)
セル操作 1セルオブジェクトの取得(1) c1 = ws["A1"] - - c1 = ws.cell(1,2) -
1セルオブジェクトの取得(2) c1 = ws.cell(row=1, column=1) -   c1 = ws.cell(1,2) -
1行/1列分のセルオブジェクト取得 row = ws[2]
※0ではなく1から始まるインデックスのリスト。
    row = ws.row(2)
column = ws.col(3)
-
1行内の複数セルオブジェクト取得 rows = ws[1:2]
※0ではなく1から始まるインデックスのリスト。
      -
複数行分のセルオブジェクト取得 cell_range = ws['A1':'C2'] -   - -
1行/1列分の値取得 - df.loc["行名"]
df["列名"] 
  ws.row_values(2)
ws.col_values(1)
-
セルアドレス取得 c1.coordinate -   - -
セルの行番号取得 c1.row -   - -
セルの列番号取得 c1.column -   - -
列アルファベット取得 c1.column_letter -   - -
index/column値の取得 - df.index.values
df.columns.values
  - -
1セルの値の読み取り val1 = c1.value df.at["行名", "列名"]  <-1セルのみ
df.iat[行数, 列数] <-1セルのみ
df.loc["行名", "列名"] <-複数行列可能
df.iloc[行数, 列数] <-複数行列可能
ws.range("A1").value セルオブジェクトから: c1.value
シートオブジェクトから直接: ws.cell_value(1.2)
-
1セルの値の書き込み c1.value = 12000 df.at["行名", "列名"] = 値
df.loc["行名", "列名"] = 値
ws.range("A1").value = 1 ws.write(行, 列, "値")
※xlsのみ対応
ws.write(行, 列, "値")
ws.write("A1", "値")
※xlsxも対応
複数セルの値の読み取り for文対応 df.loc["開始行名":"終了行名", "列名"]
df.loc[:"終了行名", ["列1", "列2"]]
ws.range("A1").expand("table").value
※選択セルの上下左右に隣接するセルたちからなるテーブル範囲を自動で取得
-
※リスト内包表記と組み合わせれば可能。
 
複数セルの値の書き込み for文対応   ws.range("A1").value = [[1,2],[3,4]]    
数式の書き込み c1.value = "=SUM(C1:C5)" -   ws.write(行, 列, "xlwt.Formula(sum(B2:B3))") ws.write('B5', '=sum(B2,B3,B4)')
書式設定 セルの書式設定(1) ws["B2"].number_format = "0.00"
ws["A2"].number_format = "yyyy年mm月dd日"
-   - -
セルの書式設定(2) from openpyxl.styles import Font
ws["C2"].font = Font(bold=True, italic=True)
-   - format = wb.add_format()
format.set_bold()
format.set_font_color('blue')
format.set_font_name('Arial')
ws.write('A1', '値', format)
罫線追加 side = Side(style='thin', color='000000')
border = Border(top=side, bottom=side, left=side, right=side)
sheet["A1"].border=border
-   - format = wb.add_format()
format.set_bottom()
format.set_top(1) #細実線
format.set_left(2) #中太実線
format.set_right(3) #長破線
ws.write('C3', '値', format)