none
エクセルの印刷にサードパーティを利用したい。 RRS feed

  • 質問

  • Type t = Type.GetTypeFromProgID("Excel.Application");

                    xlApplication = Activator.CreateInstance(t);
                    xlApplication.DisplayAlerts = false;
                    xlBooks = xlApplication.Workbooks;   

    foreach (var bp in lbp)
                    {
                        xlBook = xlBooks.Open(bp.bookname);
                        xlSheets = xlBook.Sheets;
                        xlSheet = xlApplication.Sheets[sheetName];
                        xlSheet.PrintOut(Type.Missing, Type.Missing, 1, Type.Missing, bp.printer, Type.Missing, true, Type.Missing);
                    }

    上記で印刷していますが、時間がかかります。

    値を書き込む際にはEPPLUSを使用しています。そこまでははやいのですが、印刷の時間が

    削減したいので、サードパーティー製のものでなにかいいものはありませんか。

    2019年3月18日 10:50

すべての返信

  • 印刷のどの部分に時間がかかっているかを把握しておかないと、サードパーティーにしたからと言って速くなるとは限りませんが...。

    どの部分に時間がかかっているのか、foreach のループを重ねるごとに遅くなるといったことがないかなど、切り分けは済んでいますか?
    (個人的には Workbook を開きまくって放置している点は気にかかりますが、支配的かどうかはわかりませんね)

    2019年3月18日 12:21
    モデレータ
  •                 foreach (var bp in lbp)
                    {
                        try
                        {
                            xlBook = xlBooks.Open(bp.bookname);
                            xlSheet = xlApplication.Sheets[sheetName];
                            xlSheet.PrintOut(Type.Missing, Type.Missing, 1, Type.Missing, bp.printer, Type.Missing, true, Type.Missing);
                            xlBook.Close();
                        }
                        finally
                        {
                            if (xlSheet != null)
                            {
                                Marshal.ReleaseComObject(xlSheet);
                                xlSheet = null;
                            }
                            //if (xlBook != null)
                            //{
                            //    Marshal.ReleaseComObject(xlBook);
                            //    xlBook = null;
                            //}
                        }
                    }

    に変更致しました。

    //if (xlBook != null)
                            //{
                            //    Marshal.ReleaseComObject(xlBook);
                            //    xlBook = null;
                            //}

    の部分で、xlBook != nullを行うとエラーとなってしまいますが、Closeした場合Marshal.ReleaseComObject(xlBook);

    xlBook = null;

    は不要なのでしょうか、上記2行の意味を教えていただけたらありがたいです。

    低速な箇所は、1ループ目の

    xlBook = xlBooks.Open(bp.bookname);    

    xlSheet.PrintOut(   

    です。6秒ほどかかっております。2ループ目以降は1秒か2秒ほどではやくなります。


    2019年3月19日 2:55
  • Open だけなのか、Printout だけなのかは気になりました。

    前者であれば Excel の起動コスト?、後者であれば印刷系の初期かコストと予想されるので Close は即効性がないかもしれません。

    サードパーティーのものを検討される場合は、Excel と同じ見た目にならないリスクはあるのでご注意下さい。

    2019年3月19日 3:34
    モデレータ