首页 > 技术文章 > C#把Excel转换成PDF出力

sxwly 2014-09-17 15:39 原文

第一步:参照追加

20120217195143

f:id:JHashimoto:20120217195144p:image

f:id:JHashimoto:20120217195145p:image

f:id:JHashimoto:20120217195142p:image

第二步:程序代码

Program.cs

using System.IO;

namespace ExcelToPdf {
    class Program {
        static void Main(string[] args) {
            const string Dir = @"D:\Sandbox\Console\ExcelToPdf";
            ExcelSave.SaveAsPdf(Path.Combine(Dir, "TS0100738771.xlsx"), Path.Combine(Dir, "TS0100738771.pdf"));
        }
    }
}


ExcelSave.cs
using System;
using Microsoft.Office.Interop.Excel;

namespace ExcelToPdf {
    /// <summary>
    /// Excelファイルを保存する機能を提供します。
    /// </summary>
    public static class ExcelSave {
        /// <summary>
        /// ExcelファイルをPDFとして保存します。
        /// </summary>
        /// <param name="excelFilePathName">Excelファイルのパス付きファイル名。</param>
        /// <param name="saveAsPathName">保存するPDFのパス付きファイル名。</param>
        /// <remarks>
        /// <para>
        /// Excel 2007がインストールされている必要があります。
        /// </para>
        /// <para>
        /// Office 2007のSP2、またはPDF保存アドインがインストールされている必要があります。</ br>
        /// http://support.microsoft.com/kb/953195/ja</ br>
        /// http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyId=F1FC413C-6D89-4F15-991B-63B07BA5F2E5&displaylang=ja
        /// </para>
        /// </remarks>
        public static void SaveAsPdf(string excelFilePathName, string saveAsPathName) {
            Application application = null;
            Workbooks workbooks = null;
            Workbook workbook = null;

            try {
                application = new Application();

                /*
                 * application.Workbooks.Open(...は、Workbooksオブジェクトの解放処理ができないので不可。
                 * 必ず変数経由でComRelease.FinalReleaseComObjectsを呼び出すこと。
                 */
                workbooks = application.Workbooks;

                workbook = workbooks.Open(
                    excelFilePathName, Type.Missing, Type.Missing, Type.Missing, Type.Missing
                    , Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing
                    , Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

                // http://msdn.microsoft.com/ja-jp/library/microsoft.office.tools.excel.workbook.exportasfixedformat(v=vs.90).aspx
                workbook.ExportAsFixedFormat(
                    XlFixedFormatType.xlTypePDF,
                    saveAsPathName,
                    XlFixedFormatQuality.xlQualityStandard,
                    true,
                    true,
                    Type.Missing,
                    Type.Missing,
                    false,
                    Type.Missing);
            } finally {
                if (workbook != null) {
                    try {
                        workbook.Close(true, Type.Missing, Type.Missing);
                    } catch {
                    }
                }

                if (application != null) {
                    try {
                        application.Quit();
                    } catch {
                    }
                }

                Com.ComRelease.FinalReleaseComObjects(workbook, workbooks, application);
            }
        }
    }
}


ComRelease.cs

 

using System;
using System.Runtime.InteropServices;

namespace Com {
    /// <summary>
    /// COMオブジェクトを解放する機能を提供します。
    /// </summary>
    public static class ComRelease {
        /// <summary>
        /// 複数のCOMオブジェクトの参照カウントを0までデクリメントし、解放します。
        /// </summary>
        /// <param name="objects">解放するCOMオブジェクトの配列。</param>
        /// <remarks>解放は配列の要素順に行います。</remarks>
        public static void FinalReleaseComObjects(params object[] objects) {
            foreach (object o in objects) {
                try {
                    if (o == null)
                        continue;
                    if (Marshal.IsComObject(o) == false)
                        continue;
                    Marshal.FinalReleaseComObject(o);
                } catch (Exception) {
                }
            }
        }
    }
}

本文出自 http://blog.jhashimoto.jp/entry/20120220/1329736026

推荐阅读