Использование Office Interopt при преобразовании в XPS - PullRequest
0 голосов
/ 12 января 2012

Я создаю простое приложение, которое отвечает за сбор файлов Office, найденных в определенном forlder, а затем преобразование их в XPS, чтобы их можно было легко представить в элементе управления интерфейса WPF.

Для этого я использую WOrd, Excell, офисное взаимодействие powwerpoint, собранное в моем проекте. До сих пор прекрасно работает, он конвертирует, но время от времени он конвертирует все документы как талисман и тестирует после того, как конвертирует только одно или 2 поля и возвращает следующее исполнение:

"Не удалось получить фабрику класса COM для компонента с CLSID {000209FF-0000-0000-C000-000000000046} из-за следующей ошибки: 80070005 Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))."

Исключение составляет retunr при попытке создать объект Word.Application

__wordApplication = new Microsoft.Office.Interop.Word.Application();

Вот мой метод конвертации

 private static void ConvertFromWord(IDocument Doc)
    {

        __wordApplication = new Microsoft.Office.Interop.Word.Application();
        __wordApplication.Visible = false;
        __wordApplication.DisplayAlerts = WdAlertLevel.wdAlertsNone;


        //if (__isWordInitialized == false)
        //    InitializeWord();

        Word.Document wordDocument = null;

        object pSourceDocPath = Path.Combine(new Uri(Doc.OriginalPath).LocalPath,Doc.OriginalFile);
        object paramMissing = Type.Missing;


        string pExportFilePath =MyExtensions.IsNullOrWhiteSpace(Doc.ConvertedFile) ? GetUniqueXpsFile(new Uri(Doc.ConvertedPath).LocalPath) : Doc.ConvertedFile;

        Doc.ConvertedFile = Path.GetFileName(pExportFilePath);

        try
        {
            var pExportFormat = Word.WdExportFormat.wdExportFormatXPS;
            bool pOpenAfterExport = false;
            var pExportOptimizeFor = Word.WdExportOptimizeFor.wdExportOptimizeForOnScreen;
            var pExportRange = Word.WdExportRange.wdExportAllDocument;
            int pStartPage = 0;
            int pEndPage = 0;
            var pExportItem = Word.WdExportItem.wdExportDocumentContent;
            var pIncludeDocProps = true;
            var pKeepIRM = true;
            var pCreateBookmarks = Word.WdExportCreateBookmarks.wdExportCreateWordBookmarks;
            var pDocStructureTags = true;
            var pBitmapMissingFonts = true;
            var pUseISO19005_1 = false;
            //var pFixedFormatExtClassPtr=;

            try
            {
                try
                {
                    wordDocument = __wordApplication.Documents.Open(ref pSourceDocPath,
                                                                  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
                        );
                }
                catch (Exception exc)
                {
                    //return new OfficeToXpsConversionResult(Solatys.Office.Lib.Types.Types.ConversionResult.ErrorUnableToOpenOfficeFile, exc.Message, exc);
                }

                if (wordDocument != null)
                {
                    try
                    {
                        wordDocument.ExportAsFixedFormat( 
                                            pExportFilePath,
                                            pExportFormat,
                                            pOpenAfterExport,
                                            pExportOptimizeFor,
                                            pExportRange,
                                            pStartPage,
                                            pEndPage,
                                            pExportItem,
                                            pIncludeDocProps,
                                            pKeepIRM,
                                            pCreateBookmarks,
                                            pDocStructureTags,
                                            pBitmapMissingFonts,
                                            pUseISO19005_1,
                                            ref paramMissing
                                        );
                    }
                    catch (Exception exc)
                    {
                       // return new OfficeToXpsConversionResult(Solatys.Office.Lib.Types.Types.ConversionResult.ErrorUnableToExportToXps, "Word", exc);
                    }


                }
                else
                {
                    //return new OfficeToXpsConversionResult(Solatys.Office.Lib.Types.Types.ConversionResult.ErrorUnableToOpenOfficeFile);
                }
            }
            finally
            {
                // Close and release the Document object.
                if (wordDocument != null)
                {
                    wordDocument.Close(ref paramMissing, ref paramMissing,ref paramMissing);
                    wordDocument = null;
                }

                // Quit Word and release the ApplicationClass object.
                if (__wordApplication != null)
                {
                    __wordApplication.Quit(ref paramMissing, ref paramMissing, ref paramMissing);
                    __wordApplication = null;
                }

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                GC.WaitForPendingFinalizers();
                __isWordInitialized=false;
            }
        }
        catch (Exception exc)
        {
            //return new OfficeToXpsConversionResult(Solatys.Office.Lib.Types.Types.ConversionResult.ErrorUnableToAccessOfficeInterop, "Word", exc);
        }

        Doc.ConvertedFile = pExportFilePath;
        KillWord();
   }

Есть идеи, что может быть не так? Странно также то, что в зависимости от объема документа я могу получить исключение COMEx в той же строке, где создается объект приложения. Я начинаю очень злиться: - (

С уважением саржа

Ответы [ 2 ]

0 голосов
/ 12 января 2012

Хорошо, вот еще несколько вопросов.При использовании в верхней части вашего файла .cs у вас есть следующее: *

    using Microsoft.Office.Interop.Word; 

оттуда, где вы

__wordApplication = new Microsoft.Office.Interop.Word.Application();

измените это на Application _wordApplication = new Application(); Где выпередают ref paramMissing - измените это значение на null, передайте его так же, как это значение null, где вы устанавливаете _wordApplication = на null ... измените его на

System.Runtime.InteropServices.Marshal.ReleaseComObject(_wordApplication); 

Com Объекты освобождаются иначе, чем управляемые объекты

0 голосов
/ 12 января 2012

Это часто вызывается тем, что вы не являетесь администратором или у вас нет привилегий администратора.Хорошо сформулированная проблема - это половина проблемы, и в этом случае просто убедитесь, что ваша учетная запись имеет привилегии администратора и использует их.

Не могли бы вы также вставить код, в котором вы используете _wordApplication, звучит какпроблема с ссылками, кроме использования .. добавили ли вы ссылки через vs2008 или vs2010, чтобы убедиться, что вы копируете поверх .Dll, если это то, что работает на вашем компьютере, а не на целевой машине ... тогда это определенная проблема сразные версии Office.Interop, запущенные на компьютере .. в проекте для каждого из .dll, которые необходимы для содержимого Microsoft.Interop ... убедитесь, что вы устанавливаете copy local = true;

...