76045


エクセルAから1行（1~17列）分を既存のエクセルBのシート2に貼り付け、エクセルBのシート1をPDF化を行いたいです。  
エクセルBのシート1にはエクセルBシート2から値を引っ張ってきて自動で値を反映している状態のため、貼り付け→保存→PDF化の流れで行いたいです。

[code]

    wb1 = openpyxl.load_workbook('wb1.xlsx')
    ws_a = wb1['Sheet1']
    
    wb2 = openpyxl.load_workbook('wb2.xlsx')
    ws_b = wb2['Sheet1']
    wb_b_1 = wb2['Sheet2']
    
    for i in range(17):
        cell_value = ws_a.cell(row=1, column=1 + i).value
        ws_b_1.cell(row=2, column=1 + i, value=cell_value)
    
    wb2.save(wb2)
    
    excel = win32com.client.Dispatch("Excel.Application")
    file = excel.Workbooks.Open('wb2')
    
    file.WorkSheets('Sheet1').Select()
    #変換
    file.ActiveSheet.ExportAsFixedFormat(0,'test.pdf')
    
[/code]

openpyxlの使い方を間違っていたら申し訳ないのですが、wb2.saveの部分で

[code]

    AttributeError: 'Workbook' object has no attribute 'write'
    
[/code]

のエラーが出てしまいます。

また、PDF化をする際にwin32comのインストール時点の問題なのか下のエラーも発生します。

[code]

      File "<COMObject <unknown>>", line 5, in Open
    pywintypes.com_error: (-2147352567, '例外が発生しました。', (0, 'Microsoft Excel', '申し訳ございません。<openpyxl.workbook.workbook.Workbook object at 0x00000230C68CE940>が見つか 
    りません。名前が変更されたか、移動や削除が行われた可能性があります。', 'xlmain11.chm', 0, -2146827284), None)
    
[/code]

上の2点が調べても詳しい情報が見つからず参考になる方法などありましたら教えていただきたいです。  
よろしくお願いします。


CC BY-SA 4.0
2021-05-24T09:58:33.827
76042
2021-05-24T11:38:05.897
45216
question
python3 openpyxl
excelからPDFでの保存を行う処理に関して


`AttributeError: 'Workbook' object has no attribute
'write'`は、おそらく`wb2.save(wb2)`でパラメータにファイル名を指定すべきところを、`wb2`オブジェクトが指定されているからでは？

[save(filename)](https://openpyxl.readthedocs.io/en/stable/api/openpyxl.workbook.workbook.html#openpyxl.workbook.workbook.Workbook.save)

> Save the current workbook under the given filename. Use this function
> instead of using an ExcelWriter.

`wb2.save('wb2.xlsx')`とすれば良いのでは？

* * *

2つ目は分かりませんが、もしかしたら`file = excel.Workbooks.Open('wb2')`
でファイル名に拡張子が付いていないことか、`wb2`オブジェクトを`.close()`していないことが影響しているかもしれませんね。

あるいはエラーがどの行で発生しているか、によって変わってくるかもしれません。  
発生・通知されたエラーの全文を過不足無く正確に転記してみてください。

他にこんなことを試してみてはどうでしょう？

  * スクリプトを2つに分ける  
openpyxlでエクセルファイルを更新する部分と、win32comのExcel.Application操作をする部分は、分けてみるとか。

  * PDF変換前に、明示的に再計算を行ってみる  
[再計算（Calculation, EnableCalculation,
Calculate）](https://excelwork.info/excel/enablecalculation/)

  * PDF変換前に、いったんwin32comのExcel.Application操作で単にopen,save,closeしてから再度openする

* * *

あと、質問時の転記ミスでしょうか、`wb_b_1 = wb2['Sheet2']`と`ws_b_1.cell(row=2, column=1 + i,
value=cell_value)`でオブジェクトの名前が`wb_b_1`と`ws_b_1`で違っています。


CC BY-SA 4.0
2021-05-24T10:39:05.163
76045
2021-05-24T11:38:05.897
2021-05-24T11:38:05.897
26370
26370
76042
answer