#include #include #include #include const qt_K_INTEGER DIMArr = 50, NoColumns = 5, TEXTLen = 256; static struct qT_TIMESTAMP_STRUCT TSArr[DIMArr]; // defines a date & time structure void set_qT_SQLColumn( qT_SQLColumn *tColumn, char* sName, void *ArrayAddr, qt_K_INT4 iArrayDim, qt_K_INT4 iArrayType, qt_K_INT4 iLENArrElem ) { // tColumn->Name = sName; // column name strcpy(tColumn->Name, sName); // column name tColumn->ArrayAddr = (qt_K_LP)ArrayAddr; // address of array tColumn->ArrayDim = iArrayDim; // array dimension tColumn->ArrayType = iArrayType; // type of array tColumn->LENArrElem = iLENArrElem; // size of an array element (in bytes) tColumn->IndArrAddr = 0; // reserved, unused (should be 0) return; } void Set_TSArr( int j ) // fill date & time structure with some date and time values { int hour; if ( j == 0 ) { time_t now = time(NULL); tm *z = localtime(&now); TSArr[j].year = z->tm_year + 1900; TSArr[j].month = z->tm_mon + 1; TSArr[j].day = z->tm_mday; TSArr[j].hour = z->tm_hour; TSArr[j].minute = z->tm_min; TSArr[j].second = z->tm_sec; TSArr[j].fraction = 0; } else // increment date and time { TSArr[j] = TSArr[j-1]; TSArr[j].day = TSArr[j-1].day + 1; if ( TSArr[j].day > 28 ) { TSArr[j].day = 1; TSArr[j].month = TSArr[j-1].month + 1; if ( TSArr[j].month > 12 ) { TSArr[j].month = 1; TSArr[j].year = TSArr[j-1].year + 1; } } TSArr[j].second = TSArr[j-1].second + 1; if ( TSArr[j].second > 59 ) { TSArr[j].second = 1; TSArr[j].minute = TSArr[j-1].minute + 1; if ( TSArr[j].minute > 59 ) { TSArr[j].minute = 1; hour = TSArr[j-1].hour; TSArr[j].hour = hour % 24 + 1; } } } return; } int main(void) { // Program demonstrates usage of qtXLS routines to export some data to // an EXCEL file. // // We are going to create an EXCEL file named "qtXLSDemo3.xls" // which contains a table named "qtXLSDemoTable" with // columns: lfdNr x y Description Date_Time // Arrays with data to be exported. char *szTextArr; // [DIMArr][TEXTLen]; qt_K_INTEGER *lfdNrArr; // INTEGER*4 [DIMArr] arrays qt_K_R8 *xArr, *yArr; // REAL*8 [DIMArr] arrays qt_K_R8 angle; const qt_K_R8 PI = 3.1415932654; // variables to be used by qtXLS routines qt_K_HANDLE hDS; qt_K_INT4 iRet, iRow, TNLen, NoRows, ind; char *szFileName; struct qT_SQLColumn *tColumns[NoColumns]; char *szTableName; char *szTableDefinition; // qtSetXLSLicencePath( szPathName ) // change the path to a location where the licence file resides NoRows = DIMArr; // allocate arrays for result set //szTextArr[NoRows] = new char [NoRows][TEXTLen]; szTextArr =(char *) calloc(NoRows, TEXTLen); lfdNrArr = new qt_K_INTEGER [NoRows]; xArr = new qt_K_R8 [NoRows]; yArr = new qt_K_R8 [NoRows]; if ( szTextArr == NULL || lfdNrArr == NULL || xArr == NULL || yArr == NULL ) { printf("Could not allocate arrays.n"); return -1; // to the "Exit" } // Fill arrays with values (the data we"re going to export into an EXCEL file) for (ind = 0; ind < DIMArr; ind++) { iRow = ind + 1; lfdNrArr[ind] = iRow; xArr[ind] = iRow * 0.01; angle = xArr[ind] * PI; yArr[ind] = cos(angle); sprintf(szTextArr + ind * TEXTLen, "(Angle = , %.2f, (degree)", angle * 180. / PI); Set_TSArr( ind ); // routine (see CONTAINS section) sets TSArr } // create "empty" EXCEL file szFileName = "qtXLSDemo3.xls"; hDS = qtXLSCreateEXCELFile( szFileName ); // returns a "data source handle" to be used with other qtXLS routines if ( hDS == 0 ) { printf("Error returned from qtXLSCreateEXCELFile = %d\n", hDS); return -1; } else printf("qtXLSCreateEXCELFile created the file %s\n", szFileName); qtXLSSetErrorLevel( 1 ); // continue, if an error occurs (if possible) //T qtXLSSetErrorMessagesDisplay( 1 ); // turn on "error display" // Create (empty) table // -------------------- szTableName = "qtXLSDemoTable"; // table name (zero terminated) TNLen = qtXLSGetszStringLength( szTableName ); // returns length of string (without terminating zero) // check if table already exists if ( qtXLSDoesTableNameExist( hDS, szTableName ) == 1 ) printf("Table %s already exists.\n", szTableName); else { // create table by setting up a command line containing the table name followed // by a list of pairs of column names and column types (like NUMBER, DATETIME, TEXT, CURRENCY or LOGICAL). szTableDefinition = new char [1000]; strcpy(szTableDefinition, szTableName); strcpy(&szTableDefinition[TNLen], " (lfdNr NUMBER, x NUMBER, y NUMBER, Description TEXT, Date_Time DATETIME)"); iRet = qtXLSCreateTable( hDS, szTableDefinition ); if ( iRet != 0) return -1; // stop on error } // Set up columns "lfdNr x y Description Date_Time" for export // ------------------------------------------------------------------- // create array of structure tColumns tColumns[0] = (qT_SQLColumn *) calloc(NoColumns, sizeof(qT_SQLColumn)); for (ind = 1; ind < NoColumns; ind++) tColumns[ind] = tColumns[ind-1] + 1; // + sizeof(qT_SQLColumn); // 1st column set_qT_SQLColumn( tColumns[0], "lfdNr", lfdNrArr, NoRows, qt_SQL_C_SLONG, 4 ); // and remaining columns set_qT_SQLColumn(tColumns[1], "x", xArr, NoRows, qt_SQL_C_DOUBLE, 8); set_qT_SQLColumn(tColumns[2], "y", yArr, NoRows, qt_SQL_C_DOUBLE, 8); set_qT_SQLColumn(tColumns[3], "Description", szTextArr, NoRows, qt_SQL_C_CHAR, TEXTLen); set_qT_SQLColumn(tColumns[4], "Date_Time", TSArr, NoRows, qt_SQL_C_TIMESTAMP, 16); // Fill table with rows // -------------------- iRet = qtXLSWriteRows( hDS, szTableName, NoColumns, NoRows, tColumns[0] ); if ( iRet >= 0 ) printf("qtXLSWriteRows successful. Number of rows written: %d\n", iRet); else printf("Error returned from qtXLSWriteRows; iError = %d\n", iRet); iRet = qtXLSCloseEXCELFile( hDS ); if ( iRet == 0 ) { printf("Data successfully exported to EXCEL file %s\n", szFileName); printf("qtXLS closed.\n"); } else printf("Error returned from qtXLSCloseEXCELFile = %d\n", iRet); printf("\n"); printf("(C) QT software GmbH, Germany. All rights reserved. 2006.\n"); printf(" http:\\www.qtsoftware.de eMail: info@qtsoftware.de\n"); return 0; }