Дзен-программист
![]() 122 / 87 / 16
Регистрация: 10.04.2013
Сообщений: 253
|
|
1 | |
Из файла xls/xlsx взять выбранную пользователем строку и создать документ docx10.09.2014, 20:59. Показов 2097. Ответов 16
Метки нет Все метки)
(
Здравствуйте! Возник довольно примитивный вопрос, но никак не получается найти ответ. Можно ли с помощью VBA провернуть следующую схему: из файла .xls/.xlsx с некоторым количеством строк взять выбранную пользователем строку и создать документ .docx, опираясь на данные, хранящиеся в этой строке? Более того: можно ли добавить в файл .docx изображение, путь к которому хранится в одном из полей исходной строки?
Заранее спасибо!
0
|
10.09.2014, 20:59 | |
10.09.2014, 20:59 | |
Ответы с готовыми решениями:
16
Создание файла *.xls (*.xlsx) по заданному пользователем адресу Работа с файлами в формате .doc, .docx, .xls, .xlsx Скрипт поиска слов в любых файлах, в т.ч. docx, doc, xlsx, xls |
Модератор
![]() ![]() |
|
11.09.2014, 09:11 | 2 |
пример в студию(пару строк с картинками)
==== кстати, какой у картинок --размер(типа иконок или солидный)
1
|
![]() 2785 / 717 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
|
|
11.09.2014, 09:41 | 3 |
Можно. Специалисту в VBA для этого понадобится от 15 минут до пары часов времени, включая тестирование. Это при наличии полного ТЗ, исключении всех вопросов, возникающих в процессе написания, наличии файлов примеров для обработки, на которых можно произвести тестирование. На этом форуме вам помогут сделать примерно за 1-2 дня, если дадите людям файлы примеров и полное описание задачи.
1
|
![]() 2785 / 717 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
|
||||||
11.09.2014, 09:47 | 4 | |||||
![]() Решение
Вот пример пары макросов, которые по набору строк в таблице делают по 2-3 документа в Word и Excel, плюс формируют сводный список - опись сгенерированных документов для сопроводительного письма.
Кликните здесь для просмотра всего текста
1
|
Дзен-программист
![]() 122 / 87 / 16
Регистрация: 10.04.2013
Сообщений: 253
|
|
11.09.2014, 16:12 [ТС] | 5 |
shanemac51, данные будут выглядеть примерно так:
Код
A | B | C | D № | Имя | Фамилия | Путь к изображению 1 | Иван | Сидоров | С:\Photo\Img_1.jpg mc-black, спасибо большое за пример! Это, вероятней всего, именно то что нужно. Попробую вечером в нём разобраться, и, если будут вопросы, напишу ещё.
0
|
![]() 2785 / 717 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
|
|
11.09.2014, 16:34 | 6 |
В двух словах - документы .docx мне было проще не создавать с нуля, а использовать специально подготовленный шаблон, который брать за основу, я сделал шаблоны в формате .dotx. Далее, в открытом шаблоне остается автоматом заменить заранее подготовленные поля типа "%username%" на "Иван Иванович Иванов" и так далее. С точки зрения программирования это выглядит очень просто.
0
|
Дзен-программист
![]() 122 / 87 / 16
Регистрация: 10.04.2013
Сообщений: 253
|
|||||||||||
16.09.2014, 01:55 [ТС] | 7 | ||||||||||
mc-black, сделал всё почти как в вашем примере, скрипт запускается, но не работает замена слов-переменных в шаблоне. Шаблон .dotx, всё его содержимое - строка "%username%". Код скрипта:
0
|
Модератор
![]() ![]() |
||||||
16.09.2014, 07:00 | 8 | |||||
Попробуйте так
1
|
Дзен-программист
![]() 122 / 87 / 16
Регистрация: 10.04.2013
Сообщений: 253
|
|
16.09.2014, 10:19 [ТС] | 9 |
shanemac51, да, без директивы Set переменная создаётся, спасибо. Replacement по-прежнему не работает.
0
|
![]() 2785 / 717 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
|
|
16.09.2014, 11:14 | 10 |
Ваш код из 7-го поста выглядит работоспособным (корректным). В шаблоне dotx точно есть кусочек текста %username%? Может написано немного иначе? Прикрепите в сообщении пример файла dotx и файла excel, запаковав из в zip (иначе не прикрепить). Без отладки на данных VBA-код как набор букв, его не выполнить, не разберешься в чем дело. Объявления лишних переменных можно убрать: Dim lr As ListRow, wbk As Workbook, dst As Worksheet
1
|
Дзен-программист
![]() 122 / 87 / 16
Регистрация: 10.04.2013
Сообщений: 253
|
|
16.09.2014, 11:26 [ТС] | 11 |
mc-black, в шаблоне точно есть строка "%username%", копировал прямо из макроса. Более того, после выполнения Selection.Find Execute Replace:=wdReplaceAll свойство Selection.Find.Found устанавливается в True, но замены не происходит. Немного поменял код, но принципиальных изменений нет, он так и не работает.
0
|
Модератор
![]() ![]() |
|
16.09.2014, 11:26 | 12 |
--может в коллонтитуле --или в надписи
0
|
![]() 2785 / 717 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
|
||||||
16.09.2014, 11:46 | 13 | |||||
В объявления надо вставить строку:
Как выловил ошибку? Поставил в начале модуля Option Explicit, начал отладку и сразу выяснилось, что не объявлена переменная wdReplaceAll, а так как всё необъявленное инициализируется нулями, то вышло что вышло. Всем (кроме Catstail) настоятельно рекомендую использовать Option Explicit.
1
|
Дзен-программист
![]() 122 / 87 / 16
Регистрация: 10.04.2013
Сообщений: 253
|
|
16.09.2014, 14:29 [ТС] | 14 |
mc-black, спасибо! Думал, это встроенный параметр: во всех руководствах в такой форме написано.
Теперь осталось добавить изображение, сейчас буду экспериментировать.
0
|
Дзен-программист
![]() 122 / 87 / 16
Регистрация: 10.04.2013
Сообщений: 253
|
|||||||||||
18.09.2014, 21:41 [ТС] | 15 | ||||||||||
mc-black, изображение вставляется, но не удаётся позиционировать его. Пробовал добавить изображение в коллекцию Shapes документа (wrd.Selection.Shapes.AddPicture), выпала ошибка "Run-time error '438': Object doesn't support this property or method". В коллекцию InlineShapes добавляется (wrd.Selection.InlineShapes.AddPicture), но тогда нет возможности добавить позицию и размеры изображения. Также необходимо поместить изображение "за текст", чтобы надписи не сдвигались, для этого использую метод .ConvertToShape объекта изображения; он работает. Весь актуальный код:
P.P.S. После применения .ConvertToShape искомые свойства так и не получается изменить, выпадает ошибка "Run-time error '438': Object doesn't support this property or method", только уже по отношению к выражению pic.Left = 0. Добавлено через 23 часа 45 минут Решение найдено. Судя по всему, объекты в VB обладают странным, на мой взгляд, свойством. При изменении типа объекта через переменную (pic.ConvertToShape), сам объект, будучи частью коллекции, остаётся в документе, и его свойства изменяются, но вот в переменной, через которую мы воздействовали на объект, ссылка на него пропадает. Этим и объясняется то, что огромное количество методов возвращают изменённый объект. Решается проблема просто: создаём дополнительную переменную, и все необходимые операции по позиционированию проводим с ней:
0
|
![]() 4135 / 2239 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
|
|||||||||||
18.09.2014, 22:52 | 16 | ||||||||||
xenohunter, На самом деле, можно использовать Shapes.AddPicture и сразу указывать позицию рисунка. Нужно только вспомнить, что у Shape родитель - это документ, в примере, это doc, а не Selection
1
|
Дзен-программист
![]() 122 / 87 / 16
Регистрация: 10.04.2013
Сообщений: 253
|
|
19.09.2014, 00:49 [ТС] | 17 |
pashulka, да, этого я не знал. Пробовал только обращаться как к объекту приложения Word. Спасибо.
0
|
19.09.2014, 00:49 | |
19.09.2014, 00:49 | |
Помогаю со студенческими работами здесь
17
Бесплатные либы для создания, редактирования PDF, DOCX, XLSX, XLS, DOC и конвертации их между собой В одной учетной записи не открываются файлы *.doc *.xls (При этом все хорошо с *.docx *.xlsx) Как извлечь из XLS-файла заданную строку и записать её в текстовый документ? DataGridView: Как получить выбранную пользователем строку Удалить строку, выбранную пользователем в объекте DataGridView Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
![]() |
Новые блоги и статьи
![]() |
||||
Использование кэша Laravel - полный гайд
bytestream 18.02.2025
Кэширование - один из наиболее эффективных способов повышения производительности веб-приложений. В современном мире, где скорость загрузки страниц напрямую влияет на удержание пользователей и. . .
|
Создаем REST API в Laravel с аутентификацией через Passport
bytestream 18.02.2025
Разработка современных веб-приложений все чаще требует создания надежного и хорошо структурированного API. REST API стал стандартом де-факто для построения взаимодействия между клиентской и серверной. . .
|
Пайплайны в Laravel - полный гайд
bytestream 18.02.2025
Разработка современных веб-приложений часто требует обработки сложных процессов, состоящих из множества последовательных шагов. Например, при создании системы комментариев может потребоваться. . .
|
Как правильно использовать @required в Symfony
bytestream 18.02.2025
При разработке приложений на Symfony мы часто сталкиваемся с необходимостью внедрения зависимостей. Фреймворк предоставляет несколько способов управления этим процессом, и одним из таких инструментов. . .
|
Система безопасности в Laravel: возможности и примеры
Wired 18.02.2025
Каждый день появляются новые виды атак и уязвимостей, которые могут поставить под угрозу конфиденциальные данные пользователей и функционирование всей системы. В этом контексте выбор надежного. . .
|
Давайте сравним Django и Laravel
Wired 18.02.2025
Django и Laravel - два мощных инструмента, которые часто сравнивают между собой. Оба фреймворка предлагают разработчикам богатый набор возможностей для создания масштабируемых веб-приложений, но. . .
|
Laravel или React - что лучше?
Wired 18.02.2025
В разработке веб выбор правильного инструмента часто определяет успех всего проекта. Особенно интересным представляется сравнение Laravel и React - двух популярных технологий, которые часто. . .
|
Laravel 11: новые возможности, гайд по обновлению
Wired 18.02.2025
Laravel 11 - это новая масштабная версия одного из самых популярных PHP-фреймворков, выпущенная в марте 2024 года. Эта версия продолжает традицию внедрения передовых технологий и методологий. . .
|
Миграции в Laravel
Wired 18.02.2025
Разработка веб-приложений на Laravel неразрывно связана с управлением структурой базы данных. При работе над проектом часто возникает необходимость вносить изменения в схему базы данных - добавлять. . .
|
Аутентификация в Laravel
Wired 18.02.2025
В современном мире веб-разработки безопасность пользовательских данных становится критически важным аспектом любого приложения. Laravel, как один из самых популярных PHP-фреймворков, предоставляет. . .
|