楼主: 甲氟喹3
8534 14

[有偿编程] sas一次性导入一个excel文件 其中含有多张sheet [推广有奖]

11
luekemia 发表于 2019-7-8 17:10:11 |只看作者 |坛友微信交流群
应该是要这种效果吧:

libname myxls odbc
        required="Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};
dbq=C:\multi_sheets.xlsx;ReadOnly=True";

proc sql noprint;
select memname into :tbl_names separated by '|' from sashelp.Vtable
where libname = 'MYXLS'
;quit;

%macro gentbls;
%let i=1;
%do %until (%scan(&tbl_names,&i.,|)=);
%let tbl = %scan(&tbl_names,&i.,|);
data _null_;
call symput('t',substr("&tbl.",1,length("&tbl.")-1));
run;
data &t.;set myxls."&tbl."n;run;
%let i = %eval(&i.+1);
%end;
%mend;

%gentbls;

libname myxls clear;

使用道具

12
Cecilia_Xi 在职认证  发表于 2020-3-6 21:36:49 |只看作者 |坛友微信交流群
  1. 先建立一个带sheet name的数据集,再使用macro调用
复制代码
  1. data excel;
  2.     input sheet $9.;
  3.         datalines;
  4. sheet1
  5. biao2  
  6. try3  
  7. test4  
  8. finalyeah
  9. ;
  10. run;

  11. proc sql;
  12.       select sheet into: sheet separated by ' '
  13.           from excel;
  14. quit;

  15. %macro Import;
  16.         %do i=1 %to %sysfunc(countw(&Sheet));
  17.         %let sheetname=%scan(&sheet,&i,' ');

  18.     PROC IMPORT OUT=WORK.&sheetname
  19.        DATAFILE= "保存路径\multiple_xlsx.xlsx"
  20.             DBMS=EXCEL REPLACE;
  21.      RANGE="&sheetname.$";
  22.      GETNAMES=YES;
  23.      MIXED=NO;
  24.      SCANTEXT=YES;
  25.      USEDATE=YES;
  26.      SCANTIME=YES;
  27. RUN;
  28.         %end;
  29. %mend;
  30. %Import;
复制代码

使用道具

13
335845131 发表于 2020-5-5 22:50:51 |只看作者 |坛友微信交流群
原理是利用将excel变成xml,读取其中所有表名然后按表名导入数据集。

  1. %macro sheetnames(xlsxfile=);
  2.         filename _WRKBOOK ZIP "&xlsxfile" member='xl/workbook.xml';
  3.     filename _XMLFIL      "%sysfunc(pathname(WORK))\workbook.xml";

  4.         data _null_;
  5.         infile _WRKBOOK recfm=n ;
  6.         file   _XMLFIL   recfm=n;
  7.         input char $char1. @@;
  8.         put char $char1. @@;
  9.     run;

  10.    
  11.     filename  _SXLEMAP "%sysfunc(pathname(WORK))\xmlmap.map";
  12.     libname   _XMLFIL xmlv2 automap=replace xmlmap=_SXLEMAP access=READONLY;

  13.         data sheetnames;
  14.        
  15.             set _xmlfil.sheet;
  16.         run;

  17.         data _null_;
  18.                 set sheetnames nobs=t;
  19.                
  20.                 retain i 1;

  21.                 call symput("sheet_number",t);
  22.        
  23.                 %if i<=t %then %do;
  24.                         put i=;
  25.                        
  26.        
  27.                     call symput("SHEET"||left(i),sheet_name);
  28.                
  29.                         %end;
  30.                 i=i+1;
  31.         run;
  32.        
  33.                 %put &sheet_number;
  34.                 %put &&sheet3;
  35.                 %do k=1 %to &sheet_number;
  36.                         proc import datafile="&xlsxfile"
  37.                                 dbms='xlsx'
  38.                                 out=&&sheet&k
  39.                                 replace;
  40.                                 GETNAMES=NO;

  41.                                 sheet=&&SHEET&k;
  42.                         run;
  43.                 %end;
  44.        

  45.         %mend;
复制代码


使用道具

14
铃铛响起 发表于 2020-8-12 13:33:08 |只看作者 |坛友微信交流群
Cecilia_Xi 发表于 2020-3-6 21:36
这个亲测可用了

使用道具

15
经管用户2020 发表于 2021-8-15 15:55:29 |只看作者 |坛友微信交流群
luekemia 发表于 2019-7-8 17:10
应该是要这种效果吧:

libname myxls odbc
这个好用。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-23 16:26