Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2010, 22:17   #1
wendigo
 
Регистрация: 15.01.2010
Сообщений: 6
По умолчанию OLE объект

Подскажите пожалуйста: есть Excel файл с вложенными в него файлами, различных форматов. Нужно вытащить их оттуда и сохранить на диск. Узнать сколько и их и как открыть я знаю, а вот как сохранить?
Заранее спасибо.
wendigo вне форума Ответить с цитированием
Старый 16.01.2010, 00:47   #2
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Сохраните ваш файл в HTML формате. Если файлы внедрены по OLE в
рабочую книгу они найдутся в созданной при сохранении папке.
А вот если ваши файлы помещены в файл EXCEL просто как в контейнер
Ole Storage, то проще всего вытащить их используя плагин для FAR
"DocFile Brouser" Игоря Павлова, применяемый с FAR или Total Commander (http://plugring.farmanager.com/downld/files/fdb102.zip)
Нужен Far c версией не младше 1.65.
Aent вне форума Ответить с цитированием
Старый 18.01.2010, 10:15   #3
wendigo
 
Регистрация: 15.01.2010
Сообщений: 6
По умолчанию

Файлы помещются в excel через обычную вставку объекта. Мне нужно программно (через VBA) разделить их, т.е. иметь отдельно вставленные в него документы и файл (можно с вложениями). Просто существует импорт в базу, но загружать он может лишь табличные данные и отдельно файлы. При сохранении html файлы меняют изначальный формат.( К сожалению ничего стороннего я использовать не могу.
wendigo вне форума Ответить с цитированием
Старый 18.01.2010, 21:18   #4
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Выложите пример файла c такими вложениями.
Непонятно на счёт изменения формата при сохранении в HTML.
Кстати через вставку объекта может просто создаваться связь ...
В любом случае без файла примера непонятно что вам нужно.
Aent вне форума Ответить с цитированием
Старый 19.01.2010, 17:26   #5
wendigo
 
Регистрация: 15.01.2010
Сообщений: 6
По умолчанию

Цитата:
Выложите пример файла c такими вложениями.
Непонятно на счёт изменения формата при сохранении в HTML.
Кстати через вставку объекта может просто создаваться связь ...
В любом случае без файла примера непонятно что вам нужно.
Вот файл, к нему прикреплены 2 файла, не как ссылка. Они открываются в другом месте без проблем, т.е. исходные файлы не нужны. При сохранении его в html формат получается oledata.mso,картинки и xml файлы. Мне нужно вытащить их оттуда аналогично действию "изменить/сохранение содежимого" или любым другим способом на диск, но при помощи VBA, т.к. этот макрос будет вызываться из комплекса задач, не имеющего загрузку вложений excel.
Вложения
Тип файла: rar test.rar (6.4 Кб, 20 просмотров)
wendigo вне форума Ответить с цитированием
Старый 19.01.2010, 19:51   #6
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Дело в том что Excel.OLEObject это НЕ IOLEObject. Это врапер над IOLEObject.
Стандартными средствами обойтись боюсь в вашем случае не получится.
Можно конечно временно через реестр менять стандартный обработчик для типов внедрённых файлов на notepad или word.
Затем используя метод verb объекта OleObject, открывать ваши вложения в этом обработчике как текстовые файлы и используя sendkey или объектную модель Word cохранять их сразу или через Clipboard.
Можно из Excel динамически создавать WSH скрипт который будет сохранять внедрённый файл.
Кстати, эксперимент показал, что по крайней мере в 2007 (в других версиях не проверял)
метод OleObject.Verb понимает вопреки HELP и значения больше 2 Правда получается системозависимое решение.
У меня, например, при .Verb 8 упакованное rar вложение передаётся почтовому клиенту.
Видимо стоит покопать в эту сторону.
Второй путь - разбирать самому на VBA структуру компаунд документа для XLS - ещё более проблематичен.
А вы не можете сохранять ваши тексты в XLS по другому ? Например, в скрытых шейпах листа ?
Чуть усложниться импорт - зато с чтением и сохранением не будет проблем.

Последний раз редактировалось Aent; 19.01.2010 в 21:29.
Aent вне форума Ответить с цитированием
Старый 20.01.2010, 14:46   #7
wendigo
 
Регистрация: 15.01.2010
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Aent Посмотреть сообщение
А вы не можете сохранять ваши тексты в XLS по другому ? Например, в скрытых шейпах листа ?
Чуть усложниться импорт - зато с чтением и сохранением не будет проблем.
В принципе ограничений нет. Если чуть шире о задаче: существует шаблон excel, в который необходимо добавить файлы. Что это будет заранее неизвестно: архив, картинка, документ. Нужно создать пользователю адекватный интерфейс загрузки этих файлов в шаблон и возможность разобрать на отдельные составляющие(excel и вложения) мне, чтобы написать программу для загрузки этого чудовища в нормальную базу.
Ключевые моменты: единый файл шаблона, из которого можно вытащить файлы. Просто фактически на VBA я не пишу, использую только для решения конкретных задач, когда нет других вариантов. Так что буду благодарен если поподробнее изложите.Спасибо.
wendigo вне форума Ответить с цитированием
Старый 20.01.2010, 15:22   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Если чуть шире о задаче: существует шаблон excel, в который необходимо добавить файлы. Что это будет заранее неизвестно: архив, картинка, документ. Нужно создать пользователю адекватный интерфейс загрузки этих файлов в шаблон и возможность разобрать на отдельные составляющие(excel и вложения)
Меня тоже интересует реализация подобной задачи.

Aent, если не сложно, приведите пример, как сохранить (и потом извлечь) некий файл в книге Excel. (тип файла неизвестен, будем считать, что это просто некий набор байтов)

Я, конечно, и сам могу состряпать нечто подобное, тупо записывая отдельные байты в ячейки листа, но, полагаю, есть более элегантные решения задачи (чтобы на листах не хранились лишние данные, или по крайней мере, были не видны)
EducatedFool вне форума Ответить с цитированием
Старый 20.01.2010, 15:30   #9
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Мне кажется сама мысль сохранять различные вложения в едином файле шаблона неудачна. При таком разнообразии форматов я бы если файл лежит на сервере с NTFS помещал бы "вложения" в альтернативные потоки.
Если уж всё таки именно в один файл, попробуйте использовать MIME кодирование или скажем алгоритм BASE64 кодирования для перевода ваших данных в унифицированное текстовое представление.
Код кодировщика-декодировщика в BASE64 можно найти например здесь http://www.source-code.biz/snippets/vbasic/12.htm

Полученный текст можно спрятать в разных легкодоступных частях файла Excel:
1) С учётом максимальной длины строки в EXCEL cохранять в скрытом листе
2) Дописывать слева ' и сохранять как комментарий в специальном модуле проекта (потребуется разрешение на доступ к объектной
модели VBA проекта).
3) Помещать текст в скрытую (минимизированную) надпись или шейп на рабочем листе. (Только если вложений мало - иначе будеточень тормозить)

