Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
2 / 2 / 0
Регистрация: 21.02.2024
Сообщений: 3

Исключение при обработке таблицы Word с объединёнными ячейками

21.02.2024, 16:17. Показов 2104. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте! Прошу помощи с такой проблемой:
При обработке таблицы с объединёнными ячейками в документе Word возникает исключительная ситуация: " System.Runtime.InteropServices.COMExcept ion: "Отсутствует доступ к отдельным строкам, поскольку таблица имеет ячейки, объединенные по вертикали."

Участок кода, где возникает ошибка:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 ' Перебираем все таблицы в документе
 For Each objTable In objDoc.Tables
     ' Перебираем строки таблицы
     For row = 1 To objTable.Rows.Count
 
         ' Получаем строку таблицы
            Dim tableRow As Object = objTable.Rows(row) 'В этой строке происходит исключительная ситуация
 
          ' Проверяем количество ячеек в строке
         If tableRow.Cells.Count = 1 Then
                 Console.WriteLine("Название иерархии: " & tableRow.Cells(1).Range.Text)
             ElseIf tableRow.Cells.Count > 1 Then
                 ' Перебираем столбцы таблицы
                  For col = 1 To objTable.Columns.Count
                     ' Получаем ячейку таблицы
                     Dim cell As Object = objTable.Cell(row, col)
                     If cell.Range.Font.Italic = True Then
                         Console.WriteLine("Название столбца: " & cell.Range.Text)
                     Else
                         Console.WriteLine("Обычные данные: " & cell.Range.Text)
                     End If
                 Next col
             End If
 
     Next row
 Next
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.02.2024, 16:17
Ответы с готовыми решениями:

Сортировка таблицы с объединенными ячейками
Есть таблица в которой обеднены ячейки, хочу сделать кнопку которая будет сортировать по № позиции эту таблицу. Но такую таблицу не могу...

Создание таблицы с объединенными ячейками
Привет. Как создать и возможно ли создать таблицу из 12 столбцов, но чтобы в 1 и 2 столбце были объединены каждые 12 строк? как на...

Добавление столбца таблицы с объединенными ячейками
Всем привет! При добавлении к таблице последнего столбца стандартными средствами добавляются все строки, а нужно, чтобы добавленный...

5
148 / 70 / 12
Регистрация: 11.02.2017
Сообщений: 310
21.02.2024, 19:56
Может это поможет. Код C# можно конвертнуть любым конвертором.
C#, Interop.Word - ошибка "Отсутствует доступ к отдельным строкам, поскольку таблица имеет ячейки, объединенные по вертикали."
Или в английском варианте Cannot access individual rows in this collection because the table has vertically merged cells. Как несложно догадаться ошибка возникает при попытке объединения ячеек в таблице документа Word по вертикали, в колонках, точнее говоря при попытке обратиться к ячейкам в таблице где хоть в одной колонке уже произошло вертикальное объединения ячеек. Я поймал ее при попытке последовательно объединять ячейки в разных колонках, другие ловят при банальном чтении таблицы.

Судя по всему это глюк в интерфейсе работы с таблицами Word. Обойти его можно отказавшись от обращения к строкам таблицы и обращаясь напрямую к ячейкам через метод Table.Cell. Например при обьединении прямоугольного массива ячеек можно внести следующие изменения в код

// старый код обращался к ячейке через коллекцию строк //_table.Rows[cellOneRowIndex].Cells[cellOneColIndex].
C#
1
Merge(_table.Rows[cellTwoRowIndex]. Cells[cellTwoColIndex]);
//новый обращается через общий массив ячеек
C#
1
_table.Cell(cellOneRowIndex, cellOneColIndex). Merge(_table.Cell(cellTwoRowIndex, cellTwoColIndex))
И еще:
Программно создаю таблицу.
Каждая новая строка добавляется командой (1):
oTable.Rows.Add BeforeRow:=oTable.Rows(nRow),
где nRow - номер последней строки в таблице.
По ходу наполнения таблицы требуется в некоторых строках создаваемой таблицы разбивать ячейку не несколько строк. Делаю это командой (2):
oTable.Cell(nRow, 4).Split NumRows:=oRcIn.ResolCnt, NumColumns:=1
Проблема в том, что после создания строки, у которой имеется ячейка, разбитая на несколько строк, очередная команда (1) не отрабатывает. Выдается ошибка: Run-time error '5991': Отсутствует доступ к отдельным строкам, поскольку таблица имеет ячейки, объединенные по вертикали.
Да, работать не будет. Нужно обращаться к ячейкам, отсеивая нужные по индексу строки
Добавлено через 27 минут
Не проверял:
1.
VB.NET
1
2
3
4
5
6
7
8
9
Dim table As Table = Globals.ThisDocument.Tables(1)
    Dim range As Range = table.Range
 
    For i As Integer = 1 To range.Cells.Count
        If range.Cells(i).RowIndex Is table.Rows.Count Then
            'range.Cells(i).Range.Text = range.Cells(i).RowIndex.ToString() & ":" + range.Cells(i).ColumnIndex
            MessageBox.Show(range.Cells(i).Range.Text)
        End If
    Next
