programing

포맷을 유지하면서 R에서 Excel로 템플릿에 쓰기

golfzon 2023. 4. 19. 23:43
반응형

포맷을 유지하면서 R에서 Excel로 템플릿에 쓰기

R에는 Excel(또는 csv)에 쓰고 멋진 형식으로 출력하는 데이터 프레임이 있습니다(예를 들어 셀 A1에서 시작하지 않고 테두리, 테이블 제목 포함).

현재 write.table 함수를 사용하여 데이터 프레임을 csv 파일에 쓴 후 데이터를 복사하여 Excel 문서에 붙여넣습니다.이때 테이블은 템플릿으로 포맷되어 있습니다.

데이터 프레임이 1개뿐인 경우에는 이 문제가 크게 발생하지 않지만, 이제 여러 데이터 프레임에 대해 실행하고 여러 탭에 걸쳐 Excel을 적용하고자 합니다.

모든 포맷을 올바르게 설정한 상태에서 데이터 프레임을 기존 Excel 스프레드시트의 특정 셀에 자동으로 복사할 수 있는 방법이 있습니까?

조란이 말했듯이 XLConnect 패키지를 가지고 있습니다.무엇이 가능한지를 정확하게 파악하려면 , 그 패키지의 메뉴얼 또는 Vignett를 주의 깊게 읽어 주세요.

XLConnect를 사용하면 스타일 동작을 "없음"으로 설정하지 않는 한 일반적으로 셀 스타일을 덮어씁니다.

setStyleAction(wb,XLC$"STYLE_ACTION.NONE")

올바른 길로 인도하기 위해 다음과 같은 간단한 예를 제시하겠습니다.

require(XLConnect)
wb <- loadWorkbook("test.xlsx", create=TRUE)
setStyleAction(wb,XLC$"STYLE_ACTION.NONE")

Data <- data.frame(
  a = 1:10,
  b = letters[1:10]
)

writeWorksheet(wb,Data,"aSheet",startRow=1,startCol=1,header=TRUE)

saveWorkbook(wb)

전에

여기에 이미지 설명 입력

끝나고

여기에 이미지 설명 입력


EDIT : Dirk Eddelbuettel에서 설명한 바와 같이,xlsx패키지.저는 개인적으로XLConnectxls와 xlsx를 모두 처리할 수 있고 EXCEL 파일 조작에 사용한 이전 패키지보다 훨씬 안정적이었습니다.아직 사용하지 않았습니다.xlsx패키지는 아직 없습니다.데이터 가져오기/내보내기 CRAN 페이지를 통해 사용 가능한 항목을 확인할 수 있습니다.

일부 사용자가 이 기능을 사용하는 방법을 문의하고 있었습니다.xlsx패키지.

매우 우수하고 광범위한 사용 예가 있습니다.xlsxSHDA에서 패키지화.

셀 포맷, 여러 개의 시트가 있는 워크북, 그림 추가 방법 등에 대한 예가 있습니다.

아래는 다음 기능을 기반으로 합니다.openxlsx여기서 워크북을 지정합니다(from_wb시트명/장소( )를 지정합니다.from_sheet스타일과 워크북( )이 있습니다.to_wb시트명/장소( )를 지정합니다.to_sheet스타일 전송처) :

주의: 저는purrr그리고.glue패키지도 있습니다만, 이것은 베이스 R로 고쳐 쓸 수 있습니다.

copyStyle <- function(from_wb, to_wb, from_sheet, to_sheet) {
  # check for workbook objects
  if (!(inherits(from_wb, "Workbook") && inherits(to_wb, "Workbook"))) { 
    stop("from_wb and to_wb must be Workbook objects.")
    }
  
  # get all sheet names from workbooks
  from_sheets <- from_wb$sheet_names
  to_sheets <- to_wb$sheet_names

  # convert sheets from numeric to sheet name. wb$styleObjects uses sheet name
  if (is.numeric(from_sheet)) {
      from_sheet <- from_wb$getSheetName(from_sheet)
  }
  
  if (is.numeric(to_sheet)) { 
      to_sheet <- to_wb$getSheetName(to_sheet)
  }

  # if sheet name given check that it exists
  if (is.character(from_sheet) && !from_sheet %in% from_sheets) {
    stop(glue::glue("{from_sheet} was not found in from_wb"))
  }
  
  if (is.character(to_sheet) && !to_sheet %in% to_sheets) {
    stop(glue::glue("{to_sheet} was not found in to_wb"))
  }
  
  # get from_wb sheet styles
  from_styles <- purrr::keep(from_wb$styleObjects, ~ .x$sheet == from_sheet)

  # add styles to to_wb
  purrr::walk(from_styles, ~ openxlsx::addStyle(to_wb, 
                                                to_sheet, 
                                                .x$style, 
                                                rows = .x$rows, 
                                                cols = .x$cols))
  return(to_wb)
}

사용.

library(openxlsx)

wb <- loadWorkbook("getStyle.xlsx")

new_wb <- write.xlsx(head(iris), "transfer_style.xlsx")
# can give sheet name or index
copyStyle(from_wb = wb, to_wb = new_wb, from_sheet = "Sheet1", to_sheet = 1)

# must save workbook after copying style
saveWorkbook(new_wb, "transfer_style.xlsx", overwrite = T)

입력

getStyles.xlsx는 여러 시트에 여러 스타일이 있는 로컬 Excel 워크북입니다.

스타일에 대해서.

산출량

transfer_styles.xlsx:

transfer_styles를 선택합니다.

언급URL : https://stackoverflow.com/questions/11228942/write-from-r-into-template-in-excel-while-preserving-formatting

반응형