【IDL】 读写Excel的方法总结

Excel文件是在做影像处理时常用到的格式,用IDL读取的话有下面几种方法。

1、 Excel文件转存为其他格式,如txt或csv;

推荐CSV(逗号分隔值文件),IDL作为ASCII码文件直接读取解析,快捷方便;

2、 用IDL的Excel读取补丁来读取,这个是基于COM的,得仔细读下说明;

附扩展功能包。

3、 用IDL的DataMiner,它是一个开放数据库连接( ODBC )接口,借助它IDL用户可快速访问、查询并管理ODBC兼容数据库,同时也支持Oracle、Informix、Sybase、MS SQL Server等大型商用数据库。

详细调用请参考下面示例代码与注释:

;

;IDL下调用ODBC读取Excel

;

PRO Using_ODBC_EXCEL

  filename = file_dirname(ROUTINE_FILEPATH('Using_ODBC_EXCEL'))+'\data.xlsx'

  ; 判断是否支持数据库功能

  IF DB_EXISTS() EQ 0 THEN BEGIN

   msg = DIALOG_MESSAGE('不支持ODBC!',/Error)

   RETURN

  ENDIF

  ; 新建数据库对象

  oDatabase = OBJ_NEW('IDLdbDatabase')

  ; 检查当前可用数据类型

  sources = oDatabase->GETDATASOURCES()

  index = WHERE(sources.DATASOURCE EQ 'Excel Files',count)

  IF count EQ 0 THEN BEGIN

   msg = DIALOG_MESSAGE('ODBC无法读取Excel Files',/Error)

   OBJ_DESTROY,oDatabase

   RETURN

  ENDIF

  ;连接数据库

  IF ~FILE_TEST(filename) THEN BEGIN

   msg = DIALOG_MESSAGE('找不到数据库文件!',/Error)

   OBJ_DESTROY,oDatabase

   RETURN

  ENDIF

  ; 连接到我们指定的数据库文件

 oDatabase->CONNECT,DATASOURCE='Excel Files;DBQ='+filename

  ;连接数据库

 oDatabase->GETPROPERTY,IS_CONNECTED = connectStat

  IF connectStat EQ 0 THEN BEGIN

   msg = DIALOG_MESSAGE('数据库连接不成功...',/Error)

   OBJ_DESTROY,oDatabase

   RETURN

  ENDIF

 

  ;读取数据库内数据,获取数据表

  tables = oDatabase->GETTABLES()

  nTables = N_ELEMENTS(tables)

  FOR i=0, nTables-1 DO BEGIN

   ; 操作指定表,注意表名,要加“[]”。

   tname = '[' + tables[i].NAME + ']'

   PRINT, 'table name', tname

   

   oRecordset = OBJ_NEW('IDLdbRecordset',oDatabase,table=tname);, SQL=sqlstr)

   ; 获取字段信息

   oRecordset->GETPROPERTY,field_info = fieldinfo

   NFileds = N_ELEMENTS(fieldinfo)

   ;获取数据表中的记录数目

   IF oRecordset->MOVECURSOR(/first) THEN BEGIN     

     FOR j=0, NFileds-1 DO BEGIN

       Value = oRecordset->GETFIELD(j)

       PRINT, 'Talbe: ' + (fieldinfo.TABLE_NAME)[j] + ', ' + $

         'Filed Name: ' + (fieldinfo.FIELD_NAME)[j] + ', ' + $

         'Value: ', Value

     ENDFOR     

     WHILE oRecordset->MOVECURSOR(/next) DO BEGIN       

       FOR j=0, NFileds-1 DO BEGIN

         Value = oRecordset->GETFIELD(j)

         PRINT, 'Talbe: ' + (fieldinfo.TABLE_NAME)[j] + ', ' + $

           'Filed Name: ' + (fieldinfo.FIELD_NAME)[j] + ', ' + $

           'Value: ', Value

       ENDFOR

     ENDWHILE

   ENDIF ELSE BEGIN ; 一条记录都没有

     msg = DIALOG_MESSAGE('数据表无记录',/Infor)

     OBJ_DESTROY, oRecordset     

   ENDELSE   

   ; 销毁数据库对象

   OBJ_DESTROY, oRecordset

  ENDFOR

  OBJ_DESTROY,oDatabase

END

 

posted @   地理遥感生态网平台  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示