Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы обработки Word документов, Ошибки в обработке и работе Wor 
:(
    Опции темы
flog
Дата 15.1.2013, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 15.1.2013

Репутация: нет
Всего: нет



Добрый вечер.

Суть проблемы заключается в том что была написана программа
которая должна была из множества файлов Word одного шаблона (в шаблоне расположены 99 таблиц) создавать 99 файлов одних и тех же таблиц формата Word. 
Реализовано все это было методом поиска по меткам в шаблоне.
при переходе на более новые версии msWord(с 2007 на 2010) и VB(с 2008 на 2012).
программа стала выдавать ошибки при сохранении, при закрытии, может вылететь(Подвиснуть) сама программа Word. До перехода было все нормально все работало.  Причем ошибки  могут вылетать не каждый раз.
Помогите если сможете  разобраться в чем проблема. 


при анализе исходного кода выдает следующие сообщение
для инструкции  Clipboard.Clear()
CA2202    Не ликвидировать объекты несколько раз    Объект "'mdO.Tables.GetEnumerator()'" можно удалять более одного раза в методе 'Form1.Button3_Click(Object, EventArgs)'. Чтобы избежать исключения System.ObjectDisposedException, следует вызывать метод "Dispose" для объекта только один раз.: Lines: 170    Отчеты кафедр    Form1.vb    170

сам код процедуры:
Код


 nt = Split( _
            " 2.1.1, 2.2.1, 2.2.2, 2.3.1, 2.3.2" & _
            ", 2.4.1, 2.4.2, 2.4.3, 2.5.1" & _
            ", 2.5.2, 3.2.1, 3.3.1, 3.3.2, 3.3.3, 3.3.4, 3.3.5, 3.3.6, 3.3.7, 3.3.8, 3.3.9, 3.3.10, 3.3.11, 3.3.12" & _
            ", 3.4.1, 3.4.2" & _
            ", 3.4.3, 3.4.4, 3.4.5" & _
            ", 4.1.1, 4.1.2, 4.1.3, 4.1.4, 4.2.1, 4.2.2, 4.2.3, 4.2.4, 4.3.1, 4.3.2" & _
            ", 5.1.1, 5.2.1, 5.2.2, 5.2.3, 5.2.4, 5.2.5, 5.2.6, 5.2.7" & _
            ", 5.3.1, 5.3.2, 5.3.3, 5.3.4, 5.3.5, 5.3.6, 5.3.7" & _
            ", 5.4.1, 5.4.2, 5.4.3, 5.5.1" & _
            ", 5.5.2, 5.5.3, 5.5.4, 5.5.5, 5.5.6, 5.5.7, 5.5.8, 5.5.9, 5.5.10, 5.5.11, 5.5.12, 5.5.13, 5.5.14" & _
            ", 5.6.1, 5.6.2" & _
            ", 5.6.3, 5.6.4" & _
            ", 6.1.1, 6.1.2, 6.2.1, 6.2.2, 6.3.1, 6.3.2, 6.4.1" & _
            ",7.1.1, 7.1.2, 7.1.3" & _
            ", 7.1.4, 7.1.5, 7.1.6, 7.2.1, 7.2.2, 7.2.3, 7.2.4" & _
            ", 7.2.5, 7.3.1, 7.3.2, 7.3.3, 7.3.4" & _
            ", 8.1,Соисполнитель", ",")
        For i = 0 To 96

            ProgressBar1.Value = 0
            ProgressBar2.Value = 0
            ProgressBar1.Visible = True
            ProgressBar2.Visible = True
            '  System.Windows.Forms.Application.DoEvents()

            mdI = owI.Documents.Add()

            owI.ActiveWindow.ActivePane.View.Type = Word.WdViewType.wdNormalView
            owI.ActiveWindow.View.Type = Word.WdViewType.wdNormalView
            ProgressBar1.Maximum = 8
            ProgressBar1.Minimum = 0
            Dim fs As Object
            l = 0
            fs = CreateObject("Scripting.FileSystemObject")
            fold = fs.GetFolder(Label1.Text)
            For Each fl In fold.Files
                Extent = Split(fl.Name, ".")
                If Extent(1) = "doc" Or Extent(1) = "docx" Then l = l + 1
            Next
            ProgressBar2.Maximum = l
            ProgressBar2.Minimum = 0

            l = 0
            For Each fl In fold.Files

                ProgressBar1.Value = 0
                '    System.Windows.Forms.Application.DoEvents()

                Extent = Split(fl.Name, ".")
                If Extent(1) <> "doc" And Extent(1) <> "docx" Then GoTo 1
                fai = CStr(Label1.Text + "\" + fl.Name)
                mdO = owO.Documents.Open(fai)
                owO.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone
                owO.ActiveWindow.ActivePane.View.Type = Word.WdViewType.wdNormalView
                owO.ActiveWindow.View.Type = Word.WdViewType.wdNormalView
                owO.Visible = True
                owI.Visible = True

                owI.Selection.PageSetup.PageHeight = owO.Selection.PageSetup.PageHeight
                owI.Selection.PageSetup.Orientation = owO.Selection.PageSetup.Orientation
                owI.Selection.PageSetup.PaperSize = owO.Selection.PageSetup.PaperSize
                owI.Selection.PageSetup.PageWidth = owO.Selection.PageSetup.PageWidth
                owI.Selection.PageSetup.LeftMargin = owO.Selection.PageSetup.LeftMargin
                owI.Selection.PageSetup.TopMargin = owO.Selection.PageSetup.TopMargin
                owI.Selection.PageSetup.RightMargin = owO.Selection.PageSetup.RightMargin
                owI.Selection.PageSetup.BottomMargin = owO.Selection.PageSetup.BottomMargin

                ProgressBar1.Value = 2
                owO.Selection.Find.ClearFormatting()
                With owO.Selection.Find

                    .Text = "Табл." + nt(i)
                    .Replacement.Text = ""
                    .Forward = True
                    .Wrap = Word.WdFindWrap.wdFindContinue
                    .Format = False
                    .MatchCase = True
                    .MatchWholeWord = True
                    .MatchWildcards = False
                    .MatchSoundsLike = False
                    .MatchAllWordForms = False
                End With

                owO.Selection.Find.Execute()
                t1 = owO.Selection.End
                owO.Selection.Find.ClearFormatting()
                With owO.Selection.Find
                    If i = 96 Then
                        .Text = nt(i + 1)
                    Else
                        .Text = "Табл." + nt(i + 1)
                    End If
                    .Replacement.Text = ""
                    .Forward = True

                    .Wrap = Word.WdFindWrap.wdFindContinue
                    .Format = False
                    .MatchCase = True
                    .MatchWholeWord = True
                    .MatchWildcards = False
                    .MatchSoundsLike = False
                    .MatchAllWordForms = False
                End With
                owO.Selection.Find.Execute()
                t2 = owO.Selection.End
                If t1 = 0 Then
                    ProgressBar2.Value = l
                    l = l + 1
                    mdO.Close()
                    mdO = Nothing
                    Continue For
                End If
                ProgressBar1.Value = 4
                k = False
                For Each r In mdO.Tables
                    If r.Range.Start > t1 And r.Range.End < t2 Then
                        System.Windows.Forms.Application.DoEvents()
                        r.Cell(1, 1).Select()
                        If owO.Selection.End >= t2 Then Exit For
                        If owO.Selection.End > t1 And owO.Selection.End < t2 Then
                            ProgressBar1.Value = 6
                            owI.Selection.TypeParagraph()
                            owI.Selection.MoveDown(, 5)
                            owI.Selection.InsertParagraphAfter()
                            owI.Selection.TypeText(Text:=fl.name)
                            owI.Selection.TypeParagraph()
                            r.Select()
                            owO.Selection.Copy()
                            owI.Selection.PasteAndFormat(Word.WdRecoveryType.wdPasteDefault)
                            k = False
                            Clipboard.Clear()
'                            ProgressBar1.Value = 8
                        End If
                    End If
                Next

                owI.Selection.InsertBreak(Word.WdBreakType.wdPageBreak)
                mdO.Close()
                mdO = Nothing
                ProgressBar2.Value = l
                l = l + 1
'                t1 = 1
                t2 = 1
1:          Next

            If InStr(nt(i), "*") = 0 Then
                mdI.SaveAs("C:\Users\Public\Documents\" & Trim(nt(i)) & ".doc", Word.WdSaveFormat.wdFormatDocument, False, "", True, "", False, False, False, False, False)
            Else
                mdI.SaveAs("C:\Users\Public\Documents\" & Trim(Replace(nt(i), "*", "") & ".doc"), Word.WdSaveFormat.wdFormatDocument, False, "", True, "", False, False, False, False, False)
            End If
            mdI.Close()
            mdI = Nothing
        Next i
        owO.Quit()
        owI.Quit()
        owO = Nothing
        owI = Nothing


Это сообщение отредактировал(а) flog - 15.1.2013, 17:38
PM MAIL   Вверх
diadiavova
Дата 16.1.2013, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Слишком много кода в одном методе. Код нечитабелен, особенно если писал его кто-то другой. Кроме того, неясно где здесь 170-я строка, здесь она какая? Но вообще, если бы код правилно был разбит на методы, то ты и сам нашёл бы проблему. Судя по сообщению у тебя один объект уничтожается более одного раза. Ищи где ты его удаляешь, по всей видимости в цикле и по всей видимости в этом цикле он не инициируется, таким образом при следующей итерации переменная может оказаться пустой. Находится это где-то недалеко от 170-ой строки кода. Кроме того, не забывай. что диспоуз обычно вызывается из метода клоуз, то есть подозрение более всего падает на строки типа
md0.Close()
ну или что-то в этом роде.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
flog
Дата 16.1.2013, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 15.1.2013

Репутация: нет
Всего: нет



в данном фрагменте это 132 строка, все лишь очистка буфера обмена, да она в цикле по другому никак что бы не переполнить сам буфер обмена, перетаскивание таблиц происходит методом переноса через буфер, в цикле потому что таблицы иногда могут быть разорванными и они просто копируются кусками. строки типа  md0.Close() - используются для закрытия документов естественно они тоже в цикле так как нужно перебрать все файлы из папки.

при выполнении программы выдается ошибка вида - Вызов был отклонен. (Исключение из HRESULT: 0x80010001 (RPC_E_CALL_REJECTED))
Отладчик:Перехвачено исключение: Button3_Click, Form1.vb строка 161 (к куске она 124 - перемещение курсора)- строка бывает разная но ошибка одна.
Исключение перехвачено, а стек вызовов возвращен к состоянию на момент поступления вызова от пользовательского кода, где произошло исключение. В параметрах отладчика выбрано значение "Очистить стек вызовов от кадров необработанных исключений".

Иногда эта ошибка не вылетает причем на одном и том же множестве файлов, один раз ошибка в другой все нормально проходит. такое ощущение складывается что это сама вордовская библиотека сбоит. хотя офис уже много раз переставлял причем разные версии и подключал разные версии библиотек.

я то понимаю что там написано. только не пойму почему так получилось на уже давно отлаженной программе




PM MAIL   Вверх
diadiavova
Дата 16.1.2013, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(flog @  16.1.2013,  12:58 Найти цитируемый пост)
в данном фрагменте это 132 строка, все лишь очистка буфера обмена, да она в цикле по другому никак что бы не переполнить сам буфер обмена, перетаскивание таблиц происходит методом переноса через буфер, в цикле потому что таблицы иногда могут быть разорванными и они просто копируются кусками. строки типа  md0.Close() - используются для закрытия документов естественно они тоже в цикле так как нужно перебрать все файлы из папки.

Ну там ругается анализатор кода из-за того, что документ закрывается дважды. У тебя там в первый раз это происходит в условии с возвратом к началу цикла, а анализатор это не учитывает, так что тут нормально всё. Собственно исходил из тех данных об ошибке, которые ты предоставил.
Цитата(flog @  16.1.2013,  12:58 Найти цитируемый пост)
при выполнении программы выдается ошибка вида - Вызов был отклонен. (Исключение из HRESULT: 0x80010001 (RPC_E_CALL_REJECTED))

Это ком-исключение, ругается сама библиотека офиса. Честно говоря, штука очень проблемная и я тут вряд ли смогу точный рецепт дать. Могу предположить, что тут какие-то разрешения виконфигурации прописать надо. В принципе, если раньше всё хорошо было, а проблема стала возникать именно при смене студди, то посмотри в свойствах проекта целевой фреймворк и если там 4 или выше, то замени на 3,5 например. У 4-го фреймворка система безопасности ( том числе при работе с ком) - другая, так что похоже, что дело в этом.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
flog
Дата 16.1.2013, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 15.1.2013

Репутация: нет
Всего: нет



поиграв с версиями фреймворк ничего не помогло выдает следующее исключение 

-Исключение:Вызвано: "Вызов был отклонен. (Исключение из HRESULT: 0x80010001 (RPC_E_CALL_REJECTED))" (System.Runtime.InteropServices.COMException)
Возникло System.Runtime.InteropServices.COMException: "Вызов был отклонен. (Исключение из HRESULT: 0x80010001 (RPC_E_CALL_REJECTED))"

 - сбой при удаленном вызове процедуры 0x800706be
ничего хорошего из этого не получил, то может пройти цикл 20 проходов и выдать ошибку то и 2 не может пройти
может как ни то по другому можно передать таблицы из одного документа в другой не использую буфер обмена?


PM MAIL   Вверх
diadiavova
Дата 16.1.2013, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Я с всто знаком очень поверхностно, так что вряд ли смогу помочь. Лучше всего на специализированном форуме спросить. На офсайте вроде есть на английском форум. Вообще с ком-взаимодействием такое бывает, иногда не нахожу ничего лучшего, как только обработать исключение и всё, что не проходит пропустить.

Цитата(flog @  16.1.2013,  16:53 Найти цитируемый пост)
может как ни то по другому можно передать таблицы из одного документа в другой не использую буфер обмена?

Таблицу можно в переменную скопировать, если правильно вопрос понял. А вообще, если формат документа docx, а не doc, то можно вообще без ком-библиотек обойтись
http://www.microsoft.com/en-us/download/details.aspx?id=5124
там этих проблем точно не будет.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 16.1.2013, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



В принципе справка по исключению 
http://support.microsoft.com/kb/329854/en-us
Здесь правда говорится, что исключение может вылетать при подключении к другому компу, но это всё-таки ком-взаимодействие, так что фиг его знает, тут всё может случиться smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0805 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.