9.6 Arquivos Excel

O armazenamento de dados em formato Excel (arquivos com extensões .xls e .xlsx) é uma prática muito popular, principalmente em empresas privadas. Entretanto, arquivos em formato Excel tem problemas de interação com sistemas de controle de versões. Se a rastreabilidade das mudanças em seus dados é importante, trabalhar com arquivo texto é uma boa opção. O formato CSV é facilmente importado no Excel e por isso é um formato texto amplamente utilizado. Uma solução é converter as planilhas Excel para csv usando algum programa.

Mas caso isso não seja viável, você verá as opções mais eficientes para processar arquivos Excel no R.

Importar ou exportar dados neste formato para o R era trabalhoso devido a dependências dos pacotes em programas externos (Excel, Java, Perl, etc). Mas nos últimos esta tarefa deixou de ser um obstáculo.

Há uma variedade de pacotes para processar dados em Excel, entre eles estão: gdata, XLConnect, xlsx, openxlsx, readxl, writexl e WriteXLS.

Na seção 9.4.1 vimos que o pacote rio importa diversos formatos de arquivos, inclusive Excel (Tabela 9.1). A função import() utiliza a função read_excel()do pacote readr para importar arquivos Excel. A função export(), por outro lado, utiliza a função write.xlsx() do pacote openxlsx.

Além do uso do pacote rio para exportar arquivos xlsx, veremos também o pacote writexl por ter uma exportação mais rápida que a usada no pacote rio.

9.6.1 Como usar

Vamos baixar um arquivo .xls para usar com a função import() do pacote rio.

excel_file_url <- "https://github.com/lhmet/adar-ufsm/blob/master/data/Esta%C3%A7%C3%B5es%20Normal%20Climato%C3%B3gica%201981-2010.xls?raw=true"
dest_file_excel <- file.path(
  tempdir(),
  "Estacoes-Normal-Climatologica-1981-2010.xls"
)
download.file(
  url = excel_file_url,
  destfile = dest_file_excel,
  mode = "wb"
)

Agora podemos importar o arquivo baixado com o pacote rio.

inmet_estacoes <- import(
  file = dest_file_excel,
  col_names = TRUE,
  skip = 3
)
head(inmet_estacoes)

9.6.2 Escrita de arquivos excel no formato .xls

Vamos alterar os nomes das variáveis para minúsculo e escrever o quadro de dados em novo arquivo .xls.

names(inmet_estacoes) <- tolower(names(inmet_estacoes))
head(inmet_estacoes)

Peraí! Mas o rio não suporta a opção de exportar arquivos no formato .xls (confira na Tabela 9.1). Uma alternativa, caso você ainda realmente precise escrever os dados no formato xls, é o pacote WriteXLS, no entanto ele possui dependência da linguagem PERL.

library(WriteXLS)
arq_xls_temp <- file.path(tempdir(), basename(dest_file_excel))
WriteXLS(x = inmet_estacoes, ExcelFileName = arq_xls_temp)
file.exists(arq_xls_temp)
# conferindo
head(
  import(
    file = arq_xls_temp,
    col_names = TRUE
  )
)

9.6.3 Escrita de arquivos excel no formato .xlsx

Se algum dia, você precisa entregar uma penca de arquivos em formato Excel, então valerá a pena saber qual das opções de escrita de arquivos xlsx é mais eficiente.

No trecho de código abaixo vamos fazer essa comparação usando a tabela inmet_estacoes da seção 9.6.2. As funções avaliadas são a writexl::write_xlsx e a openxlsx::write.xlsx.

tempos_escrita_xlsx <- microbenchmark(
  writexl = write_xlsx(inmet_estacoes, tempfile()),
  openxlsx = write.xlsx(inmet_estacoes, tempfile()),
  times = 5
)
tempos_escrita_xlsx

A função microbenckmar::microbenckmark usada acima toma os tempos das expressões que foram avaliadas arbitrariamente 5 vezes.

O resultado é que a writexl::write_xlsx() é bem mais rápida na escrita dos dados que a openxlsx::write.xlsx.

9.6.4 Estrutura de dados não tabulares

Dados em arquivos Excel estão geralmente sujeitos a manipulação mais frequente de forma que sua estrutura pode não ser tabular, com mais de uma tabela por planilha, comentários em células vizinhas aos valores, células aninhadas, células formatadas e etc. Se você precisa arrumar dados nessas condições, vale a pena conferir os pacotes tidyxl e unpivotr.