7 / 7 / 0
Регистрация: 25.05.2010
Сообщений: 38
1

Крайне медленная работа Microsoft.Office.Interop.Word

04.01.2012, 13:21. Показов 6405. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имею конструкцию такого плана:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
            Object fileName = @f.FullName;
            Object missing = Type.Missing;
            app.Documents.Open(ref fileName, ref missing, ref missing, ref missing,
                ref missing, ref missing,  ref missing, ref missing,
                ref missing, ref missing,  ref missing, ref missing,
                ref missing, ref missing,  ref missing, ref missing);
            Microsoft.Office.Interop.Word.Document doc = app.ActiveDocument;
            doc.GrammarChecked = false;
            string s = "";
            for (int i = 1; i <= doc.Paragraphs.Count; i++)
            {
                s += doc.Paragraphs[i].Range.Text+' ';
            }
            app.ActiveDocument.Close();
            app.Quit();
Для польших файлов работает крайне медленно (1мб открывает минуту).
Есть ли способ ускорится?
На одном из форумов читал, что помогает отключение проверки орфографии. Но как?
Я пробовал воткнуть
C#
1
doc.GrammarChecked = true;//или false
На работе никак не отразилось.

И еще вопрос: в этом же модуле использую Microsoft.Office.Interop.Excel;
Так отладчик ругается на последние 2 строчки: Предупреждение 1 Неоднозначность между методом "Microsoft.Office.Interop.Word._Document.Close(ref object, ref object, ref object)" и "Microsoft.Office.Interop.Word.DocumentEvents2_Event.Close", который методом не является. Используйте группу методов.
Как должны выглядеть:
C#
1
2
 app.ActiveDocument.Close();
   app.Quit();
чтобы небыло неодназначности?
Заранее благодарен...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.01.2012, 13:21
Ответы с готовыми решениями:

Использование Microsoft.Office.Interop.Word на компьютере без установленного пакета MS office
Есть приложение, которое использует Microsoft.Office.Interop.Word, на компах с установленным офисом...

Считать текст из Word посредством Microsoft.Office.Interop.Word
Необходимо считать форматированный текст из Word посредством Microsoft.Office.Interop.Word. По...

Microsoft.Office.Interop.Word не работает на клиентском компьютере
Приложение C# написанное в VS 2012, подключила сборку Microsoft.Office.Interop.Word,все работает,...

Как добавить ссылку Microsoft.Office.Interop.Word?
Добрый день, подскажите пожалуйста как добавить ссылку Microsoft.Office.Interop.Word в студию, сам...

9
81 / 81 / 8
Регистрация: 13.01.2010
Сообщений: 304
04.01.2012, 13:28 2
мне когда было необходимо создать doc отчет, я просто генерировал html разметку. Это как крайний выход.
0
7 / 7 / 0
Регистрация: 25.05.2010
Сообщений: 38
04.01.2012, 13:33  [ТС] 3
Цитата Сообщение от ellin Посмотреть сообщение
мне когда было необходимо создать doc отчет, я просто генерировал html разметку. Это как крайний выход.
Я же не создаю новый документ. Я читаю готовый...
0
81 / 81 / 8
Регистрация: 13.01.2010
Сообщений: 304
04.01.2012, 13:50 4
Цитата Сообщение от Frustrator Посмотреть сообщение
Я же не создаю новый документ. Я читаю готовый...
попробуйте отследить на каком этапе в этом коде происходит зависание
0
7 / 7 / 0
Регистрация: 25.05.2010
Сообщений: 38
04.01.2012, 14:01  [ТС] 5
C#
1
2
3
4
for (int i = 1; i <= doc.Paragraphs.Count; i++)
            {
                s += doc.Paragraphs[i].Range.Text+' ';
            }
Это момент зависания.
Неужели, нет более шустрого способа считать текст из дока (без сторонних библиотек).
0
81 / 81 / 8
Регистрация: 13.01.2010
Сообщений: 304
04.01.2012, 14:17 6
Цитата Сообщение от Frustrator Посмотреть сообщение
Это момент зависания.
Неужели, нет более шустрого способа считать текст из дока (без сторонних библиотек).
Можно попробовать через LINQ пробежать по параграфам.
Можно попробовать производить редактирование в отдельном потоке.
Можно вообще не бегать по параграфам, а в тексте документа искать тэги <p> и работать с ними.
1
7 / 7 / 0
Регистрация: 25.05.2010
Сообщений: 38
04.01.2012, 14:24  [ТС] 7
Мне нужно получить весь текст без редактирования.

Как, в таком случае, мне поможет LINQ?
Про потоки как раз думаю, но мне, как новичку, будет очень трудно...
0
81 / 81 / 8
Регистрация: 13.01.2010
Сообщений: 304
04.01.2012, 14:37 8
Parallel LINQ позволил бы делать проход по параграфам в отдельном потоке.
Нашел практическое руководство по работе с word. Возможно стоит делать как там сперва создание Word.Range, а затем работать с текстом.
1
7 / 7 / 0
Регистрация: 25.05.2010
Сообщений: 38
04.01.2012, 19:11  [ТС] 9
Нашел решение, работает очень быстро.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
            Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
            Object fileName = @f.FullName;
            Object missing = Type.Missing;
            app.Documents.Open(ref fileName, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing);
            Microsoft.Office.Interop.Word.Document doc = app.ActiveDocument;
            doc.GrammarChecked = false;
 
            Object start = Type.Missing;
            Object end = Type.Missing;
 
            Word.Range rng =  doc.Range(ref start, ref end);
            rng.Select();
            string s = rng.Text.ToString();
 
            app.ActiveDocument.Close();
            app.Quit();
Только проблема с последними строчками так и не решена. Как же они должны выглядеть?
0
14 / 18 / 5
Регистрация: 13.04.2011
Сообщений: 148
08.05.2012, 10:02 10
Не знаю актуально ли еще, но я делал вот так.
C#
1
2
3
4
5
6
private void RPS(string stubTR, string text, Word.Document wordDoc)
        {
            var range = wordDoc.Content;
            range.Find.ClearFormatting();
            range.Find.Execute(FindText: stubTR, ReplaceWith: text);
        }
просто вызываю функцию, как параметры передаю:stubTR - что менять, text - на что менять, wordDoc в каком документе.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2012, 10:02
Помогаю со студенческими работами здесь

работа с microsoft office interop
Добрый день. В ворде есть способ получить содержимое файла из поврежденного файла(который не...

Работа с таблицей в Word через библиотеку Microsoft.Interop.Word
Здравствуйте, я продвинутый программист.Пишу программу и использованием библиотеки...

Interop.Microsoft.Office.Interop.Excel, как исправить ошибку несовместимости версий
Error 1 Assembly 'Interop.Microsoft.Office.Interop.Excel, Version=1.7.0.0, Culture=neutral,...

Не та версия office.interop.word
Здравствуйте. Написал программу на C#. В программе используется office.interop.word (версия...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru