Russian Qt Forum

Программирование => С/C++ => Тема начата: Tiloaria от Октябрь 13, 2016, 16:02



Название: Чтение и запись данных с помощью C++ в excel файл
Отправлено: Tiloaria от Октябрь 13, 2016, 16:02
Попросили написать программу, которая упростит ввод данных(одновременно создавая базу) и будет выводить их в Excel файл.
Если на каком-то ещё языке это делает проще, скажите. Где-то прочитала на Delphi что-то такое можно реализовывать.


Название: Re: Чтение и запись данных с помощью C++ в excel файл
Отправлено: gil9red от Октябрь 13, 2016, 16:22
Тут уже дело вкуса :)
Мне вот больше нравится python


Название: Re: Чтение и запись данных с помощью C++ в excel файл
Отправлено: __Heaven__ от Октябрь 13, 2016, 16:58
А я с excel в vba работал прям в excel


Название: Re: Чтение и запись данных с помощью C++ в excel файл
Отправлено: panAlexey от Октябрь 13, 2016, 23:47
Лучше писать на том языке, который знаешь..
На Qt вполне себе можно написать системку.
пример работы с Excel
Код:
void Dialog::processData()
{
//    QAxObject* excel = new QAxObject( "Excel.Application", 0 );
//    QAxObject *workbooks = excel->querySubObject( "Workbooks" ); // вернулся нулевой указатель

    if(!isFNameNormal()) return;
    QString ffName = ui->le_DataFile->text();
    updateState(QString::fromUtf8("Начинаем обработку файла: %1").arg(ffName)); qApp->processEvents();
    bool useTemplAbCuant = makeTemplFiles();
    bool debugThis = false;
    bool dontSave = false; //ui->cb_dontSave->isChecked();
    ui->progressBar->setValue(0);

    ui->progressBar->setValue(0);
    updateState(QString::fromUtf8("Инициализация 'Excel.Application'"));    qApp->processEvents();
    QAxObject* excel = new QAxObject( "Excel.Application", 0 );
    QAxBase* workbooks = excel->querySubObject( "Workbooks" );

    updateState(QString::fromUtf8("Открываем '%1'").arg(ffName));    qApp->processEvents();

    QAxBase* workbook = workbooks->querySubObject( "Open(const QString&)",ffName /* "C:\\Users\\LocalDev\\teste.xls" */);
    QAxBase* sheets = workbook->querySubObject( "Worksheets" );
    QAxBase* vMainSheet = sheets->querySubObject( "Item( int )", 1 );
    //qApp->setOverrideCursor(

    int vAllStringCntr = 0;
    int vAllColumnCntr = 0;
    QAxObject *usedRange = 0;
    if (vMainSheet){
        usedRange = vMainSheet->querySubObject("Cells( int, int)",1,1);
        if (usedRange) {
            QAxObject *specialCell = usedRange->querySubObject("SpecialCells(int)", 11);
            if(specialCell){
                vAllStringCntr = specialCell->property("Row").toInt();
                vAllColumnCntr = specialCell->property("Column").toInt();
                delete specialCell;
            }
        }
    }
    if (debugThis){
        // Пока отладим
        //vAllColumnCntr = 8; //allColumnData;
        allMonth = 2;
    }
    qApp->setOverrideCursor(QCursor(Qt::WaitCursor));

    int vShCount = sheets->dynamicCall("Count()").toInt();
    int vIndexColDT = 0;
    QString vValStr = "";
    for (int colcntr = 1; colcntr <= vAllColumnCntr;colcntr++ ){
        usedRange = vMainSheet->querySubObject("Cells( int, int)",1,colcntr);
        if (usedRange) {
            vValStr = usedRange->property("Value").toString();
            if (vValStr == "DT"){
                vIndexColDT = colcntr;
            }
        }
    }
    QString vVal2 = "";
    QVariant vVal;
    int vValPrc;
    int tMons = 0;
    if (vShCount == 1 || useTemplAbCuant){
        // Можно продолжать.
        for (int mns = 1; mns<=allMonth; mns++){
            vValPrc = (mns*100/allMonth);
            qApp->processEvents();
            ui->progressBar->setValue(vValPrc);
            clearMap();
            QAxBase* workbookTo = 0;
            QString fNameTo = "";
            QAxBase* vAddSheet = 0; //sheets->querySubObject( "Add()");
            QAxBase* vSheetStat = 0; //sheets->querySubObject( "Add()");
            if (useTemplAbCuant){
                fNameTo = m_tmlFiles.at(mns-1);
                workbookTo = workbooks->querySubObject( "Open(const QString&)",fNameTo /* "C:\\Users\\LocalDev\\teste.xls" */);
                sheets = workbookTo->querySubObject( "Worksheets" );
                vAddSheet = sheets->querySubObject( "Item( const QString& )", "Data" );
            } else {
                vAddSheet = sheets->querySubObject( "Add()");
            }

            int vCurRow = 0;
            if (vAddSheet){
                if (!useTemplAbCuant)
                    vAddSheet->dynamicCall("Name",QVariant(QString("%1").arg(mns))); // Устанавливаем значение.

                for(int CNTR_Str = 1; CNTR_Str<= vAllStringCntr; CNTR_Str++){
                    bool processRow = false;
                    if (CNTR_Str == 1){
                        processRow = true;
                        m_mapColToSubstance.clear();
                    } else {
                        usedRange = vMainSheet->querySubObject("Cells( int, int)",CNTR_Str,vIndexColDT);
                        if (usedRange) {
                            vValStr = usedRange->property("Value").toString();
                            vVal2 = vValStr.mid(5,2);
                            tMons = vVal2.toInt();
                            //qDebug() << "CNTR_Str"<< CNTR_Str << vValStr << vVal2 << "tMons" << tMons;
                            if (tMons == mns){
                                processRow = true;
                            }
                        }
                    }
                    if (processRow){
                        vCurRow += 1;
                        for(int cntCols = 1; cntCols <= vAllColumnCntr; cntCols++ ){
                            usedRange = vMainSheet->querySubObject("Cells( int, int)",CNTR_Str,cntCols);
                            if (usedRange) {
                                vVal = usedRange->property("Value");
                                if (CNTR_Str == 1) {
                                    m_mapColToSubstance[cntCols] = vVal.toString();
                                } else {
                                    if (m_mapColToSubstance.size() > 0){
                                        if (m_mapColToSubstance.contains(cntCols)){
                                            QString subst = m_mapColToSubstance.value(cntCols);
                                            sData* data = getContainer(subst);
                                            if (data) {
//                                                qreal valN = vVal.toDouble();
//                                                if (valN != )
                                                QString isNanStr = vVal.toString();
                                                if (!isNanStr.isEmpty())
                                                    data->m_vect.append(vVal.toDouble());
                                            }

                                        }
                                    }
                                }
                                usedRange = vAddSheet->querySubObject("Cells( int, int)",vCurRow,cntCols);
                                if (usedRange)
                                    usedRange->setProperty("Value", vVal);
                            }
                        }
                    }
                } // конец сканирования листа.
                if (useTemplAbCuant){
                    vSheetStat = sheets->querySubObject( "Item( const QString& )", "Stat" );
                    if (vSheetStat){
                        // Теперь надо перекинуть это с листа Data на лист "Stat"
                        int nPokazNameRow = 12;
                        ///\todo продолжить тут.
                        for (int sbstCnt = 2; sbstCnt<30; sbstCnt++){
                            /* Посмотрим, какие показатели у нас в в листа "Stat" в строке 12.
                             * Найдем показатель в кеше, отсортируем и вставим. */

                            usedRange = vSheetStat->querySubObject("Cells( int, int)",nPokazNameRow,sbstCnt);
                            if (usedRange) {
                                vVal = usedRange->property("Value");
                                QString caption = vVal.toString();
                                caption = caption.trimmed();
                                QString substIdx = "";
                                if(g_dataToAbr.size()>0){
                                    if (g_dataToAbr.contains(caption))
                                        substIdx = g_dataToAbr.value(caption);
                                    else {
                                        qDebug() << "caption '" << caption << "'not found";
                                    }
                                }
                                if (!substIdx.isEmpty()){
                                    // Нашли...
                                    sData * dtEl = getContainer(substIdx);
                                    if(dtEl){
                                        int idxRow = nPokazNameRow;
                                        qreal data = 0.0;
                                        dtEl->sort();
                                        for (int dtElItemCnt = 0; dtElItemCnt<dtEl->m_vect.size(); dtElItemCnt++){
                                            data = dtEl->m_vect.at(dtElItemCnt);
                                            idxRow = idxRow + 1;
                                            usedRange = vSheetStat->querySubObject("Cells( int, int)",idxRow,sbstCnt);
                                            if (usedRange){
                                                bool isset = usedRange->setProperty("Value", data);
                                                vVal = usedRange->property("Value");
                                                //qDebug() << "Set val'" << data << "' to col" << sbstCnt << "row" << idxRow << "to the Stat list";
                                            }
                                            if (dtElItemCnt%10==0)
                                                qApp->processEvents();
                                        }
                                    }
                                }
                            }
                        }
                        if (dontSave) {
                        } else {
                            workbookTo->dynamicCall("Save()");
                            workbookTo->dynamicCall("Close()");
                        }
                    }
                }
                delete vAddSheet;
            }
            updateState(QString::fromUtf8("Обработали '%1' месяц.").arg(mns));
        }
    } else {
        updateState(QString::fromUtf8("В файле '%1'' больше одного листа. Наверное обработка уже была произведена.").arg(ffName));
    }

    excel->setProperty("DisplayAlerts", false);
    if (dontSave) {
    } else
    /*excel*/workbook->dynamicCall("Save()");

    workbook->dynamicCall("Close()");
    excel->setProperty("DisplayAlerts", true);
    excel->dynamicCall("Quit()");


//    delete shapes;
//    delete range;
//    delete sheet;
    delete vMainSheet;
    delete sheets;
    delete workbook;
    delete workbooks;
    excel->dynamicCall("Quit()");
    delete excel;

    updateState(QString::fromUtf8("Обработка завершена!"));
    ManageDialogControls();
    qApp->restoreOverrideCursor();
    ui->progressBar->setValue(0);
}