C # 4.0 и Word 2007 Автоматизация - PullRequest
1 голос
/ 14 марта 2011

Я создаю приложение, которое получает тысячи документов Word из базы данных Oracle, и мне нужно преобразовать их в pdf и отправить обратно в базу данных. У меня уже есть весь механизм поддержки (взаимодействие с базой данных, многозадачность и подключаемый подход к базе данных и конфигурации). Несмотря на все предупреждения об использовании офисной автоматизации на стороне сервера, мой первый подход состоял в том, чтобы использовать ее (правда, мой клиент попросил ее использовать). Но я схожу с ума от взаимодействия между c # (.Net 4.0) и словом 2007. Я уже пробовал SaveAs и ExportAsFixedFormat. Оба работали нормально, но когда я пытаюсь закрыть слово ... я получил ошибку (всплывающее окно, говорящее, что слово обнаружило проблему и будет закрыто). Затем я попытался включить это перед выходом из приложения:

wordApplication.NormalTemplate.Saved = true;

Но это все еще вызывает ошибку. Я не могу конвертировать более ста документов без ошибки. Знаете ли вы какой-нибудь способ добиться этого преобразования без использования офисной автоматизации? Или, с другой стороны, вы знаете, как сделать это преобразование с помощью автоматизации делопроизводства без ошибок? Буду очень признателен за любую помощь.

EDIT: Отаку, вот пример кода, который я использую (ПРЕДУПРЕЖДЕНИЕ! Тестирование кода впереди)

 if (wordApplication == null)
        {
            try
            {
                wordApplication = (ApplicationClass)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application") ??
                             new ApplicationClass();
            }
            catch (COMException)
            {
                Type type = Type.GetTypeFromProgID("Word.Application");
                wordApplication = (ApplicationClass)System.Activator.CreateInstance(type);
            }

        }


        wordApplication.DisplayAlerts = WdAlertLevel.wdAlertsNone;
        wordApplication.DisplayRecentFiles = false;
        wordApplication.Visible = false;
        wordApplication.ScreenUpdating = false;

        Document wordDocument = null;

        object paramSourceDocPath = Path.Combine(TempFolder, sourceFilename);
        var paramExportFilePath = Path.Combine(TempFolder, sourceFilename + ".pdf");
        var paramMissing = Type.Missing;

        const WdExportFormat paramExportFormat = WdExportFormat.wdExportFormatPDF;
        const bool paramOpenAfterExport = false;
        const WdExportOptimizeFor paramExportOptimizeFor = WdExportOptimizeFor.wdExportOptimizeForPrint;
        const WdExportRange paramExportRange = WdExportRange.wdExportAllDocument;
        const int paramStartPage = 0;
        const int paramEndPage = 0;
        const WdExportItem paramExportItem = WdExportItem.wdExportDocumentContent;
        const bool paramIncludeDocProps = true;
        const bool paramKeepIrm = true;
        const WdExportCreateBookmarks paramCreateBookmarks = WdExportCreateBookmarks.wdExportCreateWordBookmarks;
        const bool paramDocStructureTags = true;
        const bool paramBitmapMissingFonts = true;
        const bool paramUseIso190051 = false;

        try
        {
            // Open the source document.
            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);

            // Export it in the specified format.
            if (wordDocument != null)
            {

                //DocumentSaveAs(wordDocument);

                Logger.Write("Open document" + sourceFilename, "info");
                wordDocument.ExportAsFixedFormat(paramExportFilePath,
                                                 paramExportFormat, paramOpenAfterExport,
                                                 paramExportOptimizeFor, paramExportRange, paramStartPage,
                                                 paramEndPage, paramExportItem, paramIncludeDocProps,
                                                 paramKeepIrm, paramCreateBookmarks, paramDocStructureTags,
                                                 paramBitmapMissingFonts, paramUseIso190051,
                                                 ref paramMissing);
            }
        }
        catch (Exception ex)
        {
            Logger.Write(ex.Message);
            throw;
        }
        catch
        {
            Logger.Write("Empty catch.");
            throw;
        }
        finally
        {
            try
            {

            object saveChanges = WdSaveOptions.wdDoNotSaveChanges;
            // Close and release the Document object.
            if (wordDocument != null)
            {

                wordDocument.Close(ref saveChanges, ref paramMissing,
                                   ref paramMissing);
                Thread.Sleep(2000);
                wordDocument = null;
            }

            // Quit Word and release the ApplicationClass object.

            foreach (Document document in wordApplication.Documents)
            {
                document.Close(saveChanges, paramMissing, paramMissing);
            }
            wordApplication.NormalTemplate.Saved = true;
            wordApplication.Quit(ref saveChanges, ref paramMissing,
                                 ref paramMissing);
            //Thread.Sleep(1000);
            wordApplication = null;


            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            GC.WaitForPendingFinalizers();


            Logger.Write("Deleting word file " + sourceFilename, "info");
            File.Delete(paramSourceDocPath.ToString());
            Logger.Write("File deleted " + sourceFilename, "info");

            Logger.Write("Reading pdf data " + paramExportFilePath, "info");
            ret = File.ReadAllBytes(paramExportFilePath);
            Logger.Write("Data read " + sourceFilename + ".pdf", "info");
            File.Delete(paramExportFilePath);
            Logger.Write("Pdf file deleted " + paramExportFilePath, "info");
            }
            catch (Exception e)
            {
                Logger.Write(e,"info");
                throw;
            }

1 Ответ

1 голос
/ 06 апреля 2011

Мы используем коммерческий продукт под названием Aspose для всех наших интеграций с Office (поскольку на самом деле он не требует Office, он очень быстрый и не является Interop).Я не уверен на 100%, будет ли ваш точный сценарий поддерживаться, но на их сайте есть много примеров, и если ваш проект поддерживает покупку пары лицензий, это может значительно облегчить вашу жизнь.

...