【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

浙公网安备 33010602011771号