2.
VB.NET
1
2
3
For Each cell As Cell In doc.Tables(i).Range.Cells
    Debug.Print(cell.Range.Text)
Next
2
148 / 70 / 12
Регистрация: 11.02.2017
Сообщений: 310
21.02.2024, 22:58
Лучший ответ Сообщение было отмечено Katerina789 как решение

Решение

Цитата Сообщение от Katerina789 Посмотреть сообщение
Здравствуйте! Прошу помощи с такой проблемой:
При обработке таблицы с объединёнными ячейками в документе Word возникает исключительная ситуация: " System.Runtime.InteropServices.COMExcept ion: "Отсутствует доступ к отдельным строкам, поскольку таблица имеет ячейки, объединенные по вертикали."
Или такой вариант: https://www.nuget.org/packages/DocX
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Imports Xceed.Words.NET
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim str As String = ""
        Dim objDoc = DocX.Load("E:\Music\!M_New\3.docx")
        'Перебираем таблицы
        For Each objTable In objDoc.Tables
            'Перебираем строки таблицы
            For Each row In objTable.Rows
                'Перебираем ячейки строки таблицы
                For Each cell In row.Cells
                    str += cell.Paragraphs(0).Text & " "
                Next
                TextBox1.Text += str & vbCrLf
                str = ""
            Next
        Next
    End Sub
End Class
Миниатюры
Исключение при обработке таблицы Word с объединёнными ячейками   Исключение при обработке таблицы Word с объединёнными ячейками  
1
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
21.02.2024, 23:35
Katerina789, вариант
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Imports System.IO
Imports WRD = Microsoft.Office.Interop.Word
'...
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim wApp As New WRD.Application
    wApp.DisplayAlerts = WRD.WdAlertLevel.wdAlertsNone
    Dim objDoc As WRD.Document = wApp.Documents.Open(Path.Combine(Application.StartupPath, "Test1Copy.doc"),, True)
    'Dim dlm As String = vbTab
    TextBox1.Clear()
    If objDoc.Tables.Count >= 1 Then
        Dim wDoc As WRD.Document = wApp.Documents.Add()
        Dim rngDoc = wDoc.Range(Start:=0, End:=0)
        For Each objTable As WRD.Table In objDoc.Tables
            objTable.Range.Copy()
            rngDoc.PasteAndFormat(WRD.WdRecoveryType.wdFormatPlainText)
            wDoc.Range.ConvertToTable()
            For Each rw As WRD.Row In wDoc.Tables(1).Rows
                For j As Integer = 1 To wDoc.Tables(1).Columns.Count
                    TextBox1.AppendText(rw.Cells(j).Range.Text.TrimEnd("_") & vbTab)
                Next
                TextBox1.AppendText(vbCrLf)
            Next
        Next
        wDoc.Close(SaveChanges:=False)
    End If
    wApp.Visible = True
End Sub
Миниатюры
Исключение при обработке таблицы Word с объединёнными ячейками  
2
148 / 70 / 12
Регистрация: 11.02.2017
Сообщений: 310
22.02.2024, 01:00
Для проверки ячейки на форматирование:
VB.NET
1
2
3
4
5
6
7
If cell.Paragraphs(0).MagicText.Count <> 0 Then
    If cell.Paragraphs(0).MagicText(0).formatting.Italic Then
        Debug.WriteLine("Название столбца: " & cell.Paragraphs(0).Text)
    Else
        Debug.WriteLine("Обычные данные: " & cell.Paragraphs(0).Text)
    End If
End If
Кликните здесь для просмотра всего текста
Название столбца: 1
Название столбца: 2
Название столбца: 3
Название столбца: 4
Обычные данные: 5
Обычные данные: 6
Обычные данные: 7
Обычные данные: 8
Обычные данные: 9
Обычные данные: 10
Обычные данные: 11
Обычные данные: 12
Обычные данные: 13
Обычные данные: 14
Обычные данные: 15
Обычные данные: 16
Обычные данные: 17
Обычные данные: 18
Обычные данные: 19
Обычные данные: 20
Обычные данные: 21
Обычные данные: 22
Обычные данные: 23
Название столбца: 1
Название столбца: 2
Название столбца: 3
Название столбца: 4
Обычные данные: 5
Обычные данные: 6
Обычные данные: 7
Обычные данные: 8
Обычные данные: 9
Обычные данные: 10
Обычные данные: 11
Обычные данные: 12
Обычные данные: 13
Обычные данные: 14
Обычные данные: 15
Обычные данные: 16
Обычные данные: 17
Обычные данные: 18
Обычные данные: 19
Обычные данные: 20
Миниатюры
Исключение при обработке таблицы Word с объединёнными ячейками  
1
2 / 2 / 0
Регистрация: 21.02.2024
Сообщений: 3
04.03.2024, 14:45  [ТС]
Хочу выразить всем откликнувшимся огромную благодарность!
С вашей помощью мне удалось получить вот такую программу. С помощью данного кода можно в документе word прочитать таблицу. Все данные с ячеек записываются в список.
Полная рабочая программа:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
Imports System
Imports System.Collections.Generic
Imports System.IO
 
