1. 程式人生 > >C#實現office文件轉換為PDF或xps的一些方法

C#實現office文件轉換為PDF或xps的一些方法

程式碼支援任意office格式
 
需要安裝office 2007 還有一個office2007的外掛OfficeSaveAsPDFandXPS
 
下載地址
 
[url]http://www.microsoft.com/downloads/details.aspx?FamilyId=4D951911-3E7E-4AE6-B059-A2E79ED87041&displaylang=en[/url]
 
這是一個微軟官方出的office外掛。
 
安裝好之後,開啟VS,以VS2005為例
 
新建windows應用程式專案
 
新增以下com元件的引用
 
Microsoft Word 12.0 Object Library
 
Microsoft PowerPoint 12.0 Object Library
 
Microsoft Excel 12.0 Object Library
 
 
 
------------------------------------------------------
 
using Word = Microsoft.Office.Interop.Word;
using Excel = Microsoft.Office.Interop.Excel;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
 
using Microsoft.Office.Core;
 
 
 
我們可以使用一個列舉型別來決定生成檔案的型別
 
Word.WdExportFormat wd = Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF;
 
Excel.XlFixedFormatType excelType = Microsoft.Office.Interop.Excel.XlFixedFormatType.xlTypePDF;
PowerPoint.PpSaveAsFileType ppType = Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsPDF;
 
 
 
這裡Word跟Excel我使用了ExportAsFixedFormat,PowerPoint我使用了SaveAs方法。
 
對於Word跟PowerPoint效果是一樣的,只是SaveAs方法支援的格式更多。
 
但是Excel似乎不支援SaveAs方法,呵呵
 
----------------
 
Word轉換方法
 

private bool Convert(string sourcePath, string targetPath, Word.WdExportFormat exportFormat)
                {
                        bool result;
                        object paramMissing = Type.Missing;
                        Word.ApplicationClass wordApplication = new Word.ApplicationClass();
                        Word.Document wordDocument = null;
                        try
                        {
                                object paramSourceDocPath = sourcePath;
                                string paramExportFilePath = targetPath;

                                Word.WdExportFormat paramExportFormat = exportFormat;
                                bool paramOpenAfterExport = false;
                                Word.WdExportOptimizeFor paramExportOptimizeFor =
                                        Word.WdExportOptimizeFor.wdExportOptimizeForPrint;
                                Word.WdExportRange paramExportRange = Word.WdExportRange.wdExportAllDocument;
                                int paramStartPage = 0;
                                int paramEndPage = 0;
                                Word.WdExportItem paramExportItem = Word.WdExportItem.wdExportDocumentContent;
                                bool paramIncludeDocProps = true;
                                bool paramKeepIRM = true;
                                Word.WdExportCreateBookmarks paramCreateBookmarks =
                                        Word.WdExportCreateBookmarks.wdExportCreateWordBookmarks;
                                bool paramDocStructureTags = true;
                                bool paramBitmapMissingFonts = true;
                                bool paramUseISO19005_1 = false;

                                wordDocument = wordApplication.Documents.Open(
                                        ref paramSourceDocPath, ref paramMissing, ref paramMissing,
                                        ref paramMissing, ref paramMissing, ref paramMissing,
                                        ref paramMissing, ref paramMissing, ref paramMissing,
                                        ref paramMissing, ref paramMissing, ref paramMissing,
                                        ref paramMissing, ref paramMissing, ref paramMissing,
                                        ref paramMissing);

                                if (wordDocument != null)
                                        wordDocument.ExportAsFixedFormat(paramExportFilePath,
                                                paramExportFormat, paramOpenAfterExport,
                                                paramExportOptimizeFor, paramExportRange, paramStartPage,
                                                paramEndPage, paramExportItem, paramIncludeDocProps,
                                                paramKeepIRM, paramCreateBookmarks, paramDocStructureTags,
                                                paramBitmapMissingFonts, paramUseISO19005_1,
                                                ref paramMissing);
                                result = true;
                        }
                        finally
                        {
                                if (wordDocument != null)
                                {
                                        wordDocument.Close(ref paramMissing, ref paramMissing, ref paramMissing);
                                        wordDocument = null;
                                }
                                if (wordApplication != null)
                                {
                                        wordApplication.Quit(ref paramMissing, ref paramMissing, ref paramMissing);
                                        wordApplication = null;
                                }
                                GC.Collect();
                                GC.WaitForPendingFinalizers();
                                GC.Collect();
                                GC.WaitForPendingFinalizers();
                        }
                        return result;
                }
 
Excel轉換方法
 

