Saving file as PDF by using Microsoft.Office.Inter

2019-07-23 07:46发布

问题:

I'm using the Microsoft.Office.Interop.Excel.Workbooks.Open() method for opening an .XML file and then using the Microsoft.Office.Interop.Excel.Workbook.ExportAsFixedFormat() method for publishing (saving) the opened .XML file as a .PDF file.

Now on my Development and Preproduction environments everything is working well, but on our Production server it's seems that when the call for Microsoft.Office.Interop.Excel.Workbooks.Open() is made the method execution is then sopped or even not executed.. (W/O any exception or any error that I can be aware of, even not in my log file or in the event viewer..) and eventually there is no .PDF file saved anywhere obviously.

Here is my code:

using ExcelApp = Microsoft.Office.Interop.Excel;

public static void ToPdf()
{           
        // Declare the Excel Application object and set it in null state
        ExcelApp.Application activeExcel = null;
        // Declare the Workbook to be used within the Excel Application object
        ExcelApp.Workbook openWorkBook = null;
        // Used for passing parameter for the attribute of opening the .XML file
        object tMiss = Type.Missing;

        // .XML file location
        string xmlPathName = "C:/Windows/Temp/XmlFile.xml";

        try
        {
            // Instanitating the Excel.Application to a new valid Instance object
            activeExcel = new ExcelApp.Application();
            // Open Excel as Hiden
            activeExcel.Visible = false;
            // Open Excel w/o alerts
            activeExcel.DisplayAlerts = false;

            //
            // Log this line
            //
            LogTxt.LogCreator("Set Excel GUI to be open Hiden with no Alerts");

            // Open an Excel instance and passing the .XML file Path
            openWorkBook = activeExcel.Workbooks.Open(xmlPathName, 0, false, tMiss, tMiss,
                                                         tMiss, true, tMiss, tMiss, tMiss,
                                                               true, tMiss, false, false);

            //
            // Log this line
            //
            LogTxt.LogCreator("Excel Application Opend");

            // Publishing the opened workbook (.xml file) as .pdf file
            openWorkBook.ExportAsFixedFormat(ExcelApp.XlFixedFormatType.xlTypePDF, pdfPathName);

            //
            // Log this line
            //
            LogTxt.LogCreator("Excel to .PDF published");
            }
            catch (Exception ee)
            {
                LogTxt.LogCreator(string.Format("Error is {0}", ee.InnerException.Message));
            }
            finally
            {
                // Flag for finding the Excel process or not
                //bool foundExcel = false;

                if (openWorkBook != null)
                {
                    // Closing the workbook 
                    openWorkBook.Close(false, tMiss, tMiss);
                    // here we say that this object is not going to be called anymore
                    Marshal.ReleaseComObject(openWorkBook);
                }
                if (activeExcel != null)
                {
                    // Closing the Excel
                    activeExcel.Quit();
                    // here we say that this object is not going to be called anymore
                    Marshal.ReleaseComObject(activeExcel);

                    //
                    // Log this line
                    //
                    LogTxt.LogCreator("Excel Procces Closed");
                }

                GC.GetTotalMemory(false);
                // Calling to GC go through all gen
                GC.Collect();
                // Stops the corrent thread untill the Finalizers empty the queue
                GC.WaitForPendingFinalizers();
                // Calling the GC to go through all gen
                GC.Collect();
                GC.GetTotalMemory(true);
}

Note - I'm logging to my log file so I'll be able to see what line of code is executed after deploy.

I've also ensured that I've the rights for executing COM components in the COM Security tab under Component Services management by adding the \Users and the Network Service users to the Access Permissions Defaults and to Launch and Activation Permissions.
As explained here.

What I'm asking is, if you guys have any idea for understanding what is wrong with the Open() method.

回答1:

I would look at using this to read an excel file

http://exceldatareader.codeplex.com/

Then this it will allow you to print to PDF.

http://pdfsharp.codeplex.com/

its open source and free to use in commercial applications.

Not a complete solution but its a start. Then your not using Com in a server environment



标签: c# com