-- Марков С.А. 30.07.2018
-- 
-- CsvToDocxTable.exe заполняет таблицы docx шаблона из csv файлов
-- использует Xceed.Words.NET.dll

-- !start	открыть документ
-- !tmpl	docx шаблон
-- !docx	документ для сохранения
-- !tname	имя таблицы в docx шаблоне (Свойства таблицы - Замещающий текст - Заголовок)
-- !data	двумерный массив данных

define function !!DocxTabls( !start is boolean, !merge is boolean, !tmpl is string, !docx is string, !tnams is array, !datas is array, !rtext is array ) is boolean
	!docxName = !docx
	-- подготовка заготовки / зачистка документа
	!docxFile = object file( !docxName )
	!docxFile.open(|OVERWRITE|)
		handle any
			!name = !docxFile.fullname()
			!!alert.message(!!format(|Закройте документ: \n $!<name>|))
			syscom |"$!<name>" &|
			return false
		endhandle
	!docxFile.close()
	--===================================================================
	!csvNams = array()
	do !j from 1 to !tnams.size()
		!tname = !tnams[!j]
		!data  = !datas[!j]
		--===================================================================
		-- пропуск если процесс CsvToDocxTable.exe уже запущен
		-- if !!GetProcessCount(|CsvToDocxTable|).gt( 0 ) then
			-- !!Alert.Message(|Документ в обработке, дождитесь окончания|)
			-- return false
		-- endif
		--===================================================================
		var !pdmsuser evar |PDMSUSER|
		!pdmsuserfile = object file( !pdmsuser )
		!csvDirectory = object File( !pdmsuserfile.fullname() & |\docx_table|)
		-- подготовка директории для .csv файлов
		if !csvDirectory.exists().not() then
			!directory = !csvDirectory.name()
			syscom |mkdir $!<directory>|
		endif	
		--===================================================================
		-- подготовка .csv данных
		!csvData	= array()
		do !row values !data
			!csvData.append( !!ArrayToString( !row, |►| ) )
		enddo
		do !i from 1 to 100
			-- уникальный ID
			!uprefix = !!IntToStrWZero( !i, 3 ) & |_|
			--
			!csvName = !csvDirectory & |\| & !uprefix & !tname & '.csv'
			!csv = object file( !csvName )
			if !csv.exists() then
				skip
			endif
			!csv.writefile(|OVERWRITE|, !csvData )
				handle any
					!name = !csv.name()
					!!alert.message(!!format(|Файл данных занят: \n $!<name>|))
					return false
				elsehandle none
					-- csv данных создан (после использования подчищает CsvToDocxTable.exe)
					!csvNams.append( !csvName )
					break
				endhandle
		enddo
	enddo
	--===================================================================
	-- путь к CsvToDocxTable.exe
	!docxtable = !!PML.GetPathName(|docxtable.pmlfnc|)
	!file = object file( !docxtable )
	!CsvToDocx = !file.directory().fullname() & |\CsvToDocxTable.exe|
	$(
        -t "D:\tamplate.docx" путь к файлу шаблона
        -f "D:\out.docx" как сохранить документ
        -c путь к csv файлам
			имена .csv файлов == имена таблиц в docx шаблоне (Свойства таблицы - Замещающий текст - Заголовок)
			1 строка - строка с ключами ( %1% столбец в .csv => %1% столбец в .docx таблице ) 
        -r "AAA" "BBB" "BBB" "123" текст для замены ("AAA" => "BBB" / "BBB" => "123")
		-d зачистка csv после использования
		-m объединение ячеек (#<# горизонтально / #^# вертикально)
        -s старовать word
	$)
	!ca = array()
	-- путь к CsvToDocxTable.exe
	!ca.append(!CsvToDocx)
	-- шаблон
	!ca.append(|-t|)
	!ca.append(|"| & !tmpl & |"|)
	-- docx
	!ca.append(|-f|)
	!ca.append(|"| & !docxName & |"|)
	-- csv файлы
	if !csvNams.size() gt 0 then
		!ca.append(|-c|)
		do !csvName values !csvNams
			!ca.append(|"| & !csvName & |"|)
		enddo
	endif
	-- удалять csv файлы
	!ca.append(|-d|)
	-- текст для замены
	if !rtext.size() gt 0 then
		!ca.append(|-r|)
		do !rval values !rtext
			!ca.append(|"| & !rval & |"|)
		enddo
	endif
	-- слияние ячеек (- " -)
	if !merge then
		!ca.append(|-m|)
	endif
	-- старт word
	if !start then
		!ca.append(|-s|)
	endif
	-- предупреждение
	-- if !data.size() gt 500 then
		-- !answ = !!alert.confirm(|Формирование Word может занять время.|)
		-- if !answ eq 'NO' then
			-- return false
		-- endif
	-- endif
	-- старт обработки без ожидания
	!command = !!ArrayToString( !ca, | | )
	syscom |$!<command>|
		handle any
			q var !!error
			return false
		endhandle
	-- открыть документ
	--syscom |"$!<docxName>" &|
	return true
endfunction
