Что нового

Добавление строк в таблицу Word документа

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Возникла необходимость добавлять данные в таблицу docx файла.
В документе имеется обычная таблица из 7-и ячеек, нужно каким то образом добавлять в эту таблицу строки, данные берутся с массива.

С библиотекой _Word* особо не работал, по примерам из справки пробовал реализовать задумку, но безрезультатно.

П.С
Желательно это делать не открывая самого документа, т.е чтобы не было окон и процесс добавления проходил максимально скрытно.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
CreatoR

На docx возможности проверить нет(
Код:
Global $oWordApp = ObjCreate('Word.Application')

$oWordApp.visible = 0
$oWordApp.Documents.Open(@ScriptDir & "\1.doc")

Local $rows, $columns
$rows = $oWordApp.Activedocument.Tables(1).Rows.Count ; получаем кол-во строк и столбцов 1-й таблицы в документе
$columns = $oWordApp.Activedocument.Tables(1).Columns.Count


For $i = 1 To $rows
	For $j = 1 To $columns
		$oWordApp.Activedocument.Tables(1).Cell($i, $j).Range.Text = $i & "," & $j
	Next
Next

Sleep(3000)

$oWordApp.visible = 1

;~ Sleep(3000)

;~ $oWordApp.Documents.close
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
WSWR
Спасибо, я решил это примерно так же:
Код:
#include <Word.au3>

_WordErrorHandlerRegister()

$oWord = _WordCreate(@DesktopDir & '\Map.docx', 0, 0, 0)
$oDoc = _WordDocGetCollection($oWord, 0)
$oTable = $oDoc.Tables(1)
$oRows = $oTable.Rows

For $oRow In $oRows
	If StringReplace(StringStripCR($oRow.Range.Text), Chr(7), '') = '' Then
		$oCels = $oRow.Cells
		
		If $oCels.Count > 7 Then
			ContinueLoop
		EndIf
		
		$iC = 0
		Dim $aData[7] = ['User', 'User-PC', 'noname', '4Gb RAM' & @CRLF & '300Gb HDD', '7 Ent', 'Office Ent 2007, Office Project Pro 2007', 'Group Added']
		
		For $oCel In $oCels
			$oCel.Range.Text = $aData[$iC]
			$iC += 1
		Next
		
		ExitLoop
	EndIf
Next

_WordQuit($oWord, -1)


но есть другая проблема - данные не добавляются если нет пустых ячеек.
Нужно как то добавлять новую строку в таблице с тем же количеством колонок что уже имеется, и в неё писать данные.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
CreatoR

Еще на эту тему
UDF _WordEX.au3

http://www.autoitscript.com/forum/topic/142898-update-the-word-udf-that-comes-with-autoit-former-wordex-thread/?p=1005996
Там функции _Word_DocTableRead и _Word_DocTableWrite

Там есть пример

Код:
#include <WordEX.au3>

; Create application object
Global $oWord = _Word_Create()
If @error <> 0 Then Exit MsgBox(16, "Word UDF: _Word_DocTableWrite Example", "Error creating a new Word application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
; Open the test document
Global $oDoc = _Word_DocOpen($oWord, "Test.doc", Default, Default, True)
If @error <> 0 Then Exit MsgBox(16, "Word UDF: _Word_DocTableWrite Example", "Error opening 'Test.doc'." & @CRLF & "@error = " & @error & ", @extended = " & @extended)

Example1($oDoc)

; *****************************************************************************
; Example 1
; Write the content of a two dimensional array to a Word table
; *****************************************************************************
Func Example1($oDoc)

	Local $asArray[3][3] = [[1, 2, 3],["ф", "ф", "ф"],["ф", "ф", "ф"]]
	Local $oRange = _Word_DocRangeSet($oDoc, -2) ; 2-я страница?
	_Word_DocTableWrite($oRange, $asArray)
	If @error <> 0 Then Return MsgBox(16, "Word UDF: _Word_DocTableWrite Example 1", "Error creating the table." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
EndFunc   ;==>Example1

При первом запуске добавляет таблицу, при последующих присоединяет новые ячейки

Можно задать и там такой вопрос автору UDF
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
WSWR [?]
Покопался в библиотеке, вроде получилось сделать то что хотел:

Код:
#include <Word.au3>

_WordErrorHandlerRegister()

$oWord = _WordCreate(@DesktopDir & '\Map.docx', 1, 1, 0)
$oDoc = _WordDocGetCollection($oWord, 0)
$oTable = $oDoc.Tables(1)
$oRows = $oTable.Rows
$oNewRow = $oRows.Add()

Dim $aData[8] = [7, 'User', 'USER-PC', 'noname', '4Gb RAM' & @CRLF & '300Gb HDD', '7 Ent', 'Office Ent 2007, Office Project Pro 2007', 'Group Added']

For $iCel = 1 To $aData[0]
	$oNewRow.Cells($iCel).Range.Text = $aData[$iCel]
Next

;~ _WordQuit($oWord, -1)


но всё же остался небольшой нюанс - строка в таблицу добавляется, но делается это перед последней строкой, т.е чтобы оно работало, у меня в таблице обязательно должна быть последняя пустая строка.

Свойство Add у Rows добавляет перед указанной строкой.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Всё, сделал, нужно было всего лишь опустить параметр у свойства Add, поправил предыдущий пример.
 
Верх