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

Importing table with unknown length from Excel .xlsm

我想将 table 从 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    ... ...

问题是最后的行号未知,因为table长度今天可能是200行,明天可能是350行。

那么如何将 table 从 Excel (.XLSM) 导入 SAS-table?

我在某处读到我们可以在 Proc Import 中使用 DATAROWDBMS=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;

但是SAS无法识别DATAROW选项,报错:

ERROR 180-322: Statement is not valid or it is used out of proper order.

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

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;

有谁知道如何将行数未知的 table 从 .XLSM 导出到 SAS?

我找到了一个 "ineffective" 替代解决方案,它读取 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;

您可以使用 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 文件。