【问题标题】:How to use xlsx package to insert blank column in Excel如何使用 xlsx 包在 Excel 中插入空白列
【发布时间】:2019-07-14 12:56:39
【问题描述】:

如何在现有 Excel 文件中插入空白列,同时保留该列中的数据?

我有跨多列(每列一年)的时间序列数据,最后是汇总数据(最小值、最大值、百分位数)。

我想使用 R 插入一个包含新年数据的列,但我目前的代码粘贴在摘要数据之上。

代码已概括如下:

# Add necessary packages
library(rJava)
library(xlsx)
library(xlsxjars)

# Import data. Assume 1 column of data
df <- read.csv("file.csv", header = TRUE)

# Create a workbook using library(xlsx) function
workbook <- loadWorkbook("existing_workbook.xlsx")

# Import sheet names from above workbook
sheets <- getSheets(workbook)

# Add the created dataframe into the workbook.
# Assume the workbook has 100 existing columns and data is to be added to column 99
addDataFrame(df, sheets$correct_sheet, startColumn = 99, row.names = FALSE)

#Save the created workbook
saveWorkbook(workbook, "R_Output.xlsx")

这最终会覆盖第 99 列中的数据,我希望将其向右移动一列。

这可能吗?

【问题讨论】:

    标签: r dataframe r-xlsx


    【解决方案1】:

    你可以很简单地做到这一点。想法是在第 100 列中复制第 99 列,然后将 df 写入第 99 列。由于您不提供数据,因此我制作了一个可重复的小示例。我的existing_workbook.xlsx 只有两列。我将第 2 列移动到第 3 列,然后将 file.csv 中的数据添加到第 2 列。更新后的数据库将在第 2 列之前“插入”新列。

    首先是一些数据

    library(xlsx)
    
    ## Create some reproducible data for testing
    write.csv(1:150, "file.csv", row.names=FALSE) 
    df = data.frame(X = seq(2,300,2), Y=rep(LETTERS, length.out=150))
    wb <- xlsx::createWorkbook()
    sheet1 <- xlsx::createSheet(wb, sheetName='test')
    addDataFrame(df, sheet1, col.names=TRUE, row.names=FALSE)
    saveWorkbook(wb, 'existing_workbook.xlsx')
    

    现在我们有了文件file.csvexisting_workbook.xlsx,就像您的代码一样。我的代码和你的一样开始加载数据。

    ## Your input statements
    df <- read.csv("file.csv", header = TRUE)
    workbook <- loadWorkbook("existing_workbook.xlsx")
    sheets <- getSheets(workbook)
    
    # Import sheet names from above workbook
    sheets <- getSheets(workbook)
    

    现在我将第 2 列复制到第 3 列以保留它。

    ## Move a copy of column 2 to column 3
    columnToPreserve = readColumns(sheets$test, 2, 2, startRow=1)
    addDataFrame(columnToPreserve, sheets$test, 
        startColumn = 3, row.names = FALSE)
    

    现在我们可以将 df 写入第 2 列,而不会丢失旧的第 2 列。

    ## Now we can write df into column 2
    addDataFrame(df, sheets$test, startColumn = 2, row.names = FALSE)
    
    ## Save elsewhere to make sure it was right
    saveWorkbook(workbook, 'updated_workbook.xlsx')
    

    如果您在 excel 中打开 updated_workbook.xlsx,您应该会看到插入的列。

    【讨论】:

    • 感谢 G5W,我使用自己的数据尝试了此解决方案,但一直收到错误消息。然后,我尝试将您的代码与您即时生成的数据一起使用并收到相同的错误。见下文:Error in .jcall(Rintf, "[S", "readRowStrings", .jcast(sheet, "org/apache/poi/ss/usermodel/Sheet"), : java.lang.NoSuchFieldError: CREATE_NULL_AS_BLANK Error in readColumns(sheets$test, 2, 2, startRow = 1) : Cannot read the header. The header row doesn't have all requested cells non-blank!
    • 附带说明,周末我发现了 XLConnect 包并尝试了同样的方法;将所需的单元格复制到数据框中,粘贴新数据,将数据框粘贴到右侧一列。这适用于除一个汇总单元格之外的所有单元格(标准偏差)。如果您愿意阅读,我在 XLConnect 的 Github 页面上发布了我的步骤here
    • 奇数。它对我有用。我什至从一个新的 R 会话开始运行代码并且它有效。无论如何,我很高兴你找到了解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多