如何才能拿R读取Excel文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何才能拿R读取Excel文件相关的知识,希望对你有一定的参考价值。

R语言读取excel文件文件其实有很多的包可以做到,最常用的就是xlsx和readxl, 首先,安装并载入读取excel文件所用的包:
install.packages("xlsx") library(xlsx)

或者,
install.packages("readxl") library(readxl)

两个包的基本介绍
xlsx是用R把excel文件中的工作表以data.frame的格式读入R语言,他有两个常用函数,其中read.xlsx2通常会比read.xlsx读取的速度更快一些,因为它的好多工作是利用Java完成的,所以速度有所提升,但是在读取子数据集的时候没有read.xlsx稳定性好。
read.xlsx(file, sheetIndex, sheetName=NULL, rowIndex=NULL, startRow=NULL, endRow=NULL, colIndex=NULL, as.data.frame=TRUE, header=TRUE, colClasses=NA, keepFormulas=FALSE, encoding="unknown", ...)
read.xlsx2(file, sheetIndex, sheetName=NULL, startRow=1, colIndex=NULL, endRow=NULL, as.data.frame=TRUE, header=TRUE, colClasses="character", ...)
注:
sheetIndex:工作表单号
rowIndex:行号,就是你想读取那些行
header:表头,就是有没有列名。比如姓名,年龄,学号等
startRow:比如你想从第五行开始读取,就设置startRow = 5
readxl包可以用来读取xls和xlsx格式的文件
read_excel(path, sheet = 1, col_names = TRUE, col_types = NULL, na = "", skip = 0)
注:
sheet:读取的工作表
col_names: 如果是FALSE的话,就表示第一行不是列名,R会自动给你取成x1,x2...
colt_types: blank,numeric,date,text
na: 缺失值,默认空着的单元是缺失值,你也可以自己指定,比如认为999是缺失值
参考技术A   由于Excel文件都是通过DDE的方式打开的,如果在选项中设置了“忽略其他应用程序”,则Excel会忽略掉其他应用程序的DDE请求,所以当你通过资源浏览器来打开Excel文件时,Excel并不会执行打开命令。恢复设置的方法是:
  1、在Excel2003中双击不能打开文件:

  打开“工具”-“选项”-“常规”-“设置”,看到“忽略其他应用程序”前打了勾,取消这个选择,按“确定”,关闭Excel,双击Excel文件,顺利打开。
  2、在Excel2007及以上版本中双击不能打开文件:
  点击Excel 2007 菜单,选择Excel选项--高级---常规, 把“忽略使用动态数据交换(DDE)的其他应用程序”此处的勾去掉,关闭Excel,双击Excel文件,顺利打开。
  附:DDE简要说明

  DDE就是“动态数据传输”,主要用在两个EXE程序之间传送数据。

  比如:a.exe运行过程中要调用b.exe程序,但要告诉B从哪里开始运行,B从A处得到数据,再判断数据,就知道怎么运行了。

MFC中怎么读取Excel文件里的每个单元格内容

//第一步:打开文件
CFile f;
CFileException e;
// 打开文件
if (!f.Open("D:\\Book1.xls", CFile::modeRead, &e))

TCHAR szError[1024];
e.GetErrorMessage(szError, 1024);
AfxMessageBox(szError);
return;

//第二步:读取版本号
// 读取版本
while (dwPos < dwLen)

nRead = f.Read((void*)&RecNo, 2);
if (RecNo == XL_BOF)

WORD Ver, Type;
f.Read((void*)&RecLen, 2);
f.Read((void*)&Ver, 2);
f.Read((void*)&Type, 2);
f.Seek(RecLen, CFile::current);
int ver = 0;
switch (Ver)

case BIFF7:
ver = 7;
break;
case BIFF8:
ver = 8;
AfxMessageBox("Biff8");
break;

int type = 0;
switch (Type)

case WORKBOOK:
type = 5;
AfxMessageBox("Workbook");
break;
case WORKSHEET:
type = 16;
AfxMessageBox("Worksheet");
break;
case CHART:
type = 32;
AfxMessageBox("Chart");
break;

break;

dwPos = f.GetPosition();

//第三步:读其它数据
f.SeekToBegin();
dwPos = f.GetPosition();
// 读表格数据
while (dwPos < dwLen)

nRead = f.Read((void*)&RecNo, 2);
switch (RecNo)

case XL_BOF:

f.Read((void*)&RecLen, 2);
AfxMessageBox("Bof");

break;
case XL_BOUNDSHEET:

DWORD temp;
BYTE visi;
BYTE type;
TCHAR name;
f.Read((void*)&RecLen, 2);
f.Read((void*)&temp, 4);
f.Read((void*)&visi, 1);
f.Read((void*)&type, 1);
f.Read((void*)&StrLen, 2);
f.Read((void*)&name, StrLen);
char buf[128];
memset(buf, 0x0, 128);
strncpy(buf, &name, StrLen);
AfxMessageBox(buf);

break;
case XL_DIMENSION:
f.Read((void*)&RecLen, 2);
f.Seek(RecLen, CFile::current);
AfxMessageBox("Dimension");
break;
case 0xE2: // INTERFACED
f.Read((void*)&RecLen, 2);
AfxMessageBox("e2");
break;
case XL_SST:
f.Read((void*)&RecLen, 2);
f.Seek(RecLen, CFile::current);
AfxMessageBox("SST");
break;
case XL_NUMBER:
f.Read((void*)&RecLen, 2);
AfxMessageBox("Number");
break;
case XL_STRING:
f.Read((void*)&RecLen, 2);
AfxMessageBox("String");
break;
case XL_RK:
f.Read((void*)&RecLen, 2);
AfxMessageBox("RK");
break;
case XL_LABEL:

f.Read((void*)&RecLen, 2);
AfxMessageBox("Label");

break;
case 0xD6:
f.Read((void*)&RecLen, 2);
AfxMessageBox("RString");
break;
case XL_EOF:
dwPos = dwLen;
AfxMessageBox("Eof");
break;
default:
nRead = f.Read((void*)&RecLen, 2);
if (nRead == 0)
dwPos = dwLen;
break;


//第四步:关闭文件
f.Close();
参考技术A 有专门读写Excel操作的类,可以上网找下。

以上是关于如何才能拿R读取Excel文件的主要内容,如果未能解决你的问题,请参考以下文章

C#如何读取带密码的Excel文件

如何上传Excel直接读取里面的数据,不用鎒xcel文件后再读取

已知道Excel文件的密码,用JAVA如何读取?我原来用的是jxcell 但是这个包是收费的 有啥可以替换这个的吗

如何上传Excel直接读取里面的数据,不用鎒xcel文件后再读取

R读取excel文件的最佳方式

C#怎么读取Excel的数据