LoginSignup
ilovedog0123
@ilovedog0123 (Hiroyuki Iwasa)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

アプリでエクスポートしたエクセルBook1をopenpyxlとpyautoguiで名前付きファイル保存をしたい

pythonのpyautoguiを使って、BIツールでエクスポート操作を行ったExcelファイルに名前を付けて保存したいと考えています。
pyautoguiでExcelファイルBook1ブックをエクスポートするところまでは出来たのですが、openpyxlのWorkbookオブジェクトで認識しないので困っています。

from openpyxl import Workbook
wb=Workbook('Book1')
ws=wb.active()

もしくは
import pygetwindow as gw
win = gw.getWindowsWithTitle('Book1')

Book1はエクスポートしてから画面に表示されたままで一度も保存していません。
保存していれば、Workbook('Book1')で開くのでしょうが...
あくまでもエクスポート⇒ファイル保存 までを自動でおこないたいのです。
テンポラリでファイル保存される場所も分かっていません。

winでウィンドウを拾ってこれてもファイル名保存で自動化が大変なのはありますが、
どなたかお分かりになる方、よろしくお願いいたします。

0

2Answer

状況がわからないので、もっと詳細に書いてください。

特に「エクスポート」という単語が具体的にどういった操作を指し示しているのかがわからないです。
一般的にはエクスポートというとファイルが生成されます。
ただ、今回のケースではそうではないように読み取れます。
なので、今どういった状況・画面で困っている状態なのかがピンときません。

0Like

Comments

  1. @ilovedog0123

    Questioner

    状況としては、BIツールからエクスポート操作を行うと"Book1"というタイトルのついたワークブックが開きます。これは未保存のワークブックで、これにファイル名を付与して保存したいのです。
    スクリーンショット 2024-07-22 220035.png

  2. 「ワークブックが作成されます」というのは Excel のウィンドウが開いて未保存のワークブックが表示されるということで、質問はそれをファイルに保存する方法ですよね?

  3. 画面操作の通りとは言っても、 Tableau という BI ツールがあってそのエクスポート操作を行うと Excel が開くということまで質問者が分かるわけではないので、そこは言葉で書いていただけると助かります。もっと言えば、質問の本題は「未保存のワークブックを開いている Excel ウィンドウを自動操作して名前をつけて保存すること」であって Tableau 云々は関係ないのでバッサリ省いてもいいです。

API ドキュメントに書いてあるとおりですが、 openpyxl.Workbook のコンストラクタは Workbook(write_only=False, iso_dates=False) です。第1引数にワークブック名を渡しても write_only が真になるだけで、そのワークブックを操作することはできません。また Excel で開いているワークブックを直接操作するような機能もありません。

Excel のウィンドウを操作してワークブックを保存するには pywin32 パッケージ(モジュール名は win32com)が使えそうです。

0Like

Comments

  1. @ilovedog0123

    Questioner

    有難うございます。以下の部分ですね。
    xl = win32.Dispatch('Excel.Application')
    wb = xl.Workbooks['Book1']
    職場の環境でしか試せれないので明日試してみます。

  2. 上記の方法でも良いと思いますが、pyatuoguiをすでに使っているならそっちで保存処理までやってしまってもいいかと思います

  3. @ilovedog0123

    Questioner

    本日、win32.Dispathのオブジェクトで未保存のワークブックが認識できるか確認しましたので報告します。結果は以下のようにうまくいきませんでした。
    どなたかコメントをよろしくお願いします。

    com_error Traceback (most recent call last)
    ~\AppData\Local\Temp\ipykernel_6244\3186051950.py in
    22 # Excelファイルを保存する
    23 xl =win32.Dispatch('Excel.Application')
    ---> 24 wb = xl.Workbooks['Book1']
    25 wb.SaveAs(open_path+"./実績一覧.xlsx")
    26 wb.close()

    c:\Users\iwasah\AppData\Local\Programs\Python\Python39\lib\site-packages\win32com\client\dynamic.py in getitem(self, index)
    281 invkind, dispid = self.find_dispatch_type("Item")
    282 if invkind is not None:
    --> 283 return self.get_good_object(self.oleobj.Invoke(dispid, LCID, invkind, 1, index))
    284 raise TypeError("This object does not support enumeration")
    285

    com_error: (-2147352567, '例外が発生しました。', (0, None, None, None, 0, -2147352565), None)

  4. midoribi さんのおっしゃるとおりですが、 pyautogui で Excel も操作できるならそれで保存を試してみてください。

Your answer might help someone💌