Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Есть ли в MFC средства для работы с MSOffice?


Автор: Dreamer_0x01 14.8.2005, 15:12
Нужно данные из программы экспортировать в ралличные файлы разных форматов. Среди них - таблица Excel.
Есть ли какие-то стандартные средства, позволяющие это делать, или может кто скинет описание формата xls ?

Автор: Denn 14.8.2005, 18:58
Я использовал COM Automation, правда давно это было. Автоматизировал Word. Excel почти ничем не отличается в принципе. Находишь экзешник excel'а, загружаешь. Тебе становятся доступны через disp-интерфейс его объекты и методы. Далее как на VBA - это можно посмотреть в соотв. help'е. Там достаточно просто.

Автор: chaos 15.8.2005, 11:01
а может ADO поиспользовать? Он справиться с этим!!!

Автор: chaos 15.8.2005, 11:18
может еще это поможет
http://wlpr.fatal.ru/John.Wiley.and.Sons.Excel.Add-in.Development.in.C.and.C.Plus.Plus.Dec.2004.ISBN0470024690.pdf

Автор: chaos 15.8.2005, 13:24
Цитата(Dreamer_0x01 @ 14.8.2005, 15:12)
или может кто скинет описание формата xls ?

http://wlpr.fatal.ru/excelfileformat.pdf

Автор: Dreamer_0x01 15.8.2005, 14:23
Цитата

а может ADO поиспользовать? Он справиться с этим!!!


Цитата

Я использовал COM Automation


Справиться в принципе можно с чем угодно, если есть где почитать на русском языке .
Вкратце можете сказать, что такое COM и что такое ADO ?

И заодно вопрос - работа с office xp, office 2000, office 97 сильно будет отличаться?

Автор: Denn 15.8.2005, 15:54
Про COM... Хде то здесь была ссылка на книжку Сущность технологии COM на русском...

А вкратце... Word представляет собой сервер автоматизации. Он состоит из объектов, которые представляют собой различные его части - документы, страницы, параграфы и т.п. Тоже с Excel. Ты ими манипулируешь из своей программы, которая является контролером автоматизации.

А вот как ADO будет это делать я не представляю.

Цитата(Dreamer_0x01 @ 15.8.2005, 14:23)
И заодно вопрос - работа с office xp, office 2000, office 97 сильно будет отличаться?

Не будет, если ты не будешь использовать специфические фичи для выбранной версии.

Автор: Dreamer_0x01 15.8.2005, 16:11
Цитата

Ты ими манипулируешь из своей программы, которая является контролером автоматизации


То есть предполагается, что моя прога открывает excel и посредством каких-то команд генерирует файл уже внутри него? Или не так?

Цитата

Не будет, если ты не будешь использовать специфические фичи для выбранной версии.


Нет, конечно не будет. Мне всего лишь надо сформировать несолько столбцов с несколькими тысячами строк, все значения - тестовые и числовые.

Автор: Denn 15.8.2005, 16:51
Цитата(Dreamer_0x01 @ 15.8.2005, 16:11)
То есть предполагается, что моя прога открывает excel и посредством каких-то команд генерирует файл уже внутри него? Или не так?

Именно так. Генерится на глазах прямо в Excel. Ты можешь делать все (ну или почти все) что Excel может.

Автор: Earnest 15.8.2005, 19:57
Если формат простой - регулярные колонки с цифрами или строками, то можно проще: есть такой формат CSV (Comma Separated Values), Excel его считает своим. Это просто текстовая таблица, где все значения разделены запятыми. На самом деле лучше разделять точкой с запятой, чтобы не путаться с десятичной точкой, которая по-русски запятая.
Короче, только с этим и надо разобраться, чтобы печатать десятичную точку так, как понимает Excel у тебя на машине. Но это для тех случаев, когда надо засунуть данные в Excel по-быстрому, и только на конкретной машине, и при этом формат - простая таблица. Кстати, быстрее будет, чем через Automation.

Автор: JoyEx 15.8.2005, 19:58
Цитата(Dreamer_0x01 @ 15.8.2005, 14:23)
Вкратце можете сказать, что такое COM ...


http://www.rsdn.ru/summary/247.xml

Если в двух словах: сервер (.exe или .dll (- внутрипроцессный)) регистрируется, т.е. в реестре прописывает свой CLSID (уникальный ID) и вот, когда ты создаешь какой-то COM-объект из этого сервера, то по этому ID (в реестре) ищется прокси [для внутрипроцессного сервера, прокси (представитель) - это его же .dll, если, конечно, апартамент подходит] и загружается в процесс клиента, затем ты получаешь указатель на интерфейс, т.е. на vTable объекта в прокси. Ну и можешь вызывать методы. Каждый COM-объект поддерживает интерфейс IUnknown, через IUnknown::QueryInterface() ты можешь запросить у него другой интерфейс, но вот для скриптовых языков (VBA, JScript...) это делать затруднительно и поэтому они работают токо с IDispatch, т.е. через IDispatch::GetIDsOfNames () из строкового имени метода получают его id и вызывают метод с помощью IDispatch::Invoke(,id,). Для языковой независимости интерфейсы еще описываются на языке IDL и записываются в библиотеку типов (.tlb, .olb или в ресурсы сервера), которая нужна еще и для универсального маршалинга ( - передача данных ).

ЗЫ Сервер может находиться и на удаленной машине, для связи с ним нужно токо поменять флаг на CLSCTX_REMOTE_SERVER в CoCreateInstanceEx() и указать адрес машины, через RPC (Remote Procedure Call) Windows всё остальное за тебя сделает.

Цитата(Denn @ 15.8.2005, 15:54)
Цитата (Dreamer_0x01 @ 15.8.2005, 14:23)
И заодно вопрос - работа с office xp, office 2000, office 97 сильно будет отличаться?
Не будет, если ты не будешь использовать специфические фичи для выбранной версии.


- и да и нет, если хочешь, чтобы твоя автоматизация работала с office97-XP, то тогда используй библиотеку типов из office97.

Автор: Dreamer_0x01 15.8.2005, 20:38
Earnest

Формат проще некуда. Текстовые заголовки столбцов
"Дата","Время", "Значение канала 1",... ,"Значение канала 16" , "Нештатные ситуации".
И далее в каждой строке соответствующие значения. Строк таких будет несколько тысяч.

Сейчас посмотрел на данные в формате csv - да, действительно просто. В принципе, это выход из ситуации, нужно лишь уточнить, поддерживает ли этот формат файлы большого размера (число строк в дальнейших версиях программ будет доходить до нескольких миллионов), а также поддерживают ли этот формат ранние версии екселя. И по скорости пожалуй это самый быстрый метод генерирования файла.
На данный момент мы просто генерируем текстовый файл, с разделителями в виде пробелов, и такую штуку открываем экселем. Открывается, но пользователь должен иметь некое представление о работе в экселле и обладать элементарным интиллектом, чтобы открыть этот текстовый файл в экселле и вручную расставить столбцы. Увы, на это рассчитывать нельзя smile
Надо,чтоб он нажимал в программе кнопку "экспорт", и ему на экране сразу показывалась табличка.
Здесь получается так, что я огу сначала сгенерировать этот файл data.csv а потом в соответствующем месте программы запустить

ShellExecute((HWND)this,"open","data.csv",NULL,NULL,SW_SHOWNORMAL);

Хоть и извращение, но зато очень быстро !!!
А создание "правильного" файла xls придется перенести в следующую версию программы.

Всем спасибо, в особенности Earnest за идею!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)