'C:\Users\Admin\Desktop\test2.docx
Module Program
    Sub Main()
        Dim objWord As Object
        Dim objDoc As Object
 
        Console.WriteLine("Введите путь к файлу Word:")
        Dim filePath As String = Console.ReadLine()
 
        Try
            ' Создаем объект приложения Word
            objWord = CreateObject("Word.Application")
 
            ' Открываем документ Word
            objDoc = objWord.Documents.Open(filePath)
 
            Call readWord(objDoc)
 
            ' Закрываем документ Word
            objDoc.Close()
            ' Закрываем приложение Word
            objWord.Quit()
 
            ' Освобождаем ресурсы
            objDoc = Nothing
            objWord = Nothing
 
        Catch ex As Exception
            Console.WriteLine("Произошла ошибка: " & ex.Message)
        End Try
    End Sub
 
 
    'Читам таблицу ворд и возвращаем список с значениями таблицы
    Function readWord(objDoc)
        Dim tableData As New List(Of String)()
 
        Try
 
 
            ' Перебираем все таблицы в документе
            For Each objTable In objDoc.Tables
                ' Переменная для хранения названия иерархии в текущей строке
                Dim hierarchyName As String = ""
 
                ' Перебираем строки таблицы
                For Each row In objTable.Rows
                    ' Проверяем, что есть хотя бы одна ячейка в строке
                    If row.Range.Cells.Count > 0 Then
                        ' Получаем первую ячейку в строке
                        Dim firstCell As Object = row.Range.Cells(1)
 
                        ' Если строка содержит только одну ячейку, то считаем её названием иерархии
                        If row.Range.Cells.Count = 1 Then
                            hierarchyName = row.Range.Text.Trim()
 
                        Else
                            ' Иначе, если переменная hierarchyName не пуста, добавляем её в список
                            If hierarchyName <> "" Then
                                tableData.Add("Название иерархии: " & hierarchyName)
                                hierarchyName = ""
                            End If
 
                            ' Перебираем все ячейки в строке, начиная со второй
                            For i = 1 To row.Range.Cells.Count
                                Dim cell As Object = row.Range.Cells(i)
                                If cell.Range.Font.Italic = True Then
                                    ' Если шрифт курсивом, то это название столбца
                                    tableData.Add("Название столбца: " & cell.Range.Text)
                                Else
                                    ' Выводим обычные данные
                                    tableData.Add("Обычные данные: " & cell.Range.Text.Trim())
                                End If
                            Next i
                        End If
                    End If
                Next row
            Next objTable
 
 
 
            ' Выводим сохраненные данные
            For Each item In tableData
                Console.WriteLine(item)
            Next
        Catch ex As Exception
            Console.WriteLine("Произошла ошибка: " & ex.Message)
        End Try
 
        Return tableData
 
    End Function
 
End Module
Добавлено через 4 минуты
Спасибо большое за ответ!
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.03.2024, 14:45
Помогаю со студенческими работами здесь

Выделение шапки таблицы с объединёнными ячейками
Добрый день! Макросом хочу пройтись по всем таблицам документа и сделать выделение шапки жирным, но есть таблицы, где в шапке есть...

Данные из таблицы с объединенными ячейками в Массив
Добрый день! Товарищи, прошу помощи: Есть таблица в Excel, я копирую данную область (только видимые ячейки) и засовываю их в...

Заполнение таблицы из другой таблицы с объединенными ячейками
Добрый день! Прошу подсказать в решении подобной задачи. Необходимо заполнить &quot;ТАБЛ 2. Карточка продукта&quot; из &quot;ТАБЛ...

Поиск по выделенным ячейкам таблицы. С объединёнными ячейками
К примеру есть таблица из 10 строк и 10 столбцов. Ячейки первого столбца объедены в один. В ячейках кроме первого столбца может бать...

Excel скопировать данные из таблицы с объединенными ячейками
Есть таблица excel с объединенными ячейками (после экспорта). Нужно скопировать её так, что бы каждая ячейка была простой (не...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru