Статьи по программированию
примеры программного кода
Delphi, Kylix, C, C++, SQL, Visual Basic, Bash, Assembler, 1С
Qt, KOL, MFC, Rx Library, Windows, Linux, Mac OS
Синтез QT и Excel
Опубликовано codeLocker в 08.08.2008 в 11:10.
Одна из последних новинок, появившихся в QT версии 3.1 и выше, - это поддержка технологии ActiveX для OS Windows. Это особенно важно для тех, кто разрабатывает приложения, которые, могут например импортировать свои данные в другие приложения, например, вставлять данные в Excel.
К сожалению, материалов на эту тему достаточно мало в интернете, а заказчик уперся в своем желании видеть свои выходные данные обязательно в Excel. Поэтому, мне пришлось брать в свои руки Visual С++ и пытатся решить поставленную задачу.
Первое, куда я заглянул – это в примеры, поставляемые с QT. Вообще хотелось бы сказать, что документация и примеры у QT на высшем уровне. Не помню, где я читал, что цель у разработчиков библиотеки – это чтобы после прочтения документации у пользователя не оставалось вопросов, что и как. Но в примерах не было того, что я искал. Встретился только пример синхронизации с MS Outlook Express. Он то и послужил отправной точкой в моем исследовании.
Небольшое отступлению к технологии ActiveX и COM. К сожалению, я не большой специалист в этой технологии, но рекомендую почитать, например, книгу Адама Деннинга “ActiveX для профессионалов”. Именно она мне помогла понять, что к чему.
Итак, шаг первый: Нужно соединится с Excel и создать там пустой лист.
QAxObject* excel = new QAxObject( "Excel.Application", this ); //получаем указатьтель на excel
excel->dynamicCall( "SetVisible(bool)", TRUE ); //делаем его видимым
Вот и все, встроив этот код в программу, мы теперь видим перед собой открывшийся Excel с чистым листом.
Шаг второй: нам нужно вставить данные в этот чистый лист. Для этого надо немного понимать структуру документа в Excel. Основопологающая структура Excel - это список книг (workbooks). Книга (workbook) в себе листы (sheets). К сожалению, компания Microsoft предоставила очень мало информации о структуре документа в Excel, или я ее после долгого поиска в Google не нашел.
Итак, вернемся к нашим баранам:
QAxObject *workbooks = excel->querySubObject( "Workbooks" ); //получаем указатель на список книг
QAxObject *workbook = workbooks->querySubObject( "Open(const QString&)", "C:\\data\\A.xls" ); // открываем файл с диска с уже созданным документом Excel и получаем указатель на книгу
QAxObject *sheets = workbook->querySubObject( "Sheets" ); //получаем указатель список листов
QAxObject *StatSheet = sheets->querySubObject( "Item(const QVariant&)", QVariant("stat") ); // получаем указатель на лист с названием “stat”
StatSheet->dynamicCall( "Select()" ); //на всякий случай выбираем этот лист – это делает его видимым
QAxObject *range = StatSheet->querySubObject( "Range(const QVariant&)", QVariant( Qstring("A1:A1"))); //выбираем ячейку “A1:A1”
range->dynamicCall( "Clear()" ); // на всякий случай очищаем эту ячейку
range->dynamicCall( "SetValue(const QVariant&)", QVariant(5) );//записываем в эту ячейку число 5
Вот и все. Далее пользователь сам закрывает сохраняет и закрывает книгу.
PS: Хотелось бы добавить, что интерфейс у каждого указателя, например, excel, можно получить с помощью очень полезной функции generateDocumentation(). В качестве примера, можно сделать так:
QTextStream out( &outfile );
outfile.open( IO_WriteOnly | IO_Translate );
QString docu = excel->generateDocumentation();
out << docu;
outfile.close();
Вся информация будет в файле “excel.html”.
И еще - при вставке большого массива данных в Excel вставлять по ячейке очень долго и ресурсоемко. Для этого в MFC используют специальный класс, а для qt мне не удалось подыскать что-либо работающее.
Материал похожий на Синтез QT и Excel
- Работа с листами книги
- Создаём Excel файл без OLE
- Работа через WinAPI
- Блокировка/Разблокировка CD-ROM
- Как нарисовать повёрнутый текст
- Символы разного цвета в StringGrid
- Синхронизация двух компонентов ScrollBox