Word Interop dynamic неправильное значение
От: dsalodki Беларусь http://dsalodki.wix.com/resume
Дата: 24.05.23 10:31
Оценка:
            var word = new Application { Visible = false };
            var doc = word.Documents.Add();
            doc.Activate();

            Range rng = doc.Range(0, 0);
            rng.Text = text;
            rng.Select();

            doc.Content.Select();

            var totalWords = word.Selection.Words.Count;

            var i = 0;
            var prevPercent = 0;
            var enumeratorSelection = word.Selection.Words.GetEnumerator();
            while (enumeratorSelection.MoveNext())
            {
                if (_backgroundWorker.WorkerReportsProgress && prevPercent < i * 100 / totalWords)
                {
                    prevPercent = i * 100 / totalWords;
                    _backgroundWorker.ReportProgress(prevPercent);
                }
                i++;

                dynamic w = enumeratorSelection.Current;
                int? languageId = w.LanguageID as int?;
                Log.Information(languageId.HasValue ? languageId.Value.ToString() : null);
                if (languageId.HasValue && languageId == (int)WdLanguageID.wdRussian)
                {


вывод в логе
2023-05-24 02:40:19.000 -07:00 [INF] 1033
2023-05-24 02:40:19.042 -07:00 [INF] 1033
2023-05-24 02:40:19.046 -07:00 [INF] 1033
2023-05-24 02:40:19.051 -07:00 [INF] 1033
2023-05-24 02:40:19.056 -07:00 [INF] 1033
2023-05-24 02:40:19.060 -07:00 [INF] 1033
2023-05-24 02:40:19.064 -07:00 [INF] 1033
2023-05-24 02:40:19.067 -07:00 [INF] 1033
...

реально должно выводить 1049 (wdRussian = 1049)

прикол такой если поставить брекпоинт в начале while то выводит правильно

кстати ошибка для word 2016, для моего 2021 работает

ещё можно сделать так MessageBox.Show(w.LanguageID.ToString()) и тогда первый раз неправильно, но потом OK нажимаю и показывает верно

подскажите как пофиксить
Re: Word Interop dynamic неправильное значение
От: dsalodki Беларусь http://dsalodki.wix.com/resume
Дата: 24.05.23 13:23
Оценка: 12 (2)
var enumeratorSelection = word.Selection.Words.GetEnumerator();
Thread.Sleep(5000);

Добавил таймаут, теперь вроде везде работает. Может только если гигантский документ будет, то не справится. Но довольно большие обрабатывает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.