| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
http://wlpr.fatal.ru/excelfileformat.pdf |
| Автор: Dreamer_0x01 15.8.2005, 14:23 | ||||
Справиться в принципе можно с чем угодно, если есть где почитать на русском языке . Вкратце можете сказать, что такое COM и что такое ADO ? И заодно вопрос - работа с office xp, office 2000, office 97 сильно будет отличаться? |
| Автор: Denn 15.8.2005, 15:54 | ||
| Про COM... Хде то здесь была ссылка на книжку Сущность технологии COM на русском... А вкратце... Word представляет собой сервер автоматизации. Он состоит из объектов, которые представляют собой различные его части - документы, страницы, параграфы и т.п. Тоже с Excel. Ты ими манипулируешь из своей программы, которая является контролером автоматизации. А вот как ADO будет это делать я не представляю.
Не будет, если ты не будешь использовать специфические фичи для выбранной версии. |
| Автор: Dreamer_0x01 15.8.2005, 16:11 | ||||
То есть предполагается, что моя прога открывает excel и посредством каких-то команд генерирует файл уже внутри него? Или не так?
Нет, конечно не будет. Мне всего лишь надо сформировать несолько столбцов с несколькими тысячами строк, все значения - тестовые и числовые. |
| Автор: Denn 15.8.2005, 16:51 | ||
Именно так. Генерится на глазах прямо в Excel. Ты можешь делать все (ну или почти все) что Excel может. |
| Автор: Earnest 15.8.2005, 19:57 |
| Если формат простой - регулярные колонки с цифрами или строками, то можно проще: есть такой формат CSV (Comma Separated Values), Excel его считает своим. Это просто текстовая таблица, где все значения разделены запятыми. На самом деле лучше разделять точкой с запятой, чтобы не путаться с десятичной точкой, которая по-русски запятая. Короче, только с этим и надо разобраться, чтобы печатать десятичную точку так, как понимает Excel у тебя на машине. Но это для тех случаев, когда надо засунуть данные в Excel по-быстрому, и только на конкретной машине, и при этом формат - простая таблица. Кстати, быстрее будет, чем через Automation. |
| Автор: JoyEx 15.8.2005, 19:58 | ||||
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 всё остальное за тебя сделает.
- и да и нет, если хочешь, чтобы твоя автоматизация работала с office97-XP, то тогда используй библиотеку типов из office97. |
| Автор: Dreamer_0x01 15.8.2005, 20:38 |
| Earnest Формат проще некуда. Текстовые заголовки столбцов "Дата","Время", "Значение канала 1",... ,"Значение канала 16" , "Нештатные ситуации". И далее в каждой строке соответствующие значения. Строк таких будет несколько тысяч. Сейчас посмотрел на данные в формате csv - да, действительно просто. В принципе, это выход из ситуации, нужно лишь уточнить, поддерживает ли этот формат файлы большого размера (число строк в дальнейших версиях программ будет доходить до нескольких миллионов), а также поддерживают ли этот формат ранние версии екселя. И по скорости пожалуй это самый быстрый метод генерирования файла. На данный момент мы просто генерируем текстовый файл, с разделителями в виде пробелов, и такую штуку открываем экселем. Открывается, но пользователь должен иметь некое представление о работе в экселле и обладать элементарным интиллектом, чтобы открыть этот текстовый файл в экселле и вручную расставить столбцы. Увы, на это рассчитывать нельзя Надо,чтоб он нажимал в программе кнопку "экспорт", и ему на экране сразу показывалась табличка. Здесь получается так, что я огу сначала сгенерировать этот файл data.csv а потом в соответствующем месте программы запустить ShellExecute((HWND)this,"open","data.csv",NULL,NULL,SW_SHOWNORMAL); Хоть и извращение, но зато очень быстро !!! А создание "правильного" файла xls придется перенести в следующую версию программы. Всем спасибо, в особенности Earnest за идею!!! |