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裏面,實現文檔的後臺轉換。

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/kable999/archive/2009/11/08/4786654.aspx

發佈了23 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章