R - xlsx包 - 如何在不改变边框的情况下添加单元格颜色

时间:2017-01-27 10:06:52

标签: r excel xlsx

我正在尝试使用布局将表格导出到Excel。 我发现了很多关于xlsx包的信息以及如何使用它但是我的脚本仍然有问题。

我不知道如何使用颜色填充单元格,而不修改以前添加的边框。

作为一个例子,我创建了一个表(Test.txt),我想要为“Mass1”列的单元格着色,其值大于30。

这是我写的脚本:

library(xlsx)

Test<-read.table("Test.txt",sep="\t", dec=".", header = TRUE)

wb<-createWorkbook()
sheet <- createSheet(wb, "Sheet 1")

cs1 <- CellStyle(wb) + Alignment(horizontal="ALIGN_CENTER", vertical="VERTICAL_CENTER") + Border(color="black", position=c("TOP", "RIGHT" , "LEFT","BOTTOM"),pen=c("BORDER_MEDIUM","BORDER_MEDIUM","BORDER_MEDIUM","BORDER_MEDIUM"))
cs2 <- CellStyle(wb) + Border(color="black", position=c("LEFT","RIGHT","TOP", "BOTTOM"),pen=c("BORDER_THIN","BORDER_THIN","BORDER_THIN","BORDER_THIN"))

addDataFrame(Test, sheet, row.names = F, colnamesStyle=cs1, colStyle=list(`1`=cs2, `2`=cs2, `3`=cs2))

for(i in 1:nrow(Test) ){ 
  if(Test[i,2]>30){
    Row<-getRows(sheet, rowIndex=(i+1))
    Cell<-getCells(Row,colIndex = 2)
    cs3<- CellStyle(wb) + Fill(foregroundColor="lightblue", backgroundColor="lightblue", pattern="SOLID_FOREGROUND")    
    setCellStyle(Cell[[1]], cs3)
  }
}

saveWorkbook(wb, "Test.xlsx")

我的麻烦是细胞正确着色但底部边框消失了。我知道我可以在我的cs3风格中添加边框,但在我的真实剧本中,我的彩色单元格的底部边框并不总是相同的(有些是薄的,有些是中等的)。

如何在不修改这些边框的情况下考虑先前创建的边框以添加填充颜色?我想getCellStyle函数可以提供帮助,但是当我应用这个函数时,结果是“Formal Class jobjref”而不是“8的列表”,因为我的cs3风格......

2 个答案:

答案 0 :(得分:0)

对你来说可能为时已晚,但我认为你应该替换:

public string _MFormatNo(string _value, int _pFractions = 2)
{
    decimal _pvalue = Convert.ToDecimal(_value.Remove(','));
    string _Format = ".";
    string Value = "";
    for (int i = 0; i < _pFractions; i++)
    {
        _Format += "0";
    }
    if (_pvalue == 0)
    {
        Value = "0" + _pvalue.ToString(_Format);
    }
    Value = (_pvalue).ToString(_Format);
    return Value;
}

cs3<- CellStyle(wb) + Fill(foregroundColor="lightblue", backgroundColor="lightblue", pattern="SOLID_FOREGROUND") 

此致

答案 1 :(得分:0)

我发现了如何做!您需要使用getBorderLeft和其他三个功能获取单元格的边框样式,然后才能在设置单元格样式时恢复边框。

这里是一个示例,其中test.xlsx在位置B2上有一个带有一些边框的厚度为1的单元格,我们希望将其上色为黄色而不删除边框。

library(xlsx)

# load the workbook and get the sheet
wb <- loadWorkbook(file="test.xlsx")
SheetList <- getSheets(wb)
sheet <- SheetList[[1]]

# find the cell
row <- getRows(sheet, 2)
cells <- getCells(row, 2)
cell <- cells[[1]]

# get current borders
style <- getCellStyle(cell)
border <- c(style$getBorderLeft(), 
            style$getBorderTop(), 
            style$getBorderRight(),
            style$getBorderBottom()
           )

# construct new cell style; also works if there were no borders
new_style <- CellStyle(wb) + 
           Fill(backgroundColor = "yellow", 
                foregroundColor = "yellow",
                pattern         = "SOLID_FOREGROUND") +
           Border(color    = "black", 
                  position = c("LEFT", 
                               "TOP", 
                               "RIGHT", 
                               "BOTTOM"
                              )[border > 0])

# apply new cell style
setCellStyle(cell, new_style)
saveWorkbook(wb, "test2.xlsx")

边界厚度可以类似的方式处理。提示:在RStudio中,在样式对象的名称(在本示例中为$)之后键入style会显示所有可用方法的列表,这非常方便,因为{{ 1}}包。