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

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

define function !!DocxTable( !start is boolean, !merge is boolean, !tmpl is string, !docx is string, !tname is string, !data is array, !rtext is array ) is boolean
	--===================================================================
	-- пропуск если процесс CsvToDocxTable.exe уже запущен
	-- if !!GetProcessCount(|CsvToDocxTable|).gt( 0 ) then
		-- !!Alert.Message(|Документ в обработке, дождитесь окончания|)
		-- return false
	-- endif
	--===================================================================
	var !pdmsuser evar |PDMSUSER|
	!csvDirectory = object File( !pdmsuser & |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
	!guid = ||
	-- подготовка .csv файла
	do !i from 1 to 100
		!csvName = !csvDirectory & |\| & !guid & !tname
		!csv = object file( !csvName )
		if !csv.exists() then
			-- уникальный ID
			!guid = !!IntToStrWZero( !i, 3 ) & |_|
			skip
		endif
		!csv.writefile(|OVERWRITE|, !csvData )
			handle any
				!name = !csv.name()
				!!alert.message(!!format(|Файл данных занят: \n $!<name>|))
				return false
			elsehandle none
				-- csv данных создан (после использования подчищает CsvToDocxTable.exe)
				break
			endhandle
	enddo
	--===================================================================
	!docxName = !docx
	--
	!file = object file( !docx )
	!docxDirectory = !file.directory().fullname() & '\'
	!dname = !file.fullname().after( !docxDirectory )
	--
	!guid = ||
	do !i from 1 to 100	
		!docxName = !docxDirectory & |\| & !guid & !dname
		!docxFile = object file( !docxName )
		if !docxFile.exists() then
			-- уникальный ID
			!guid = !!IntToStrWZero( !i, 3 ) & |_|
			skip
		endif
		!docxFile.writefile(|OVERWRITE|, array() )
			handle any
				!name = !docxFile.fullname()
				!!alert.message(!!format(|Закройте документ: \n $!<name>|))
				syscom |"$!<name>" &|
				return false
			elsehandle none
				-- csv данных создан (после использования подчищает CsvToDocxTable.exe)
				break
			endhandle
	enddo
	--===================================================================
	-- путь к CsvToDocxTable.exe
	!docxtable = !!PML.GetPathName(|docxtable.pmlfnc|)
	!file = object file( !docxtable )
	!CsvToDocx = !file.directory().fullname() & |\CsvToDocxTable.exe|
	$(
        -s старовать word
        -t "D:\tamplate.docx" путь к файлу шаблона
        -d "D:\out.docx" как сохранить документ
        -c путь к csv файлам
			имена .csv файлов == имена таблиц в docx шаблоне (Свойства таблицы - Замещающий текст - Заголовок)
			1 строка - строка с ключами ( %1% столбец в .csv => %1% столбец в .docx таблице ) 
        -r "AAA" "BBB" "BBB" "123" текст для замены ("AAA" => "BBB" / "BBB" => "123")       
	$)
	!ca = array()
	-- путь к CsvToDocxTable.exe
	!ca.append(!CsvToDocx)
	-- шаблон
	!ca.append(|-t|)
	!ca.append(|"| & !tmpl & |"|)
	-- docx
	!ca.append(|-d|)
	!ca.append(|"| & !docxName & |"|)
	-- csv файлы
	!ca.append(|-c|)
	!ca.append(|"| & !csvName & |"|)
	-- текст для замены
	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
	elsehandle none
		-- открыть документ
		--syscom |"$!<docxName>" &|
		return true	
	endhandle
	--
	--===================================================================
endfunction
