web-dev-qa-db-ja.com

pandas.ExcelWriter ValueError:追加モードはxlsxwriterではサポートされていません

Excelファイルにレコードを追加したいのですが、pandas.ExcelWriterこれを行うには( http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.ExcelWriter.html?highlight=excelwriter#pandas.ExcelWriter ):

import pandas as pd                                                     

df = pd.DataFrame(data={'a':[4], 'b':['corn'], 'c':[0.5]})              

with pd.ExcelWriter("test.xlsx", mode='a') as writer: 
            df.to_Excel(writer) 

a、b、cはtest.xlsxのタイトル名

このプログラムを実行し、valueErrorを送出します。

ValueError                                Traceback (most recent call last)
<ipython-input-3-c643d22b4217> in <module>
----> 1 with pd.ExcelWriter("test.xlsx", mode='a') as writer:
      2     df.to_Excel(writer)
      3 

~/anaconda/lib/python3.6/site-packages/pandas/io/Excel.py in __init__(self, path, engine, date_format, datetime_format, mode, **engine_kwargs)
   1935 
   1936         if mode == 'a':
-> 1937             raise ValueError('Append mode is not supported with xlsxwriter!')
   1938 
   1939         super(_XlsxWriter, self).__init__(path, engine=engine,

ValueError: Append mode is not supported with xlsxwriter!

なぜだかわかりませんか?

5
Xu Zhoufeng

これで試してください:

with pd.ExcelWriter("existing_file_name.xlsx", engine="openpyxl", mode="a") as writer:
    df.to_Excel(writer, sheet_name="name", startrow=num, startcol=num)

エンジンを「openpyxl」として指定する必要があります。

トレースバックが言うように、ValueError: Append mode is not supported with xlsxwriter!

私はあなたの質問に答えることができませんなぜ、これはPandas開発者の決定です。

しかし、Pandas 0.24およびopenpyxlを使用してユースケースを機能させることができました。

df = pd.DataFrame(data={'a':[4], 'b':['corn'], 'c':[0.5]})              

with pd.ExcelWriter("test.xlsx", mode='a') as writer: 
            df.to_Excel(writer) 
2

「エンジン」をopenpyxlとして指定してみてください:

with pd.ExcelWriter("test.xlsx", engine='openpyxl', mode='a') as writer:
    df.to_Excel(writer)
1
Jeremy Lloyd

うーん、xlsxwriterライブラリはExcelファイルの書き込み専用であるため、xlsxwriterで既存のxlsxファイルに関数appendを使用することはできません。

Githubの問題を参照

したがって、openpyxlを使用するか、この機能を実行するためのプログラムを作成することができます。

しかし、このlibray内のコードを見ると、最終的なファイルを書き込む前に一時環境でファイルを読み取るだけであり、実際の追加ではありません...

0
Frenchy