Использование win32com для объединения и разъединения ячеек

Все,

У меня есть таблица в документе Word, которая содержит объединенные ячейки. Я хочу разъединить эти ячейки с помощью пакета win32com.

Примером этого является случай, когда ROW 1 содержит 5 ячеек, а ROW 2 содержит 6 ячеек.

В идеале я хотел бы разъединить все объединенные ячейки в ROW 1, чтобы необъединенные ячейки выровнялись с ROW 2 и чтобы данные отображались в самой левой ячейке результирующего неслитного диапазона.

Пример:

(объединено)

+++++++++++++++++++++++++++++++++++++
|hi   |bye  |     |Hello      |none |
+++++++++++++++++++++++++++++++++++++
|1    |21   |23   |good |bye  |3    |
+++++++++++++++++++++++++++++++++++++

(Не объединено)

+++++++++++++++++++++++++++++++++++++
|hi   |bye  |     |Hello|     |none |
+++++++++++++++++++++++++++++++++++++
|1    |21   |23   |good |bye  |3    |
+++++++++++++++++++++++++++++++++++++

В таблице с объединенными ячейками всего 11 ячеек. В необъединенной таблице есть 12 ячеек.

Есть идеи, как это сделать. Документации по модулю win32com довольно мало, и то немногое, что существует, заблокировано, пока я на работе.

Помощь будет принята с благодарностью.

+++--------------------------------------------------------------------------+++

Дополнительные сведения:

Я ввожу свои данные следующим образом:

#Opens an instance of MS Word in the background, then accesses the referenced
#file.

path = "string containing directory name"

Word = win32.Dispatch("Word.Application")
Word.Visible = False
Word.Documents.Open(path)

#Creates a com element containing access to the document contents of the file referenced above
MT_doc = Word.ActiveDocument

Затем я извлекаю таблицы из файла, используя следующий код:

#Determins the number of tables in the Word Document and outputs a table
#element to "table"
num_tables = MT_doc.Tables.Count
table = MT_doc.Tables

Где я застреваю, так это:

table(1).Rows(1).Cells.Count != table(1).Rows(2).Cells.Count

В этом случае в первой строке 10 ячеек, а во второй строке 18 ячеек. Без возможности разделить эти объединенные ячейки остальная часть моего кода не выполняется.


person aacealo    schedule 26.09.2016    source источник


Ответы (2)


Я нашел решение своей проблемы. После долгих поисков оказалось, что таблицы, встроенные в MS Word, НЕ имеют связанного с ними свойства «слияния». Однако у них есть свойство «ширина», связанное с ними. Получение этого с помощью win32com выглядит примерно так:

#See above for definition of "table" - it's just a win32com COM module
#containing all the tables inside of an MS Word document.
width = table(1).Rows(1).Cells(i).Width

Это возвращает тип (ширина) = float для каждой ячейки. Это значение можно сравнить со значением ширины любой ячейки выше или ниже по мере необходимости. Если значение ширины любой рассматриваемой ячейки НЕ равно ширине ячейки выше или ниже, то вы знаете, что данная ячейка отформатирована таким образом, что существует вероятность того, что встроенная таблица будет содержать ячейку, отформатированную так же, как мой исходный пример расположения ячеек. Перебирая ячейки выше или ниже, можно складывать ширины этих ячеек, пока они не станут равными или приблизительно равными друг другу. Для моего кода ячейки должны быть равны в пределах одного целочисленного значения друг друга. Это достигается с помощью функции round(), чтобы избежать сценария, когда человек открывает документ Word, случайно изменяет ширину одной ячейки, а затем фиксирует ширину этой ячейки только на глаз [это случилось со мной изначально, и это было потому, что Я случайно установил ширину всех ячеек в моем файле на ширину = 60. Когда я исправил макет таблицы, я не совсем вернул одну ячейку туда, где она была].

Реализация обсуждаемого кода довольно длинна и несколько специфична для моей конкретной проблемы. Тем не менее, концепция использования ширины ячейки, а не какого-либо «объединенного» свойства ячейки, широко применима и должна быть полезным подходом для других с аналогичными проблемами.

person aacealo    schedule 27.09.2016

Вы можете достичь этого, например:

table.Rows[0].Cells[0].Merge(table.Rows[1].Cells[0])
person Emil Tulbaev    schedule 12.12.2016