[[20230501161218]] 『ExcelファイルをコマンドでPDF化したい』(あらじぃ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ExcelファイルをコマンドでPDF化したい』(あらじぃ)

同じフォルダに100個のxlsxファイルがあるのですが、これを100個のPDFにしたく、各エクセルファイルは、すべてそれぞれ1シートしかありません。
WSH/JScriptのスクリプトファイル(拡張子.jse)を公開されている方がいますが、それらは対象ファイルのドラッグ&ドロップが前提のようです。
私は、コマンドで、たとえば、c:\tempにxlsxファイルがたくさんある場合、c:\temp\*.*を引き数にしてなんらかのコマンドを打つとずらずらとPDF化されるようなものが理想なのですが、どうしたら良いのでしょうか。

< 使用 Excel:Excel2019、使用 OS:Windows8 >


 コマンドラインではないですが、VBAで
 処理、ではだめですか?

 Dir関数を使って指定フォルダ内のブック
 を処理する、FileSystemObjectを使って
 指定フォルダ内の指定の拡張子のファイル
 に対して処理を行う、などの方法があります。
(MK) 2023/05/01(月) 16:34:55

VBAだと専用のマクロシートか何かを作って、そこのボタンを押すようなことをしなければならないですよね。wscipt.exeなどを使って、コマンドでやりたいのです。

(あらじぃ) 2023/05/01(月) 16:40:33


 専用のQ&Aサイトはないのですか?
 ここはエクセルのQ&Aサイトなので。

 餅は餅屋ですよ。
(MK) 2023/05/01(月) 16:45:40

スクリプトをコマンドラインから実行すればいいだけでしょう
(ぶいぶい) 2023/05/01(月) 16:47:21

そうでした。他をあたります。失礼しました。
(あらじぃ) 2023/05/01(月) 16:51:15

 ちょっと転載が微妙だったので紹介だけですが・・・
http://marupeke296.com/IKDADV_JS_FileNameCollect.html
 >var extArray = ["txt", "exe"];
 をエクセルの拡張子に変更
 >var rootDir = wsh.CurrentDirectory;
 を実行したいフォルダに書き換え \ は \\ にエスケープしてください。
 例:C:\ABC\ならC:\\ABC\\
 >for (var i = 0; i < filePathAry.length; i++)
 の後ろに
 {
     var file = filePathAry[i];
     xls2pdf(file, file + ".pdf");
 }
 としておく
 階層が深いところだと、サブフォルダで時間とると思うので、
 その部分はコメントアウトしておいたほうが無難かも。

 あとは
https://qiita.com/tnakagawa/items/6c468ee355eb9f7c0664
 のページから xls2pdf 関数だけ引っこ抜いて同じファイルに入れておけば問題なく動きました。

(稲葉) 2023/05/02(火) 10:19:40


すいません、ご親切にご回答をいただいたようですが、結局どのようなコマンドを打てばc:/abc/*.xlsxはすべてpdfになるのでしょうか。そのための事前の仕掛けはどのようなファイルをどこにおいておけばよいのでしょうか。
(あらじぃ) 2023/05/02(火) 13:03:27

 え?そっから?
 ↑で案内したjsファイルが既にできているとして、仮にCドライブ直下にtest.jsとして保存する
 追加で
 var args = WScript.Arguments;
 を入れる
 その下に、rootDirの右辺を下記の通りにする
 var rootDir = args.Unnamed(0);

 ファイルの行頭に
 var args = WScript.Arguments;
 var rootDir = args.Unnamed(0);
 と入れておくと間違いないかと。

 処理したいフォルダがC:\abc\とした場合

 コマンドプロンプトを立ち上げて、
 cscript C:\test.js C:\abc\
 って打ち込めば実行できるかと。

 拡張子の指定などはjsファイルの中にあって、
 (稲葉) 2023/05/02(火) 10:19:40
 の投稿で修正方法を説明済み

 前回の投稿で紹介したURLを穴が開くまで読み込んで、
 簡単なコードから試して得心いってから本来やりたかったこと試してください。
 それでもわからなかったら、また聞きに来てください。

 引数の渡し方
https://ooo.iiyudana.net/htm/js_chp3frame.htm

(稲葉) 2023/05/02(火) 14:01:33


 あーーーと
 jsファイルは文字コードがShiftJISにしないといけないので、
 メモ帳で一度保存した後、
 再度メモ帳で開いて、ファイル>名前を付けて保存
 ダイヤログの下部に文字コードを選ぶところがあるので、ANSI(=ShiftJISの意)を選択して上書き保存してください。

(稲葉) 2023/05/02(火) 14:05:28


稲葉さん、根気よく教えていただきありがとうございます。
2点、お伺いします

1) >var rootDir = wsh.CurrentDirectory; を実行したいフォルダに書き換え
これについては、この行ごと単純に C:\\ABC\\ とかと入れ替えるのでしょうか。
それとも var rootDir = C:\\ABC\\ でしょうか

2) >xls2pdf 関数だけ引っこ抜いて同じファイルに入れて..
これは、そのwebページのコードをxls2pdf.js というテキストファイルにして、c:\abcに入れておくという意味でしょうか 
(あらじぃ) 2023/05/02(火) 14:54:52


 1)については、コマンドラインからの指定が希望そうでしたので、忘れてください。
 (稲葉) 2023/05/02(火) 14:01:33 の投稿通り、 var rootDir = args.Unnamed(0); としてください。

 2)コードだけです。
 メインコードがこちらで、
http://marupeke296.com/IKDADV_JS_FileNameCollect.html
 書き換えが必要なところは
 >var extArray = ["txt", "exe"];
 をエクセルの拡張子に変更
 と

 ファイルの行頭に
 var args = WScript.Arguments; //追加部分
 var rootDir = args.Unnamed(0); //書き換え部分
 と

 >for (var i = 0; i < filePathAry.length; i++)
 の後ろに
 {
     var file = filePathAry[i];
     xls2pdf(file, file + ".pdf");
 }
 を付け足す

 このコードの下にfunction xls2pdfのコードを持ってくる
https://qiita.com/tnakagawa/items/6c468ee355eb9f7c0664

 あとは(稲葉) 2023/05/02(火) 14:01:33と(稲葉) 2023/05/02(火) 14:05:28で示した通りです。

 これでわからなかったら、どなたか助けてください。 

(稲葉) 2023/05/02(火) 15:12:00


ご指定通りにtest.js というansi形式のテキストファイルをc:\tempに入れ、複数のエクセルファイル(拡張子はxlsx)をc:\temp2に入れて、以下のようにコマンドプロンプトの管理者モードで入力してみました。
cscript c:\temp\test.js c:\temp2\
結果、何も表示されず、PDFもできず、Ctrl+c で終了しないと永遠にロックしている感じでした。

ご指示通り作った(と思われる)jsファイルはここに公開してもよいものでしょうか。
(あらじぃ) 2023/05/02(火) 18:34:00


https://qiita.com/terms
 登録ユーザーなら自由に使えるらしいです。
 一部ならまだしも、今回は全部コピーなんでどうなんでしょうね。
 創作性が担保されているかどうかなんか、わかんないですしね。

 本題ですが、
 たぶん、サブフォルダが多すぎて深く潜りすぎてるんじゃないですかね?
 (稲葉) 2023/05/02(火) 10:19:40の投稿で
 >階層が深いところだと、サブフォルダで時間とると思うので、
 >その部分はコメントアウトしておいたほうが無難かも。
 と申し上げましたが、いかがですか?

 >Ctrl+c で終了しないと永遠にロックしている感じでした。
 コマンドプロンプトからCScriptに権限移っているので、Ctrl+Cが利かないのは当然かと・・・。

 素直にVBAで作ればこんな煩わしいことにならないと思うんですけど、
 なんのこだわりがあってコマンドがいいんです?

(稲葉) 2023/05/02(火) 18:54:37


稲葉さん、お付き合いいただきありがとうごいます。
階層は1階層しかありません。c:\temp2の下にエクセルファイルは並んでいて、そこにサブフォルダはありません。
実はこれ、遠隔からコマンドで自動で行うので、ドラッグ&ドロップとかはできないんです。
(あらじぃ) 2023/05/02(火) 19:21:43

 言ってる意味が分かんないんだけど、
 遠隔って箸もってマウス扱うから、D&Dできないとかそういう意味じゃないよね?

 リモートデスクトップなら制限ないだろうし、どういう遠隔操作だとコマンドライン限定になるの・・・?

(稲葉) 2023/05/02(火) 20:38:03


RPAを使います。ドラッグ&ドロップができないんです。コマンド発行が一番開発しやすいのです。
(あらじぃ) 2023/05/02(火) 21:18:39

 ならそのソフトに繰り返し処理やらせればいいんじゃ?
 悪いけど、ここで降ります
(稲葉) 2023/05/02(火) 21:26:39

 以下の内容を XLS2PDF.VBS とかのファイル名で保存して、実行します

 '----- XLS2PDF.VBS ここから------
    Dim FSO
    Dim xlApp
    Function EnumFiles(path)
        With CreateObject("Wscript.Shell") 
            EnumFiles = Split(.Exec("cmd /c dir /b /s """ & path & """").StdOut.ReadAll, vbCrLf)
        End With
    End Function
    Sub Book2PDF(file)
        if Not FSO.FileExists(file) Then Exit Sub 
        If "XLS" <> UCASE(Left(FSO.GetExtensionName(file),3)) Then Exit Sub 
        Set xlsfile = FSO.GetFile(file)
        Dim PdfName
        PdfName = FSO.GetParentFolderName(xlsfile) & "\" & FSO.GetBaseName(xlsfile) & ".PDF" 
        xlTypePDF =0 
        xlQualityStandard = 0
        With xlApp.Workbooks.Open(xlsfile)
            .ExportAsFixedFormat xlTypePDF, PdfName, xlQualityStandard
            .Close Flase
        End With
    End Sub
    Sub Main()
        Set FSO = CreateObject("Scripting.FileSystemObject")
        Set xlApp = CreateObject("Excel.Application")
        xlApp.Visible = True
        For Each arg In WScript.Arguments
            Select Case True
                Case FSO.FileExists(arg)
                    Book2PDF arg
                Case FSO.FolderExists(arg)
                    For Each file in EnumFiles(arg & "\*.xls?")
                        Book2PDF file
                    Next
                Case Else
                    For Each file in EnumFiles(arg)
                        Book2PDF file
                    Next
            End Select
        Next
        xlApp.Quit
        Set xlApp = Nothing
        Set FSO = Nothing
        Exit Sub
    End Sub

    If WScript.Arguments.Count > 0 Then Call Main()
 '----- XLS2PDF.VBS ここまで------
(´・ω・`) 2023/05/03(水) 06:22:18

ありがとうございます。
これをテキスト保存して、すべてのxlsxファイルとこのテキストファイルをc:\tempに入れて
以下のコマンドでできました!
c:\temp2>cscript xls2pdf.vbs c:\temp\

稲葉さん、見放さずにここまでお付き合いいただいて感謝です!
(あらじぃ) 2023/05/03(水) 09:40:30


 私じゃないです
(稲葉) 2023/05/03(水) 10:03:46

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.