Показать полную графическую версию : [решено] Создание этикетки товара в .doc из данных в xls
Добрый день коллеги!
Есть небольшая задача.
В документе формата .doc есть шаблон этикетки с динамическими полями. Эти поля должны заполняться из файла .xls.
Вот так выглядит этикетка (желтым помечены динамические поля)
http://s016.radikal.ru/i337/1705/eb/81b0032ed54d.jpg (http://radikal.ru)
А так выглядит файл .xls
http://s019.radikal.ru/i628/1705/a8/ab886edc002b.jpg (http://radikal.ru)
Таких этикеток обычно от 500 до 700 штук.
Готов оценить работу в $)) Скажите "сколько вешать в граммах")))
Заменить места, куда должно подставляться на значения [[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)
zhuk09, Ваша задача, в принципе, решается и без программирования, обычным слиянием.
Заменить места, куда должно подставляться на значения [[Number]],[[RollN]],[[VCode]],[[RLength]]
Формат: wdFormatDocument97
Название файла: Номер рулона.doc »
Завтра буду пробовать!
Спасибо огромное за оперативный ответ)! Если что-то не получится, обязательно напишу)
Ваша задача, в принципе, решается и без программирования, обычным слиянием. »
Можно об этом по подробней?!
Модно об этом по подробней?! »
Модно у меня навряд ли получится, тут талант нужо́́н :).
В принципе, тут ничего особо не изменилось за последние четверть века: готовится источник данных (другой документ Word с таблицей, таблица Excel, база данных Access, SQL, текстовый файл и т.п.), готовится основной документ слияния Word, в нём расставляются поля слияния, затем выполняются определённые действия над ним по слиянию, полученный результат либо сразу распечатывается, либо сохраняется, либо рассылается по почте. Отличия в мелких деталях, да в интерфейсе в зависимости от используемой версии Microsoft Office.
Например: Слияние данных MS Excel и MS Word - Интеграция Excel с другими приложениями - Эффективная работа в Excel - Статьи об Excel - Мир MS Excel (http://www.excelworld.ru/publ/hacks/integration/excel_with_other_office/58-1-0-127) — только в Вашем случае, возможно, выбор наклеек вместо писем будет лучшим вариантом. Принципиальной разницы нет, но наклеек на одном листе сразу может быть несколько — скажем, если Вы их печатаете.
Создание и печать наклеек с помощью слияния - Word (https://support.office.com/ru-ru/article/%d0%a1%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b8-%d0%bf%d0%b5%d1%87%d0%b0%d1%82%d1%8c-%d0%bd%d0%b0%d0%ba%d0%bb%d0%b5%d0%b5%d0%ba-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c%d1%8e-%d1%81%d0%bb%d0%b8%d1%8f%d0%bd%d0%b8%d1%8f-276a2cd1-74d2-43d0-ab5a-b90460358ad5?ui=ru-RU&rs=ru-RU&ad=RU)
Слияние с использованием таблицы Excel - Word (https://support.office.com/ru-ru/article/%D0%A1%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5-%D1%81-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B-Excel-858c7d7f-5cc0-4ba1-9a7b-0a948fa3d7d3)
и т.п.
Модно у меня навряд ли получится, тут талант нужо́́н . »
У Вас получилось очень круто)))
Принципиальной разницы нет, но наклеек на одном листе сразу может быть несколько — скажем, если Вы их печатаете. »
Тут все дело в том, что наклеек действительно можно сделать несколько на одном листе, НО проблема в том, что наклейки эти все одинаковые.
Меняются наклейки только на следующем листе))
zhuk09, тогда Вы явно выбирали не наклейки, потому как при выборе варианта «Наклейки» в каждую запись макета кроме последней добавляется поле Word «NEXT», вызывающее переход к новой записи источника данных:
http://i.imgur.com/Zo0y0sE.pnghttp://i.imgur.com/qCvAfzI.png
В принципе, и сейчас ничто не мешает Вам добавить поля NEXT в макет в конец каждой наклейки (кроме последней) «ручками».
В принципе, и сейчас ничто не мешает Вам добавить поля NEXT в макет в конец каждой наклейки (кроме последней) «ручками». »
На первой странице получилось добиться 3-х (трех разных) наклеек на одном листе. Но на 2-м листе происходит какой-то "ШВАХХХХ"
Вот так выглядит структура этикетки
http://s019.radikal.ru/i642/1705/6e/77dcb16fb450.jpg (http://radikal.ru)
Так Выглядит структура данных. В частности интересуют номера от 1 до 4
http://s018.radikal.ru/i514/1705/b0/412094b9e626.jpg (http://radikal.ru)
Теперь переходим к этикеткам. Стр.№1
http://s018.radikal.ru/i508/1705/cd/2229af8d0341.jpg (http://radikal.ru)
И самая ВАЖНАЯ стр.№2
http://s019.radikal.ru/i638/1705/50/f50ba6548248.jpg (http://radikal.ru)
Вот такую неразбериху мы получаем на 2-ой и последующих страницах. Т.е по этой логике получается, что команда NEXT на следующей странице работает от данных, которые были в первой этикетке)!
zhuk09, тогда попробуйте заново с начала, выбрав типом документа именно Наклейки:
http://i.imgur.com/cUOjgQv.png
В крайнем случае, упакуйте образец документа с шаблоном и таблицу в архив, каковой приложите к сообщению, либо выложите на RGhost или Яндекс.Диск.
Iska, добрый день!
И так, если в процессе слияния выбирать типом документа наклейка
http://s019.radikal.ru/i617/1705/a4/b52781b55cd1.jpg (http://radikal.ru)
то в дальнейшем возможны 2 варианта событий
1.
а) Изменить макет документа. В процессе этого будет создан новый файл с заданным нами макетом
http://s019.radikal.ru/i627/1705/2f/5044f63aa20d.jpg (http://radikal.ru)
б) заполнить поля слияния
http://s019.radikal.ru/i629/1705/2f/8b284c0208b7.jpg (http://radikal.ru)
Файл во вложении 111111.docx
2.
а)В выборе документа указать "Существующий документ".
http://s019.radikal.ru/i629/1705/ca/b56cebe0c321.jpg (http://radikal.ru)
б) заполнить поля слияния
http://s018.radikal.ru/i510/1705/75/28751f54cee7.jpg (http://radikal.ru)
Файл во вложении 222222.docx
У Вас исходный файл — тихий ужас.
Кучу из сгруппированных надписей, автофигур и рисунка нужно по возможности превратить в текст. Первым делом убираем группировку. Затем переносим весь текст из надписей в новосозданную таблицу подходящих размеров. Знак ЕАС хорошо бы тоже было написать обычным текстом, но беглый поиск показал, что подходящего шрифта не наблюдается, посему идём на Wikipedia, берём оттуда EAC-black-on-white.gif, сохраняем и затем вставляем в нашу таблицу, разбив для этого одну строку на две строки, и затем разбив верхнюю строку на два столбца. Расположение вставленного в первую ячейку рисунка оформляем как «В тексте». Расставляем поля слияния и поле NEXT. В итоге получаем примерно такую картинку:
http://i.imgur.com/0ZFldUS.png
Дублируем имеющиеся две строки нашего документа дважды (дабы получилось шесть строк), в последней убираем поле NEXT:
http://i.imgur.com/ry2edfN.png
Далее, как обычно, связываем документ с источником и делаем слияние:
http://i.imgur.com/E8Jirvn.png
На что здесь нужно обратить внимание?
Первое — это то, что при извлечении поля M из таблицы Excel данные извлекаются «честно», без корректировки. Что это означает? Не все десятичные дроби могут быть точно представлены в двоичном виде. Excel учитывает данный факт при их вводе и делает корректировку при отображении. Word же извлекает данные значения «как есть». Проще всего заранее преобразовывать в таблице Excel данные числа в текст.
Второе — в таблице Excel использован диапазон вплоть до D564, и Word так же честно извлекает все данные из него (у меня получилось 188 страниц :)). Выход — либо вообще не заполнять эти строки в Excel при формировании таблицы, либо удалять эти лишние строки в Excel, либо ограничивать диапазон при слиянии, либо задавать ограничивающее условие при слиянии. Можете использовать любой вариант на выбор.
Архив с исправленными исходными и результирующим файлами Наименование продукции.doc, A057173 DPL.xls, EAC-black-on-white.gif и Результат слияния.doc: 145750.
У Вас исходный файл — тихий ужас. »
С тем что предоставили пришлось работать!))) Особенно выбора не было...Кучу из сгруппированных надписей, автофигур и рисунка нужно по возможности превратить в текст. Первым делом убираем группировку. Затем переносим весь текст из надписей в новосозданную таблицу подходящих размеров »
Вот за это отдельное человеческое спасибо! все получилось просто как "Конфетка")))Архив с исправленными исходными и результирующим файлами Наименование продукции.doc, A057173 DPL.xls, EAC-black-on-white.gif и Результат слияния.doc: Пример слияния.7z. »
Тут еще раз могу Вас поблагодарить за проделанную работу. Спасибо!!!
Но у меня остался вопрос по поводу файла 111111.docx, который был создан как изменение макета текущего документа. Ведь в этом файле нет ни каких сгруппированных надписей и автофигур. Там просто текст!
Что там не так?! Или там так же в последних данных надо убрать правило "NEXT"???
С тем что предоставили пришлось работать!))) Особенно выбора не было... »
Охотно верю. После FineReader'а зачастую проще самому взять линейку и ручками перенабрать с нуля заново. А ещё сложнее объяснить, что вот это — «тык-тык-тык и всё готово» — на самом деле годно только для мусорной корзины.
Но у меня остался вопрос по поводу файла 111111.docx, который был создан как изменение макета текущего документа. Ведь в этом файле нет ни каких сгруппированных надписей и автофигур. Там просто текст! Что там не так?! »
Там всё так. Я просто до него не добрался после того, как поглядел на 222222.docx. Разве что я бы разместил NEXT'ы не в начале следующей порции, а в конце текущей порции данных.
Или там так же в последних данных надо убрать правило "NEXT"??? »
Нет, там нормально, после последней на листе порции данных NEXT нету.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.