int OGRXLSDataSource::Open( const char * pszFilename, int bUpdateIn) { if (bUpdateIn) { return FALSE; } #ifdef _WIN32 if( CPLTestBool( CPLGetConfigOption( "GDAL_FILENAME_IS_UTF8", "YES" ) ) ) pszName = CPLRecode( pszFilename, CPL_ENC_UTF8, CPLString().Printf( "CP%d", GetACP() ) ); else pszName = CPLStrdup( pszFilename ); #else pszName = CPLStrdup( pszFilename ); #endif // -------------------------------------------------------------------- // Does this appear to be a .xls file? // -------------------------------------------------------------------- /* Open only for getting info. To get cell values, we have to use freexl_open */ if (freexl_open_info (pszName, &xlshandle) != FREEXL_OK) return FALSE; unsigned int nSheets = 0; if (freexl_get_info (xlshandle, FREEXL_BIFF_SHEET_COUNT, &nSheets) != FREEXL_OK) return FALSE; for(unsigned short i=0; i<(unsigned short)nSheets; i++) { freexl_select_active_worksheet(xlshandle, i); const char* pszSheetname = NULL; if (freexl_get_worksheet_name(xlshandle, i, &pszSheetname) != FREEXL_OK) return FALSE; unsigned int nRows = 0; unsigned short nCols = 0; if (freexl_worksheet_dimensions(xlshandle, &nRows, &nCols) != FREEXL_OK) return FALSE; /* Skip empty sheets */ if (nRows == 0) continue; papoLayers = (OGRLayer**) CPLRealloc(papoLayers, (nLayers + 1) * sizeof(OGRLayer*)); papoLayers[nLayers ++] = new OGRXLSLayer(this, pszSheetname, i, (int)nRows, nCols); } freexl_close(xlshandle); xlshandle = NULL; return TRUE; }
OGRFeature *OGRXLSLayer::GetNextRawFeature() { if (nNextFID == nRows) return nullptr; const void* xlshandle = poDS->GetXLSHandle(); if (xlshandle == nullptr) return nullptr; freexl_select_active_worksheet(xlshandle, (unsigned short)iSheet); OGRFeature* poFeature = new OGRFeature(poFeatureDefn); FreeXL_CellValue sCellValue; for(unsigned short i=0;i<(unsigned short )poFeatureDefn->GetFieldCount(); i++) { if (freexl_get_cell_value(xlshandle, nNextFID, i, &sCellValue) == FREEXL_OK) { switch (sCellValue.type) { case FREEXL_CELL_INT: poFeature->SetField(i, sCellValue.value.int_value); break; case FREEXL_CELL_DOUBLE: poFeature->SetField(i, sCellValue.value.double_value); break; case FREEXL_CELL_TEXT: case FREEXL_CELL_SST_TEXT: poFeature->SetField(i, sCellValue.value.text_value); break; case FREEXL_CELL_DATE: case FREEXL_CELL_DATETIME: case FREEXL_CELL_TIME: poFeature->SetField(i, sCellValue.value.text_value); break; case FREEXL_CELL_NULL: break; default: CPLDebug("XLS", "Unknown cell type = %d", sCellValue.type); break; } } } poFeature->SetFID(nNextFID + 1); nNextFID ++; return poFeature; }
void FreeXL_Set_active_worksheet(sLONG_PTR *pResult, PackagePtr pParams) { C_LONGINT Param1; C_LONGINT Param2; C_LONGINT returnValue; Param1.fromParamAtIndex(pParams, 1); Param2.fromParamAtIndex(pParams, 2); int error = FREEXL_NULL_HANDLE; xls_handle h = __handleGet(Param1.getIntValue()); if(h){ error = freexl_select_active_worksheet(h, Param2.getIntValue() -1); } returnValue.setIntValue(error); returnValue.setReturn(pResult); }
OGRFeatureDefn * OGRXLSLayer::GetLayerDefn() { if (poFeatureDefn) return poFeatureDefn; poFeatureDefn = new OGRFeatureDefn( pszName ); poFeatureDefn->Reference(); poFeatureDefn->SetGeomType( wkbNone ); const void* xlshandle = poDS->GetXLSHandle(); if (xlshandle == nullptr) return poFeatureDefn; freexl_select_active_worksheet(xlshandle, (unsigned short)iSheet); if (nRows > 0) { FreeXL_CellValue sCellValue; DetectHeaderLine(xlshandle); int* paeFieldTypes = (int* ) CPLMalloc(nCols * sizeof(int)); for( unsigned short i = 0; i < nCols; i++ ) { paeFieldTypes[i] = -1; } const char* pszXLSFieldTypes = CPLGetConfigOption("OGR_XLS_FIELD_TYPES", ""); if (!EQUAL(pszXLSFieldTypes, "STRING")) DetectColumnTypes(xlshandle, paeFieldTypes); for( unsigned short i = 0; i < nCols; i++ ) { OGRFieldType eType = (OGRFieldType) paeFieldTypes[i]; if (paeFieldTypes[i] < 0) eType = OFTString; if( bFirstLineIsHeaders && freexl_get_cell_value(xlshandle, 0, i, &sCellValue) == FREEXL_OK && (sCellValue.type == FREEXL_CELL_TEXT || sCellValue.type == FREEXL_CELL_SST_TEXT) ) { OGRFieldDefn oField(sCellValue.value.text_value, eType); poFeatureDefn->AddFieldDefn(&oField); } else { OGRFieldDefn oField(CPLSPrintf("Field%d", i+1), eType); poFeatureDefn->AddFieldDefn(&oField); } } CPLFree(paeFieldTypes); } ResetReading(); return poFeatureDefn; }
int load_excel(char *filename) { FreeXL_CellValue cell; const void *handle; unsigned int info; unsigned int rows; unsigned short columns; unsigned int row; unsigned short col; int ret; int worksheet_index = 0; memset(name, 0, sizeof(name)); memset(data, 0, sizeof(data)); ret = freexl_open (filename, &handle); if (ret != FREEXL_OK) { fprintf (stderr, "OPEN ERROR: %d\n", ret); return -1; } ret = freexl_get_info (handle, FREEXL_BIFF_PASSWORD, &info); if (ret != FREEXL_OK) { fprintf (stderr, "GET-INFO [FREEXL_BIFF_PASSWORD] Error: %d\n", ret); goto stop; } switch (info) { case FREEXL_BIFF_PLAIN: break; case FREEXL_BIFF_OBFUSCATED: default: fprintf (stderr, "Password protected: (not accessible)\n"); goto stop; }; ret = freexl_select_active_worksheet (handle, worksheet_index); if (ret != FREEXL_OK) { fprintf (stderr, "SELECT-ACTIVE_WORKSHEET Error: %d\n", ret); goto stop; } /* dimensions */ ret = freexl_worksheet_dimensions (handle, &rows, &columns); if (ret != FREEXL_OK) { fprintf (stderr, "WORKSHEET-DIMENSIONS Error: %d\n", ret); goto stop; } if (rows < 3) { fprintf (stderr, "至少需要三行: %d\n", ret); goto stop; } max_columns = columns; max_rows = rows; row = 1; for (col = 0; col < columns; col++) { ret = freexl_get_cell_value (handle, row, col, &cell); if (ret != FREEXL_OK) { fprintf (stderr, "CELL-VALUE-ERROR (r=%u c=%u): %d\n", row, col, ret); goto stop; } if (cell.type != FREEXL_CELL_TEXT && cell.type != FREEXL_CELL_SST_TEXT) { name[col] = strdup("NOT__ALREADY__SET"); } else name[col] = strdup(cell.value.text_value); } for (row = 2; row < rows; row++) { for (col = 0; col < columns; col++) { ret = freexl_get_cell_value (handle, row, col, &cell); if (ret != FREEXL_OK) { fprintf (stderr, "CELL-VALUE-ERROR (r=%u c=%u): %d\n", row, col, ret); goto stop; } switch (cell.type) { case FREEXL_CELL_INT: // printf (", %d", cell.value.int_value); sprintf(tmpvalue, "%d", cell.value.int_value); data[row - 2][col] = strdup(tmpvalue); break; case FREEXL_CELL_DOUBLE: // printf (", %1.12f", cell.value.double_value); sprintf(tmpvalue, "%d", (int)cell.value.double_value); data[row - 2][col] = strdup(tmpvalue); break; case FREEXL_CELL_TEXT: case FREEXL_CELL_SST_TEXT: // print_sql_string (cell.value.text_value); // printf (", '%s'", cell.value.text_value); data[row - 2][col] = strdup(cell.value.text_value); break; case FREEXL_CELL_DATE: case FREEXL_CELL_DATETIME: case FREEXL_CELL_TIME: // printf (", '%s'", cell.value.text_value); data[row - 2][col] = strdup(cell.value.text_value); break; case FREEXL_CELL_NULL: default: // printf (", NULL"); data[row - 2][col] = NULL; break; }; } } return (0); stop: /* closing the .XLS file [Workbook] */ ret = freexl_close (handle); if (ret != FREEXL_OK) { fprintf (stderr, "CLOSE ERROR: %d\n", ret); return -1; } return (0); }
int load_map_excel(char *filename) { FreeXL_CellValue cell; const void *handle; unsigned int info; unsigned int rows; unsigned short columns; unsigned int row; unsigned short col; int ret; int worksheet_index = 0; ret = freexl_open (filename, &handle); if (ret != FREEXL_OK) { fprintf (stderr, "OPEN ERROR: %d\n", ret); return -1; } ret = freexl_get_info (handle, FREEXL_BIFF_PASSWORD, &info); if (ret != FREEXL_OK) { fprintf (stderr, "GET-INFO [FREEXL_BIFF_PASSWORD] Error: %d\n", ret); goto stop; } switch (info) { case FREEXL_BIFF_PLAIN: break; case FREEXL_BIFF_OBFUSCATED: default: fprintf (stderr, "Password protected: (not accessible)\n"); goto stop; }; ret = freexl_select_active_worksheet (handle, worksheet_index); if (ret != FREEXL_OK) { fprintf (stderr, "SELECT-ACTIVE_WORKSHEET Error: %d\n", ret); goto stop; } /* dimensions */ ret = freexl_worksheet_dimensions (handle, &rows, &columns); if (ret != FREEXL_OK) { fprintf (stderr, "WORKSHEET-DIMENSIONS Error: %d\n", ret); goto stop; } if (columns >= MAPROW || rows >= MAPCOL) { fprintf (stderr, " Error: map is too big %d %d\n", columns, row); goto stop; } for (row = 0; row < rows; row++) { for (col = 0; col < columns; col++) { ret = freexl_get_cell_value (handle, row, col, &cell); if (ret != FREEXL_OK) { fprintf (stderr, "CELL-VALUE-ERROR (r=%u c=%u): %d\n", row, col, ret); goto stop; } switch (cell.type) { case FREEXL_CELL_INT: // printf (", %d", cell.value.int_value); TestMap[row][col] = cell.value.int_value; break; case FREEXL_CELL_DOUBLE: // printf (", %1.12f", cell.value.double_value); TestMap[row][col] = cell.value.double_value; break; default: // printf (", NULL"); TestMap[row][col] = 0; break; }; } } return (0); stop: /* closing the .XLS file [Workbook] */ ret = freexl_close (handle); if (ret != FREEXL_OK) { fprintf (stderr, "CLOSE ERROR: %d\n", ret); return -1; } return (0); }