Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Создание этикетки товара в .doc из данных в xls (http://forum.oszone.net/showthread.php?t=326812)

zhuk09 16-05-2017 13:39 2737229

Создание этикетки товара в .doc из данных в xls
 
Добрый день коллеги!
Есть небольшая задача.
В документе формата .doc есть шаблон этикетки с динамическими полями. Эти поля должны заполняться из файла .xls.
Вот так выглядит этикетка (желтым помечены динамические поля)

А так выглядит файл .xls

Таких этикеток обычно от 500 до 700 штук.
Готов оценить работу в $)) Скажите "сколько вешать в граммах")))

Kazun 16-05-2017 14:29 2737239

Заменить места, куда должно подставляться на значения [[Number]],[[RollN]],[[VCode]],[[RLength]]
Формат: wdFormatDocument97
Название файла: Номер рулона.doc

Наличие Word,Excel, PowerShell 2+:

Код:

# Входные файлы
$fWord = "C:\Doc\MyTemplate.doc"
$tmpPath = "C:\Doc\"
$fExcel = "C:\Doc\File.xls"

# Параметры замены
$ReplaceAll = 2
$FindContinue = 1
$MatchCase = $False
$MatchWholeWord = $True
$MatchWildcards = $False
$MatchSoundsLike = $False
$MatchAllWordForms = $False
$Forward = $True
$Wrap = $FindContinue
$Format = $False


$MSWord = New-Object -ComObject Word.Application
$MSExcel = New-Object -ComObject Excel.Application
$MSExcel.DisplayAlerts = $False
$wb = $MSExcel.Workbooks.Open($fExcel)
$ws = $wb.Worksheets.Item(1)

#Количество строк
$mainRng = $ws.UsedRange.Cells
$xRow = $mainRng.Rows.Count 

for($i=2; $i -le $xRow; $i++)
{
        $MSWord.Documents.Open($fWord)
               
        #[[Number]]
        $FindText = "[[Number]]"
        $ReplaceText = $ws.Cells.Item($i,4).Value2
        $MSWord.Selection.Find.Execute($FindText, $MatchCase, $MatchWholeWord, $MatchWildcards, $MatchSoundsLike, $MatchAllWordForms, $Forward, $Wrap, $Format, $ReplaceText, $ReplaceAll)
       
        #[[RollN]]
        $FindText = "[[RollN]]"
        $ReplaceText = $ws.Cells.Item($i,1).Value2 
        $MSWord.Selection.Find.Execute($FindText, $MatchCase, $MatchWholeWord, $MatchWildcards, $MatchSoundsLike, $MatchAllWordForms, $Forward, $Wrap, $Format, $ReplaceText, $ReplaceAll)

        #[[VCode]]
        $FindText = "[[VCode]]"
        $ReplaceText = $ws.Cells.Item($i,3).Value2 
        $MSWord.Selection.Find.Execute($FindText, $MatchCase, $MatchWholeWord, $MatchWildcards, $MatchSoundsLike, $MatchAllWordForms, $Forward, $Wrap, $Format, $ReplaceText, $ReplaceAll)
       
        #[[RLength]]
        $FindText = "[[RLength]]"
        $ReplaceText = $ws.Cells.Item($i,2).Value2
        $MSWord.Selection.Find.Execute($FindText, $MatchCase, $MatchWholeWord, $MatchWildcards, $MatchSoundsLike, $MatchAllWordForms, $Forward, $Wrap, $Format, $ReplaceText, $ReplaceAll)
       

        $saveFormat = [Microsoft.Office.Interop.Word.WdSaveFormat]::wdFormatDocument97
        $path = Join-Path $tmpPath "$($ws.Cells.Item($i,1).Value2).doc"
        $MSWord.ActiveDocument.SaveAs([ref]$path, [ref]$saveFormat)

        $MSWord.Documents.Close()


$MSWord.Quit()
$MSExcel.Quit()

[System.Runtime.InteropServices.Marshal]::ReleaseComObject($MSExcel)
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($MSWord)


Iska 16-05-2017 15:00 2737249

zhuk09, Ваша задача, в принципе, решается и без программирования, обычным слиянием.

zhuk09 16-05-2017 17:40 2737280

Цитата:

Цитата Kazun
Заменить места, куда должно подставляться на значения [[Number]],[[RollN]],[[VCode]],[[RLength]]
Формат: wdFormatDocument97
Название файла: Номер рулона.doc »

Завтра буду пробовать!
Спасибо огромное за оперативный ответ)! Если что-то не получится, обязательно напишу)