private bool Convert(string sourcePath, string targetPath, XlFixedFormatType targetType)
                {
                        bool result;
                        object missing = Type.Missing;
                        ApplicationClass application = null;
                        Workbook workBook = null;
                        try
                        {
                                application = new ApplicationClass();
                                object target = targetPath;
                                object type = targetType;
                                workBook = application.Workbooks.Open(sourcePath, missing, missing, missing, missing, missing,
                                        missing, missing, missing, missing, missing, missing, missing, missing, missing);

                                workBook.ExportAsFixedFormat(targetType, target, XlFixedFormatQuality.xlQualityStandard, true, false, missing, missing, missing, missing);
                                result = true;
                        }
                        catch
                        {
                                result = false;
                        }
                        finally
                        {
                                if (workBook != null)
                                {
                                        workBook.Close(true, missing, missing);
                                        workBook = null;
                                }
                                if (application != null)
                                {
                                        application.Quit();
                                        application = null;
                                }
                                GC.Collect();
                                GC.WaitForPendingFinalizers();
                                GC.Collect();
                                GC.WaitForPendingFinalizers();
                        }
                        return result;
                }
 
PowerPoint轉換方法
 

                private bool Convert(string sourcePath, string targetPath, PpSaveAsFileType targetFileType)
                {
                        bool result;
                        object missing = Type.Missing;
                        ApplicationClass application = null;
                        Presentation persentation = null;
                        try
                        {
                                application = new ApplicationClass();
                                persentation = application.Presentations.Open(sourcePath, MsoTriState.msoTrue, MsoTriState.msoFalse, MsoTriState.msoFalse);
                                persentation.SaveAs(targetPath, targetFileType, Microsoft.Office.Core.MsoTriState.msoTrue);

                                result = true;
                        }
                        catch
                        {
                                result = false;
                        }
                        finally
                        {
                                if (persentation != null)
                                {
                                        persentation.Close();
                                        persentation = null;
                                }
                                if (application != null)
                                {
                                        application.Quit();
                                        application = null;
                                }
                                GC.Collect();
                                GC.WaitForPendingFinalizers();
                                GC.Collect();
                                GC.WaitForPendingFinalizers();
                        }
                        return result;
                }
 
 
 
如果是word文件或者Excel文件想要轉換xps格式,我們還可以有一種方法,那就是利用xps虛擬印表機實現。
 
安裝了.NetFrameWork3.5之後,預設會在系統中安裝XPS虛擬印表機,我們將其設定為預設印表機。
 
Microsoft XPS Document Writer
 
word文件列印為xps
 

                public void PrintWord(string wordfile)
                {
                        oWord.ApplicationClass word = new oWord.ApplicationClass();
                        Type wordType = word.GetType();

                        //開啟WORD文件
                        oWord.Documents docs = word.Documents;
                        Type docsType = docs.GetType();
                        object objDocName = wordfile;
                        oWord.Document doc = (oWord.Document)docsType.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, docs, new Object[] { objDocName, true, true });

                        //列印輸出到指定檔案
                        //可以使用 doc.PrintOut();方法,次方法呼叫中的引數設定較繁瑣,建議使用 Type.InvokeMember 來呼叫時可以不用將PrintOut的引數設定全,只設置4個主要引數
                        Type docType = doc.GetType();
                        object printFileName = wordfile + ".xps";
                        docType.InvokeMember("PrintOut", System.Reflection.BindingFlags.InvokeMethod, null, doc, new object[] { false, false, oWord.WdPrintOutRange.wdPrintAllDocument, printFileName });

                        //退出WORD
                        wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, word, null);
                }
 
Excel利用虛擬印表機轉換為xps
 

                public void PrintExcel(string execlfile)
                {
                        Excel.ApplicationClass eapp = new Excel.ApplicationClass();
                        Type eType = eapp.GetType();
                        Excel.Workbooks Ewb = eapp.Workbooks;
                        Type elType = Ewb.GetType();
                        object objelName = execlfile;
                        Excel.Workbook ebook = (Excel.Workbook)elType.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, Ewb, new Object[] { objelName, true, true });

                        object printFileName = execlfile + ".xps";

                        Object oMissing = System.Reflection.Missing.Value;
                        ebook.PrintOut(oMissing, oMissing, oMissing, oMissing, oMissing, true, oMissing, printFileName);

                        eType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, eapp, null);
                }
 
,同樣,如果系統安裝了PDF虛擬印表機,如5D PDF之類的,我們也可以將其設定為預設印表機以達到轉換為PDF格式的目的
 
我們可以將這些方法放在windows service裡面,實現文件的後臺轉換。