xlsx()包,是一个可以让R读、写、格式化xlsx文件的扩展包。
为什么不用相对有更多教程的RODBC包?
最重要的原因是RODBC包只能在32位系统下运行,而我的是64位系统,无法运行RODBC;其次是xlsx()包允许设置excel单元格的格式,功能还比较强大。
前不久用xlsx()包写了两个操作excel文件的脚本,遇到一些问题,将经验记录如下:
1.read.xlsx2()函数无法读取第一行是合并单元格的xlsx文件。
在读取的xlsx文件第一行是合并单元格时报错,无法通过调整startRow参数修改,只能手工删除第一行解决。
2.addDataFrame()函数多次写入同一个工作表,数据错乱。
> # 用loadWorkbook函数读取test.xlsx文件,存入wb.rr变量
> wb.rr <- loadWorkbook(paste(path,"test.xlsx",sep=""))
> # 用getSheets函数取出test.xlsx文件中的工作表
> sheets.in.rr <- getSheets(wb.rr)
> # sheet.rr是test.xlsx文件的第一张工作表
> sheet.rr <- sheets.in.rr[[1]]
> # 将rrtotaldata数据用addDataFrame函数写入到sheet.rr工作表里
> addDataFrame(rrtotaldata, sheet.rr, col.names=FALSE, row.names=FALSE, startRow=nrow(rrtotal)+1+1, startColumn=1)
出现了很奇怪的问题,在用addDataFrame对工作表写入数据时,不管startRow怎么设置,总要往上抹掉一行,而且在下面一行会写入一行原来最早输入的第一行数据,再往下如果按照startRow是跳过的,也会在下面写入新数据,然后在startRow设定的行数开始写数据。
百思不得其解,删掉数据的行名、列名,不排序,用原来的数据,试了很久都不行。但之前对另一个表使用addDataFrame函数都是正常的,而且参数几乎一致。想到是不是工作表对象没有关闭,导致写入数据错乱?
关掉R环境,重新加载,一次成功。
教训:对同一个对象连续应用addDataFrame函数要特别小心,上一次的运行可能会影响下一次的结果。