Мне представляется что самый простой способ - первый.

Последний раз редактировалось Aent; 20.01.2010 в 15:38.
Aent вне форума Ответить с цитированием
Старый 20.01.2010, 15:35   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Этот текст можно спрятать в разных легкодоступных
частях файла Excel:
1) Прямо по строкам сохранять в скрытом листе
2) Дописывать слева ' и сохранять как комментарий в специальном модуле проекта
3) Помещать текст в скрытую (минимизированную) надпись или шейп
на рабочем листе. (Только если вложений мало - иначе будет очень тормозить)

А есть ещё варианты?

К примеру, файл, который требуется "прикрепить", весит 2 мегабайта.

Сохранять в строки - долго (да ещё и учитывать всякие ограничения на количество символов в ячейке)

Дописывать слева ' и сохранять как комментарий - а excel нормально отнесется к модулю в 2-мегабайтным комментарием?

Помещать текст в скрытую (минимизированную) надпись или шейп
на рабочем листе.
- не проверял, но сомневаюсь, что влезет. Да и тормозить будет, согласен.

Может, есть какие-то хитрые "контейнеры" в файле Excel, с которыми можно работать средствами VBA?
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OLE Maks1978 Общие вопросы C/C++ 1 29.10.2008 10:10
OLE Maks1978 БД в Delphi 1 29.10.2008 10:06
OLE ??? Selena Общие вопросы Delphi 3 05.01.2008 18:00