Попытка прочитать документ MS Office - PullRequest
1 голос
/ 12 марта 2012

У меня есть кусок кода, который я использую для чтения документов MS Office Word.

static void ReadMSOfficeWordFile(string file) {
    try {
        Microsoft.Office.Interop.Word.Application msWordApp = new Microsoft.Office.Interop.Word.Application();
        object nullobj = System.Reflection.Missing.Value;
        object ofalse = false;
        object ofile = file;

        Microsoft.Office.Interop.Word.Document doc = msWordApp.Documents.Open(
                                                    ref ofile, ref nullobj, ref nullobj,
                                                    ref nullobj, ref nullobj, ref nullobj,
                                                    ref nullobj, ref nullobj, ref nullobj,
                                                    ref nullobj, ref nullobj, ref nullobj,
                                                    ref nullobj, ref nullobj, ref nullobj,
                                                    ref nullobj);
        string result = doc.Content.Text.Trim();
        doc.Close(ref ofalse, ref nullobj, ref nullobj);
        msWordApp.Quit();
        CheckLineMatch(file, result);
    }
    catch {
        RaiseError("Unable to parse file because of MS Office error.", file);
    }
}

У меня есть три проблемы с этим.

Во-первых, он зависит от установки MS Office в каждой системе, на которой он может работать. Некоторые люди предпочитают Libre Office, но это все равно необходимо для работы с документами MS Office Word.

Во-вторых, я не знаю, будет ли это работать даже для документов MS Office 2003 и MS Office 2007 ...

Третий - МЕДЛЕННО. Это мучительно медленно.

SO! Я предполагаю, что ДОЛЖЕН быть лучший способ запустить его, чем этот. Я предполагаю, что кто-то должен знать о лучшем способе, чем новичок. Я только пытаюсь прочитать текст в документе, ничего больше.

Ответы [ 4 ]

3 голосов
/ 11 мая 2012

Мы можем многого добиться с помощью NPOI , проекта с открытым исходным кодом, без какой-либо надежности для офиса.

Например, для чтения всего текста из текстового документа может быть показано ниже.

public string ReadAllTextFromWordDocFile(string fileName)
{
    using (StreamReader streamReader = new StreamReader(fileName))
    {
        var document = new HWPFDocument(streamReader.BaseStream);
        var wordExtractor = new WordExtractor(document);
        var docText = new StringBuilder();
        foreach (string text in wordExtractor.ParagraphText)
        {
            docText.AppendLine(text.Trim());
        }
        streamReader.Close();
        return docText.ToString();
    }
}
3 голосов
/ 12 марта 2012

В ответ на ваше «приложение Word висит открытым», вам нужно сказать, чтобы оно закрылось.

msWordApp.Quit()

См. http://msdn.microsoft.com/en-us/library/bb215475(v=office.12).aspx

Относительно «зависит от установки MS Offise"Вы используете взаимодействие.Таким образом, по определению это требует его установки.Вы можете заглянуть в одну из коммерческих библиотек.

http://www.aspose.com/categories/.net-components/aspose.words-for-.net/default.aspx http://www.gemboxsoftware.com/document/pricelist

0 голосов
/ 12 марта 2012

Вас может заинтересовать этот проект от CodePlex - NetOffice

На веб-сайте приведены некоторые ключевые функции:

  • Интеграция Office без ограничений версии

  • Все методы, свойства и события версий Office 2000, 2002, 2003, 2007, 2010 включены

  • Синтаксически и семантически идентичен сборкам взаимодействия Microsoft

0 голосов
/ 12 марта 2012

Office Interop - это вариант (медленный, как вы уже обнаружили), но будьте осторожны: он не поддерживается MS в серверных сценариях (например, ASP.NET или Windows Service или аналогичных) - см http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2!

Обычно для достижения желаемого используется некоторая библиотека:

Библиотечный подход, как правило, очень быстрый, его можно использовать с многопоточностью, можно использовать в серверных сценариях и предоставляет множество дополнительных возможностей ...

Что касается вашего второго пункта: с Interop вам нужно позвонить Quit, чтобы закрыть приложение ... хотя иногда вам нужно также позвонить System.Runtime.InteropServices.Marshal.FinalReleaseComObject (что может есть некоторые нежелательные побочные эффекты см. http://blogs.msdn.com/b/yvesdolc/archive/2004/04/17/115379.aspx)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...