从Excel .xlsm导入未知长度的表

时间:2015-10-09 11:10:04

标签: excel sas proc import-from-excel proc-sql

我想将表从Excel传输到SAS(版本为9.2,Excel文件格式为.XLSM,宏)。列名称将从单元格B3中读取,数据将从单元格B4开始,如下所示:

  A   B   C   D   E   F   G ...
1
2
3   Col1 Col2 
4    15   20
5    16   21
6    ... ...

问题是最后一行的编号是未知的,因为表长度今天可以是200行,明天可以是350行。

那么如何从Excel(.XLSM)将此表导入SAS表?

我在某处读到DATAROW Proc Import DBMS=EXCEL时我们可以使用proc import datafile = "!datafile" out=Table1 DBMS = EXCEL REPLACE; SHEET = "Sheet1"; GETNAMES=YES; MIXED=YES; USEDATE=YES; SCANTIME=YES; NAMEROW=3; DATAROW=4; run;

DATAROW

但是,SAS无法识别PROC SQL; CONNECT TO EXCEL (PATH='C:\\thepath\excelfile.xlsm'); Create Table Table1 as SELECT * FROM CONNECTION TO EXCEL (SELECT * FROM [Sheet1$]); DISCONNECT FROM EXCEL; QUIT; 选项,并提供错误:

  

错误180-322:声明无效或使用不正确。

还有另一种从Excel导入表的方法,如:

{{1}}

有谁知道如何将.XLSM中包含未知行数的表导出到SAS?

2 个答案:

答案 0 :(得分:0)

我发现"无效"替代解决方案,它读取Excel中的所有可能行(读取50.000行),同时检查列Col1下的每一行(如果这些行具有值)。

它需要7-8秒,它的工作原理。但正如我所写,读取整行50.000行感觉效果不佳。有没有人有更好的主意?

PROC SQL;
   CONNECT TO EXCEL            (PATH='C:\\thepath\excelfile.xlsm');
   Create Table Table1 as SELECT * FROM CONNECTION TO EXCEL 
   (SELECT * FROM [Sheet1$B3:C50000] WHERE Col1 IS NOT NULL);
   DISCONNECT FROM EXCEL;
QUIT;

答案 1 :(得分:0)

您可以使用libname语句直接连接到Excel:

libname xlsFile Excel 'C:\\thepath\excelfile.xlsm';

data want;
    set xlsFile.'Sheet1$'n(firstobs=3);
    where NOT missing(Col1);
run;

这假设您已在SAS服务器上安装了Excel,并购买了SAS / ACCESS到PC文件。