Как добавить пустые верхние строки в файл xlsx с помощью пакета xlsx? - PullRequest
1 голос
/ 30 июня 2011

Я хотел бы добавить две пустые строки в начало создаваемого мной файла xlsx.

пока я пробовал:

library("xlsx")
fn1 <- 'test1.xlsx'
fn2 <- 'test2.xlsx'

write.xlsx(matrix(rnorm(25),5),fn1)

wb <- loadWorkbook(fn1)
rows <- getRows(getSheets(wb)[[1]])
for(i in 1:length(rows)) 
    rows[[i]]$setRowNum(as.integer(i+1))

saveWorkbook(wb,fn2)

Но test2.xlsx пусто!

Ответы [ 2 ]

2 голосов
/ 23 июля 2011

Таким образом, пакет xlsx фактически взаимодействует с библиотекой java, чтобы загружать и изменять рабочие книги. Функции read.xlsx и write.xlsx - это удобные оболочки для чтения и записи фреймов данных в R без необходимости вручную писать код для самостоятельного анализа отдельных ячеек и строк с использованием объектов java. Функции loadWorkbook и getRows предоставляют вам доступ к фактическим объектам Java, которые затем можно использовать для изменения таких вещей, как стили ячеек.

Однако, если все, что вы хотите сделать, это добавить пустую строку в таблицу до ее вывода, самый простой способ - добавить пустую строку в фрейм данных перед ее экспортом (как упоминал Крис). Вы можете сделать это с помощью следующего варианта в вашем коде:

library("xlsx")
fn1 <- 'test1.xlsx'
fn2 <- 'test2.xlsx'

# I have added row.names=FALSE because the read.xlsx function
# does not have a parameter to include row names
write.xlsx(matrix(rnorm(25),5),fn1,row.names=FALSE)

# If you read your data back in using the read.xlsx function
# you will have a data frame rather than a series of java object references
wb <- read.xlsx(fn1,1)

# Now that we have a data frame we can add a blank row at the top
wb<-rbind.data.frame(rep("",5),wb)

# Then we write to the file using the same function as before
write.xlsx(wb,fn2,row.names=FALSE)

Если вы хотите использовать расширенные функциональные возможности в библиотеках java, некоторые из них в настоящее время не реализованы в пакете R, и, следовательно, вам придется вызывать их напрямую, используя .jcall. Если вы решите продолжить эту линию действий, я определенно рекомендую использовать .jmethods для создаваемых объектов (то есть .jmethods (row [[1]])), в котором будут перечислены доступные функции, которые вы можете использовать для объекта (на клеточном уровне). они довольно обширны).

2 голосов
/ 30 июня 2011

Меня немного смущает то, что вы пытаетесь сделать с помощью цикла for, но:

Вы можете создать фиктивный объект с тем же количеством столбцов, что и для wb, а затем использовать rbind ()присоединиться к манекену и ВБ, чтобы создать fn2.

fn1 <- 'test1.xlsx'
wb <- loadWorkbook(fn1)
dummy <- wb[c(1,2),]
# set all values of dummy to whatever you want, e.g. "NA" or 0
fn2 <- rbind(dummy, wb)
saveWorkbook( fn2)

Надеюсь, что поможет

...