Russian Qt Forum

Qt => ActiveX => Тема начата: PunX от Сентябрь 10, 2010, 11:11



Название: Список листов в excel
Отправлено: PunX от Сентябрь 10, 2010, 11:11
Здравствуйте, появилась необходимость получить весь список листов в файле excel, подскажите пожалуйста как это можно сделать?


Название: Re: Список листов в excel
Отправлено: Denjs от Сентябрь 10, 2010, 14:19
телепатирую:будем считать что вы работаете под вендой и ексель у вас установлен. так?

Я бы начал смотреть описания COM-объектов екселя. Боюсь, что в разных екселях оно может быть немного по разному.

Для доступа к ком-объекту вроде как используют
Код:
QAxObject("Excel.Application", 0);


Название: Re: Список листов в excel
Отправлено: Andrey.D от Сентябрь 10, 2010, 21:57
Как устанавливать соединение с объектом Excel я знаю, но пока в том и проблема что не могу найти метод как получить список (массив) листов "Книги" excel.


Название: Re: Список листов в excel
Отправлено: merke от Сентябрь 11, 2010, 11:17

Узнать количество листов в книге можно в цикле по коллекции Workbook.Sheets. Количество листов — свойство Sheets.Count. Имя листа — свойство Worksheet.Name.


Название: Re: Список листов в excel
Отправлено: merke от Сентябрь 11, 2010, 11:20
Пример на VB но думую не составит трудности перевести его на кути

Код
Visual Basic
Dim sh As Worksheet
For i = 1 in objExcel.Worksheets.Count
   objExcel.Worksheets(i).Activate 'Активируем лист
Next i


Название: Re: Список листов в excel
Отправлено: JayFOX от Сентябрь 11, 2010, 18:08
Код:
QStringList getSheetsNames(const QString &fileName)
{
    //открываем книгу и лист
    QAxObject* excel = new QAxObject("Excel.Application", 0); //получаем указатьтель на excel

    QAxObject *workbooks = excel->querySubObject("Workbooks"); //получаем указатель на список книг
    QAxObject *workbook  = workbooks->querySubObject("Open(const QString&)", fileName); // открываем файл с диска с уже созданным документом Excel и получаем указатель на книгу

    QAxObject* sheets = excel->querySubObject("Worksheets");
    int sheetsCount = sheets->dynamicCall("Count").toInt();

    QStringList list;
    for (int i=1;i<sheetsCount+1;i++)
    {
        QAxObject* sheetNames=sheets->querySubObject("Item(const QVariant&)",QVariant(i));
        list<<sheetNames->dynamicCall("Name").toString().toLower();
        delete sheetNames;
    }
    //Сохраняя изменения
    QVariantList params;
    params << 0;
    params << QVariant();
    params << QVariant();
    workbook->dynamicCall("Close(QVariant, QVariant, QVariant)", params);
    delete sheets;
    delete workbook;
    delete workbooks;
    delete excel;

    return list;
}


Название: Re: Список листов в excel
Отправлено: Andrey.D от Сентябрь 11, 2010, 19:15
Большое спасибо, очень помогло!