从R内里底层哄骗Excel/xlsx(自动化陈诉福音)
好吧,我在eBay折腾的最多的就是生成自动化陈诉时候各类软件之间的彼此挪用,什么R啊,SAS啊,Teradata啊,Excel
啊,Python啊,横竖根基都有时机彼此挪用一下。每到此时我就深深感应选择一个library富厚的东西是何等的重要!You could
hardly expect what you colleagues are handy with!(P.s.
不要跟我提VBA这种逆天存在的对象。有哪个时间研究它你学点啥此外欠好…)
本日忍无可忍+脸色大好的折腾了一下R和excel。这个不是简朴的从R内里读写excel数据,而是真心用R去哄骗excel内里的单位格
(cell),除了读写数据之外还要界说样式什么的。excel作为一个奇葩的软件,you may never expect where
people would paste data to!
然后他们再自界说一堆样式(我恨这种点点鼠标就能改的对象,你丫又不是Photoshop…)。
可是没步伐,人家界说好的“高端洋气”的报表姿态你不能等闲动啊。只能乖乖的往内里paste数据。这件事虽说一次两次手动也就而已,三五次真的是要疯掉的。anyway,万事总有办理的途径…
好久以前从Yixuan 的博客上得知有xlsx这么个包,其时只记得这对象可以读写xlsx…直到后头折腾了一下才知道这货底层居然挪用的是Java的xlsx API,也就是说不消写Java也可以操纵xlsx了,yeah!
为了生成excel名目标自动化陈诉(不要问我为啥不消knitr,不消***,说起来都是泪呀!),我主要需要办理的就是:
第一个倒是满简朴的,就是较之yixuan代码内里的createWorkbook()
,改成loadWorkbook()
就可以了。然后就是找到相应的sheet,这个也满简朴的,一行getSheets
搞定。
然后第二步发起不要去操纵cell(太没效率了),直接操纵cellblock。CellBlock()
可以用来界说一个新的CellBlock,然后机动运用CB.setBorder()和CB.setColData()
就可以先增加边框、然后一列列填凑数据。这里利用按列填凑数据主要是因为R内里的Data Frame是一列一个数据名目标,一下子把一块儿都paste到excel的cellblock内里的话,会报错…BTW为了界说边框的样式,需要用到Border()
。雷同的还可以界说Fill和Font这些。
同上,较好不要直接用addDataFrame()
来直接贴数据…名目不能包围。假如是要在一个新的sheet上贴数据,那么就write.xlsx(sheetName="newsheet",append=T)
好了。不需要通过上述底层的API折腾了。
最后尚有一个较量有用的函数,autoSizeColumn()
可以用来自动调解列宽。全鼓捣完之后saveWorkbook()
生存就可以啦。
最后的最后,一个贵重的发起——都在R内里把数据整理好再去想输出到excel内里(什么reshape2啊,data.table啊,plyr
啊,该上的一起上啊!),千万别手贱在excel内里改一点点小对象…每一次都手动改一下下你的时间就被白白挥霍了好几分钟!珍爱生命,远离
excel…
附上一段我最后搞定自动化陈诉的代码:
library("xlsx")
test_template <- loadWorkbook("template.xlsx") #读入template.xlsx文件。界说好各类参差不齐的名目标。
design_tab <- getSheets(test_template)[["design"]] #转到design这个sheet。
data_block <- CellBlock(design_tab, 5,5,nrow(mydata),ncol(mydata)) #筹备贴数据的方块,我这里从第5行第5列开始贴。
border <- Border(color="black", position=c("LEFT", "RIGHT"),
pen=c("BORDER_THIN", "BORDER_THIN")) #界说边框样式——阁下玄色细直线。
for (i in 1:ncol(mydata))
{
CB.setBorder(data_block, border,colIndex = i,rowIndex=1:nrow(onetime_design_tab)) #给每一列都贴上边框
CB.setColData(data_block, mydata
[,i], i, rowOffset=0, showNA=F, colStyle=NULL)#给每一列贴数据
}
border_bottom <- Border(color="black", position=c("LEFT", "RIGHT","BOTTOM"),pen="BORDER_THIN") #界说末了行样式——底端黑细直线
data_block_bottom <- CellBlock(design_tab, 5+nrow(mydata
),5,1,ncol(mydata)) #选择最后一行
CB.setBorder( data_block_bottom, border_bottom, 1, 1:ncol(onetime_design_tab)) #界说最后一行名目
autoSizeColumn(design_tab, 5:(5+ncol(onetime_design_tab)))#调解列宽
saveWorkbook(test_template, file=output_xlsx_name) #生存
##add row data
write.xlsx(rawdata, file=output_xlsx_name, sheetName="raw_data",append=T,row.names=F) #直接贴原始数据,无名目
###add queries
R_file <- readLines(R_file_name, n=-1) #直接贴R代码
SQL_file <- readLines(SQL_file_name, n=-1)
write.xlsx(SQL_file, file=output_xlsx_name, sheetName="query_SQL",append=T,row.names=F) #直接贴代码到新的sheet中
write.xlsx(R_file, file=output_xlsx_name, sheetName="query_R",append=T,row.names=F)