Цитата:

Цитата Iska
Ваша задача, в принципе, решается и без программирования, обычным слиянием. »

Можно об этом по подробней?!

Iska 16-05-2017 17:59 2737287

Цитата:

Цитата zhuk09
Модно об этом по подробней?! »

Модно у меня навряд ли получится, тут талант нужо́́н :).

В принципе, тут ничего особо не изменилось за последние четверть века: готовится источник данных (другой документ Word с таблицей, таблица Excel, база данных Access, SQL, текстовый файл и т.п.), готовится основной документ слияния Word, в нём расставляются поля слияния, затем выполняются определённые действия над ним по слиянию, полученный результат либо сразу распечатывается, либо сохраняется, либо рассылается по почте. Отличия в мелких деталях, да в интерфейсе в зависимости от используемой версии Microsoft Office.

Например: Слияние данных MS Excel и MS Word - Интеграция Excel с другими приложениями - Эффективная работа в Excel - Статьи об Excel - Мир MS Excel — только в Вашем случае, возможно, выбор наклеек вместо писем будет лучшим вариантом. Принципиальной разницы нет, но наклеек на одном листе сразу может быть несколько — скажем, если Вы их печатаете.

Создание и печать наклеек с помощью слияния - Word
Слияние с использованием таблицы Excel - Word
и т.п.

zhuk09 17-05-2017 13:21 2737512

Цитата:

Цитата Iska
Модно у меня навряд ли получится, тут талант нужо́́н . »

У Вас получилось очень круто)))
Цитата:

Цитата Iska
Принципиальной разницы нет, но наклеек на одном листе сразу может быть несколько — скажем, если Вы их печатаете. »

Тут все дело в том, что наклеек действительно можно сделать несколько на одном листе, НО проблема в том, что наклейки эти все одинаковые.
Меняются наклейки только на следующем листе))

Iska 17-05-2017 13:37 2737525

zhuk09, тогда Вы явно выбирали не наклейки, потому как при выборе варианта «Наклейки» в каждую запись макета кроме последней добавляется поле Word «NEXT», вызывающее переход к новой записи источника данных:
Скрытый текст
Скрытый текст

В принципе, и сейчас ничто не мешает Вам добавить поля NEXT в макет в конец каждой наклейки (кроме последней) «ручками».

zhuk09 17-05-2017 16:25 2737555

Цитата:

Цитата Iska
В принципе, и сейчас ничто не мешает Вам добавить поля NEXT в макет в конец каждой наклейки (кроме последней) «ручками». »

На первой странице получилось добиться 3-х (трех разных) наклеек на одном листе. Но на 2-м листе происходит какой-то "ШВАХХХХ"
Вот так выглядит структура этикетки
Скрытый текст

Так Выглядит структура данных. В частности интересуют номера от 1 до 4
Скрытый текст

Теперь переходим к этикеткам. Стр.№1
Скрытый текст

И самая ВАЖНАЯ стр.№2
Скрытый текст


Вот такую неразбериху мы получаем на 2-ой и последующих страницах. Т.е по этой логике получается, что команда NEXT на следующей странице работает от данных, которые были в первой этикетке)!

Iska 17-05-2017 17:22 2737569

zhuk09, тогда попробуйте заново с начала, выбрав типом документа именно Наклейки:
Скрытый текст

В крайнем случае, упакуйте образец документа с шаблоном и таблицу в архив, каковой приложите к сообщению, либо выложите на RGhost или Яндекс.Диск.

zhuk09 18-05-2017 13:50 2737792

Вложений: 3
Iska, добрый день!
И так, если в процессе слияния выбирать типом документа наклейка
Скрытый текст

то в дальнейшем возможны 2 варианта событий
1.
а) Изменить макет документа. В процессе этого будет создан новый файл с заданным нами макетом
Скрытый текст

б) заполнить поля слияния
Скрытый текст

Файл во вложении 111111.docx

2.
а)В выборе документа указать "Существующий документ".
Скрытый текст

б) заполнить поля слияния
Скрытый текст

Файл во вложении 222222.docx

