[注意:我在下面插入了一行,并添加了对我的具体情况的详细说明。我留下原来的描述,因为汤姆的回答是基于它的。]
在Win10Pro下使用SAS 9.4(32位)和Excel 2013(32位)。
在SAS中,我使用以下代码在现有工作簿中创建了一个新的Excel工作表:
proc export data=sashelp.air file="C:\Users\user1\Desktop\test1.xlsx"
dbms=XLSX replace;
sheet="AirlineData";
run;
我关闭了SAS,在Excel中打开了工作簿,看到了我的原始工作表以及包含预期数据的新AirlineData表(标题加上144个数据行)。到目前为止,非常好。
我关闭了Excel,打开了SAS,并执行了以下SAS语句:
options validmemname=extend;
libname desktop "C:\Users\user1\Desktop\test1.xlsx";
我打开SAS Explorer并导航到库“Desktop”并看到了三个工作表:
当我双击Sheet1 $时,我看到了原始数据,但当我双击其他任何一个名字时,我看到的只是空表,如下所示:
F1 F2
1
2
3
细胞是空的,但有144个观察结果。标题行被忽略。
我执行了PROC PRINT DATA=desktop.airlinedata
并在结果查看器中看到了同样的事情:名为F1和F2的变量有144个空的观察值。
然而,当我清除libref并运行以下内容时,我得到了一个包含预期数据的SAS数据集(两个变量,144个观察值):
proc import datafile="C:\Users\user1\Desktop\test1.xlsx" dbms=xlsx OUT=testit
replace;
sheet="AirlineData";
run;
因此,当我使用PROC EXPORT
创建工作表时,我无法通过libref使用工作表。
我做错了吗?
[新说明]
摘要:问题是在现有工作簿中创建新工作表时EXCEL和XLSX引擎的工作方式。两个引擎是否应该可以互换可能有争议,但在我看来,如果SAS正确地创建一个新工作表,它应该能够用任何引擎读取它。
实际上,如果您使用XLSX引擎使用PROC EXPORT
创建新工作表,但使用LIBNAME <libref> [EXCEL] <path\file.xlsx>
通过EXCEL引擎读取它,那么“PROC PRINT”或“DATA”等方法'步骤将无法正确读取。但是,如果使用EXCEL引擎使用PROC EXPORT
创建它,则SAS可以使用带有XLSX 或 EXCEL引擎的LIBNAME
语句来读取它。
第1步:
Workbook test.xlsx是在Excel 2013中创建的,包含三行四位数字。
proc export data=sashelp.air file="C:\Users\user1\Desktop\test.xlsx"
dbms=XLSX replace;
sheet="AirlineData";
run;
关闭SAS。 Excel以正常方式显示AirlineData工作表。关闭Excel。
重新打开SAS,执行:
1 PROc import datafile="C:\Users\user1\Desktop\test.xlsx" dbms=xlsx OUT=xx replace;
2 sheet="AirlineData";
3 run;
NOTE: WORK.XX data set was successfully created.
NOTE: The data set WORK.XX has 144 observations and 2 variables.
数据集XX似乎是具有正确航空公司数据的普通SAS数据集。
现在执行:
6 options validmemname=extend;
7 libname xldata XLSX "C:\Users\user1\Desktop\test.xlsx";
NOTE: Libref XLDATA was successfully assigned as follows:
Engine: XLSX
Physical Name: C:\Users\user1\Desktop\test.xlsx
库xldata下的SAS Explorer显示“SHEET1”和“AIRLINEDATA”,但SAS查看器不会打开任何一个(前面描述的问题,并且报告给SAS支持)。
但是,PROC PRINT
和DATA
步骤会按预期打印并复制两个工作表中的数据。
现在执行:
8 options validmemname=extend;
9 libname xldata "C:\Users\user1\Desktop\test.xlsx";
NOTE: Libref XLDATA was successfully assigned as follows:
Engine: EXCEL
Physical Name: C:\Users\user1\Desktop\test.xlsx
注意EXCEL是引擎。
库xldata下的SAS Explorer显示“Sheet1 $”。 “AirlineData”和“AirlineData $”。
PROC PRINT
在AirlineData $中也没有发现任何观察结果,并从AirlineData打印出144个空的观察结果。
DATA
步也在AirlineData $中找不到任何观察结果,并从AirlineData复制144个空观察值。
第2步:
Excel工作簿test2.xlsx是原始test.xlsx的副本(通过在Windows中复制而创建)。
28 LIBNAME xldata clear; * Just in case;
NOTE: Libref XLDATA has been deassigned.
29 proc export data=sashelp.air file="C:\Users\user1\Desktop\test2.xlsx"
30 dbms=EXCEL replace;
31 sheet="AirlineData";
32 run;
NOTE: "AirlineData" range/sheet was successfully created.
关闭SAS。 Excel以正常方式显示AirlineData工作表。关闭Excel。
重新打开SAS,执行:
1 PROc import datafile="C:\Users\user1\Desktop\test2.xlsx" dbms=EXCEL OUT=xx replace;
2 sheet="AirlineData";
3 run;
NOTE: WORK.XX data set was successfully created.
NOTE: The data set WORK.XX has 144 observations and 2 variables.
数据集XX似乎是具有正确航空公司数据的普通SAS数据集。
现在执行:
4 options validmemname=extend;
5 libname xldata xlsx "C:\Users\user1\Desktop\test2.xlsx";
NOTE: Libref XLDATA was successfully assigned as follows:
Engine: XLSX
Physical Name: C:\Users\user1\Desktop\test2.xlsx
库xldata下的SAS Explorer显示“SHEET1”和“AIRLINEDATA”,但SAS查看器不会打开任何一个(与上面相同的问题)。
如上所述,PROC PRINT
和DATA
步骤按预期打印并复制两个工作表中的数据。
现在执行:
12 options validmemname=extend;
13 libname xldata "C:\Users\user1\Desktop\test2.xlsx";
NOTE: Libref XLDATA was successfully assigned as follows:
Engine: EXCEL
Physical Name: C:\Users\user1\Desktop\test2.xlsx
注意EXCEL是引擎。
库xldata下的SAS Explorer显示“Sheet1 $”。 “AirlineData”和“AirlineData $”。 SAS查看器打开所有三张纸,没有任何问题。
此外,PROC PRINT
和DATA
步骤会按预期打印并复制所有三个工作表中的数据。
答案 0 :(得分:2)
确保在libname语句中使用XLSX引擎。
此代码适用于我,但它是从头开始创建XLSX文件,而不是使用已由其他软件创建的文件。
制作XLSX文件并关闭它。
libname out xlsx '~/test/test1.xlsx';
data out.class ; set sashelp.class; run;
libname out ;
再次打开它并添加一个新表。
libname out xlsx '~/test/test1.xlsx';
data out.air; set sashelp.air; run;
libname out;
再次打开它并读出数据。
libname in xlsx '~/test/test1.xlsx';
proc copy inlib=in outlib=work;
run;
libname in ;
答案 1 :(得分:0)
我向SAS支持报告了这些问题。
他们确认第一个问题(OP中的行之上)与使用XLSX引擎查看 Excel工作表严格相关。他们承认XLSX引擎目前功能有限。
对于第二个问题(在OP下面的行下面),支持认为它代表了一个错误。他们说他们会联系研发部门。