Iska 18-05-2017 16:40 2737849

Вложений: 1
У Вас исходный файл — тихий ужас.

Кучу из сгруппированных надписей, автофигур и рисунка нужно по возможности превратить в текст. Первым делом убираем группировку. Затем переносим весь текст из надписей в новосозданную таблицу подходящих размеров. Знак ЕАС хорошо бы тоже было написать обычным текстом, но беглый поиск показал, что подходящего шрифта не наблюдается, посему идём на Wikipedia, берём оттуда EAC-black-on-white.gif, сохраняем и затем вставляем в нашу таблицу, разбив для этого одну строку на две строки, и затем разбив верхнюю строку на два столбца. Расположение вставленного в первую ячейку рисунка оформляем как «В тексте». Расставляем поля слияния и поле NEXT. В итоге получаем примерно такую картинку:
Скрытый текст

Дублируем имеющиеся две строки нашего документа дважды (дабы получилось шесть строк), в последней убираем поле NEXT:
Скрытый текст

Далее, как обычно, связываем документ с источником и делаем слияние:
Скрытый текст

На что здесь нужно обратить внимание?

Первое — это то, что при извлечении поля M из таблицы Excel данные извлекаются «честно», без корректировки. Что это означает? Не все десятичные дроби могут быть точно представлены в двоичном виде. Excel учитывает данный факт при их вводе и делает корректировку при отображении. Word же извлекает данные значения «как есть». Проще всего заранее преобразовывать в таблице Excel данные числа в текст.

Второе — в таблице Excel использован диапазон вплоть до D564, и Word так же честно извлекает все данные из него (у меня получилось 188 страниц :)). Выход — либо вообще не заполнять эти строки в Excel при формировании таблицы, либо удалять эти лишние строки в Excel, либо ограничивать диапазон при слиянии, либо задавать ограничивающее условие при слиянии. Можете использовать любой вариант на выбор.

Архив с исправленными исходными и результирующим файлами Наименование продукции.doc, A057173 DPL.xls, EAC-black-on-white.gif и Результат слияния.doc: Файл 145750.

zhuk09 19-05-2017 17:25 2738092

Цитата:

Цитата Iska
У Вас исходный файл — тихий ужас. »

С тем что предоставили пришлось работать!))) Особенно выбора не было...
Цитата:

Цитата Iska
Кучу из сгруппированных надписей, автофигур и рисунка нужно по возможности превратить в текст. Первым делом убираем группировку. Затем переносим весь текст из надписей в новосозданную таблицу подходящих размеров »

Вот за это отдельное человеческое спасибо! все получилось просто как "Конфетка")))
Цитата:

Цитата Iska
Архив с исправленными исходными и результирующим файлами Наименование продукции.doc, A057173 DPL.xls, EAC-black-on-white.gif и Результат слияния.doc: Пример слияния.7z. »

Тут еще раз могу Вас поблагодарить за проделанную работу. Спасибо!!!

Но у меня остался вопрос по поводу файла 111111.docx, который был создан как изменение макета текущего документа. Ведь в этом файле нет ни каких сгруппированных надписей и автофигур. Там просто текст!
Что там не так?! Или там так же в последних данных надо убрать правило "NEXT"???

Iska 20-05-2017 01:28 2738148

Цитата:

Цитата zhuk09
С тем что предоставили пришлось работать!))) Особенно выбора не было... »

Охотно верю. После FineReader'а зачастую проще самому взять линейку и ручками перенабрать с нуля заново. А ещё сложнее объяснить, что вот это — «тык-тык-тык и всё готово» — на самом деле годно только для мусорной корзины.

Цитата:

Цитата zhuk09
Но у меня остался вопрос по поводу файла 111111.docx, который был создан как изменение макета текущего документа. Ведь в этом файле нет ни каких сгруппированных надписей и автофигур. Там просто текст! Что там не так?! »

Там всё так. Я просто до него не добрался после того, как поглядел на 222222.docx. Разве что я бы разместил NEXT'ы не в начале следующей порции, а в конце текущей порции данных.

Цитата:

Цитата zhuk09
Или там так же в последних данных надо убрать правило "NEXT"??? »

Нет, там нормально, после последней на листе порции данных NEXT нету.


Время: 22:53.

Время: 22:53.
© OSzone.net 2001-