R: Leitura e gravação de arquivos do Excel

Última atualização: 2026-08-26

Na aula anterior, aprendemos sobre CSV, mas 60% dos dados em projetos reais são armazenados no Excel — gerentes, vendedores e profissionais da área financeira gostam de compartilhar arquivos do Excel. Nesta aula, aprenderemos a abordagem padrão para ler e gravar arquivos do Excel no R: readxl + writexl, que não depende do Java (ao contrário do pacote xlsx, que requer o JDK).

Ao concluir esta aula, você será capaz de ler demonstrações financeiras distribuídas por várias planilhas e criar relatórios formatados no Excel.

1. O que você vai aprender



2. A história de um relatório financeiro mensal

(1) Problema: 30 tarefas no Excel estão me deixando louco

Alice trabalha na área financeira e precisa compilar os “relatórios mensais de vendas” de 30 filiais no início de cada mês:

Se você usar o Power Query integrado ao Excel, o processamento entre arquivos é complicado; usar Python openpyxl é lento; e usar R xlsx exige a instalação do Java—

(2) Solução utilizando R

R
# 1. Packing(Not dependent on Java)
install.packages("readxl")
install.packages("writexl")

# 2. List all Excel Documents
files <- list.files("reports/", pattern = "\\.xlsx$", full.names = TRUE)

# 3. Read all in bulk sheet
library(readxl)
all_data <- lapply(files, function(f) {
  list(
    sales = read_excel(f, sheet = "Sales Details"),
    payment = read_excel(f, sheet = "Payment"),
    stock = read_excel(f, sheet = "Inventory")
  )
})

# 4. Consolidated Analysis
library(dplyr)
combined <- bind_rows(lapply(all_data, function(d) d$sales))

Apenas 5 linhas de código para processar 30 arquivos do Excel × 3 planilhas = 90 planilhas. Esse é o poder do readxl.

100%
graph TB
    A[30 branch offices Excel Documents] --> B[list.files List]
    B --> C[lapply Batch Read]
    C --> D[excel_sheets check sheet]
    D --> E[read_excel Each sheet]
    E --> F[bind_rows Merge]
    F --> G[group_by + summarise Summarize]
    G --> H[write_xlsx Generate Report]

    style A fill:#cce5ff
    style B fill:#d4edda
    style C fill:#fff3cd
    style D fill:#f8d7da
    style E fill:#e1d4ff
    style F fill:#ffe1d4
    style G fill:#cce5ff
    style H fill:#d4edda

3. Três formatos de arquivos do Excel

100%
mindmap
    root((Excel Documents<br/>3 Type of Format))
        .xlsx
            Excel 2007+
            Maximum @,000 rows of
            Modern Standards
            Tools: readxl / openxlsx
        .xls
            Excel 97-2003
            Maximum 65536 row
            Old Format
            Tools: readxl
        .xlsm
            Enable Macros
            Contains VBA
            Tools: readxl Do not read macros
        Select
            New Project: .xlsx
            Old data: .xls
            Han Hong: .xlsm

(1) Comparação de formatos

Formato Extensão do arquivo Número máximo de linhas e colunas Compatibilidade Legibilidade
Excel 2007+ .xlsx 1048576 × 16384 Padrão Moderno readxl / openxlsx
Excel 97-2003 .xls 65536 × 256 Formato antigo readxl
Ativar macros no Excel .xlsm Igual ao xlsx Contém VBA readxl (não carrega macros)

(2) Comparação de três pacotes do R para leitura de arquivos do Excel

Pacote Dependências Velocidade Recursos Recomendação
readxl R puro (C++) Rápido Somente leitura ⭐⭐⭐ A melhor opção para leitura
writexl R puro (C++) Rápido Somente gravação ⭐⭐⭐ A melhor opção para gravação
openxlsx R puro Chinês Leitura/Gravação + Formatação ⭐⭐ Use quando for necessária formatação
xlsx Requer Java Lento Leitura/gravação + fórmulas ❌ Não recomendado (alta dependência)
💡 Dica: Para dados somente leitura que não exigem formatação, use readxl + writexl (o método mais simples); Para dados que exigem formatação de células ou fórmulas, use openxlsx; Evite usar o pacote xlsx (requer Java).



4. Quatro funções principais do readxl

(1) Tabela de referência rápida de funções

Função Finalidade
read_excel() Ler arquivos .xlsx ou .xls (detectados automaticamente)
read_xlsx() .xlsx somente leitura (mais rápido)
read_xls() .xls somente leitura (formato antigo)
excel_sheets() Listar todos os nomes das planilhas
R
library(readxl)

# 1. List all sheet
sheets <- excel_sheets("report.xlsx")
print(sheets)
# [1] "Sales Details" "Payment"     "Inventory"    

# 2. Read as Specified sheet
sales <- read_excel("report.xlsx", sheet = "Sales Details")
# or press sheet Number
sales <- read_excel("report.xlsx", sheet = 1)

# 3. Read All sheet(Back list)
all_sheets <- lapply(excel_sheets("file.xlsx"), function(name) {
  read_excel("file.xlsx", sheet = name)
})
names(all_sheets) <- excel_sheets("file.xlsx")

(2) 8 parâmetros comuns do read_excel

Parâmetro Função Exemplo
path Caminho do arquivo "data/sales.xlsx"
sheet nome ou número da folha 1 ou "Sales Details"
range Faixa de leitura "A1:D100" ou "A1:D100"
col_names TRUE / Vetor personalizado TRUE
col_types Tipo de lista "text", "numeric", "date"
na Marcador NA c("", "NA")
skip Pular linhas 2 (Pular linha de cabeçalho)
n_max Número máximo de linhas a serem lidas 1000

(3) Prática: Parâmetros comuns

R
# 1. Specification sheet
df <- read_excel("data.xlsx", sheet = "Sales Details")

# 2. Specified Range(Avoid reading comments outside the table header)
df <- read_excel("data.xlsx", range = "A1:D1000")

# 3. Skip the header row
df <- read_excel("data.xlsx", skip = 2)

# 4. Read-only 1000 row
df <- read_excel("data.xlsx", n_max = 1000)

# 5. Specify Column Type
df <- read_excel("data.xlsx", col_types = c("text", "numeric", "date"))

# 6. Custom NA
df <- read_excel("data.xlsx", na = c("", "NA", "N/A"))


5. Explicação detalhada do parâmetro read_excel

(1) O parâmetro sheet

R
# Method 1:sheet name(Recommendations)
df <- read_excel("data.xlsx", sheet = "Sales Details")

# Method 2:sheet number(Starting from 1)
df <- read_excel("data.xlsx", sheet = 1)

# Method 3:NULL(By default, read the first one)
df <- read_excel("data.xlsx")

(2) O parâmetro range (o mais útil)

O Excel geralmente contém cabeçalhos, comentários e linhas em branco. Especifique um intervalo para uma leitura precisa:

R
# 1. String Range
df <- read_excel("data.xlsx", range = "A1:D100")

# 2. Anchor Cell(Automatically expand to non-empty areas)
df <- read_excel("data.xlsx", range = "A1:D1")  # Read-only 1 row(Automatic Scaling)

# 3. Complete A1 Quote
df <- read_excel("data.xlsx", range = "A1:Z1000")

# 4. Naming Area(Excel as defined in Named Range)
df <- read_excel("data.xlsx", range = "SalesTable")

(3) O parâmetro col_types

R
# Method 1:String Shorthand
col_types = c("text", "numeric", "date", "guess", "skip")

# Method 2:List
col_types = list(
  text,        # Character
  numeric,     # Numbers
  date,        # Date
  guess,       # Automatic Inference
  skip         # Skip
)

# Skip All(Do not read the data)
col_types = c("skip", "skip", "skip")

# All characters
col_types = c("text")

Tipos disponíveis: "guess" (inferência padrão), "logical", "numeric", "date", "text", "skip", "list" (tabelas aninhadas)



6. Escrever no Excel: writexl

(1) Vantagens do writexl

(2) Sintaxe básica

R
library(writexl)

# 1. Single sheet Output
write_xlsx(df, "output.xlsx")

# 2. Multiple sheet Output(Use list)
write_xlsx(
  list(
    "Sales Details" = sales_df,
    "Payment" = payment_df,
    "Inventory" = stock_df
  ),
  "output.xlsx"
)

# 3. Append to the existing file
# writexl Does not directly support additional entries,Required openxlsx

(3) Aplicação prática

R
# Export R data frames in batch
list_of_dfs <- list(
  Sales = sales_df,
  Payment = payment_df,
  Inventory = stock_df
)
write_xlsx(list_of_dfs, "monthly_report.xlsx")
cat("=== The report has been generated:monthly_report.xlsx ===\n")
⚠️ Observação: o writexl não suporta formatação de células (cor, fonte, fórmulas). Para aplicar formatação, use openxlsx:

R
library(openxlsx)

# Write formatted text Excel
wb <- createWorkbook()
addWorksheet(wb, "Sales")
writeData(wb, "Sales", sales_df)
addStyle(wb, "Sales", style = createStyle(fontColour = "red"),
         rows = 2:10, cols = 5)
saveWorkbook(wb, "formatted_report.xlsx")


7. Prática: Leitura em lote de várias planilhas nas demonstrações financeiras

A seguir, apresentamos um exemplo de um fluxo de trabalho completo que demonstra como processar em lote vários arquivos com várias planilhas.

▶ Exemplo: Resumo dos relatórios financeiros mensais de 30 filiais

R 📖 Somente leitura
# ============================================
# 30 Summary of Monthly Financial Reports from Each Branch
# Features:Batch Read 30 ea Excel × 3 ea sheet
# ============================================

library(readxl)
library(dplyr)
library(purrr)
library(writexl)

# 1. Preparing Sample Data
set.seed(42)
make_sales <- function(city) {
  tibble(
    order_id = 1:5,
    date = as.Date("2024-01-01") + 0:4,
    product = sample(c("A", "B", "C"), 5, replace = TRUE),
    amount = sample(1000:5000, 5)
  )
}
make_payment <- function(city) {
  tibble(
    order_id = 1:5,
    paid = sample(c(TRUE, FALSE), 5, replace = TRUE),
    paid_date = as.Date("2024-01-15") + 0:4
  )
}
make_stock <- function(city) {
  tibble(
    product = c("A", "B", "C"),
    stock = sample(50:200, 3)
  )
}

# Simulation 3 Each branch's Excel(Each 3 sheet)
dir.create("temp_reports", showWarnings = FALSE)
for (city in c("Beijing", "Shanghai", "Guangzhou")) {
  write_xlsx(
    list(
      "Sales Details" = make_sales(city),
      "Payment" = make_payment(city),
      "Inventory" = make_stock(city)
    ),
    file.path("temp_reports", paste0(city, ".xlsx"))
  )
}

# 2. List all Excel Documents
files <- list.files("temp_reports", pattern = "\\.xlsx$", full.names = TRUE)
cat("Found", length(files), "ea Excel Documents:\n")
print(files)

# 3. View each file's sheet name
for (f in files) {
  cat("\nDocuments:", basename(f), "\n")
  cat("  Sheet:", paste(excel_sheets(f), collapse = ", "), "\n")
}

# 4. Read all in bulk sheet
cat("\n=== Bulk reading in progress ===\n")
all_reports <- lapply(files, function(f) {
  city <- tools::file_path_sans_ext(basename(f))
  list(
    sales = read_excel(f, sheet = "Sales Details") |> mutate(city = !!city),
    payment = read_excel(f, sheet = "Payment") |> mutate(city = !!city),
    stock = read_excel(f, sheet = "Inventory") |> mutate(city = !!city)
  )
})
names(all_reports) <- tools::file_path_sans_ext(basename(files))

# 5. Consolidate all sales data
all_sales <- bind_rows(lapply(all_reports, function(d) d$sales))
cat("\n=== Sales Summary ===\n")
print(all_sales)

# 6. Consolidate all payment receipt data
all_payment <- bind_rows(lapply(all_reports, function(d) d$payment))
cat("\n=== Summary of Receivables ===\n")
print(all_payment)

# 7. Merge all inventory data
all_stock <- bind_rows(lapply(all_reports, function(d) d$stock))
cat("\n=== Inventory Summary ===\n")
print(all_stock)

# 8. Comprehensive Analysis
cat("\n=== Sales Analysis by City ===\n")
city_stats <- all_sales |>
  group_by(city) |>
  summarise(
    Number of Orders = n(),
    Total Sales = sum(amount),
    Average Order = round(mean(amount), 2)
  ) |>
  arrange(desc(Total Sales))
print(city_stats)

# 9. Generate a Summary Report
write_xlsx(
  list(
    "Sales Summary" = all_sales,
    "Summary of Receivables" = all_payment,
    "Inventory Summary" = all_stock,
    "City Statistics" = city_stats
  ),
  "summary_report.xlsx"
)
cat("\n=== The summary report has been generated.:summary_report.xlsx ===\n")

# 10. Clear Temporary Files
unlink("temp_reports", recursive = TRUE)
84 linhas de lógica (limite de 40, somente leitura)

Resultado esperado (trecho):

TEXT 📖 Somente leitura
=== Sales Analysis by City ===
# A tibble: 3 × 4
  city  Number of Orders Total Sales Average Order
  <chr>  <int>   <int>     <dbl>
1 Shanghai      5   14325    2865  
2 Beijing      5   12289    2458. 
3 Guangzhou      5   11234    2247. 

❓ Perguntas Frequentes

P: O que devo fazer se o readxl exibir caracteres distorcidos? R: O readxl lida automaticamente com as codificações UTF-8 e GBK. Se você realmente estiver vendo caracteres distorcidos, use iconv para converter a codificação do arquivo antes de lê-lo.

P: Como faço para ler uma folha específica? R: read_excel("file.xlsx", sheet = "Sales Details") ou sheet = 1 (por número). excel_sheets(file) lista todos os nomes das folhas.

P: Como faço para ler apenas um intervalo específico? R: Use range = "A1:D100" para especificar o intervalo de células. Ou use range = "A1:D1" para fixar no cabeçalho e expandir automaticamente.

P: Como faço para escolher entre o readxl e o openxlsx? R: Para operações de leitura e gravação, use readxl + writexl (simples, rápido e independente de Java); para formatação de células, fórmulas e gráficos, use openxlsx (poderoso, mas com uma API complexa).

P: Como faço para ler um arquivo do Excel com células mescladas? R: As células mescladas contêm valores apenas no canto superior esquerdo; as demais posições estão vazias. O readxl as trata como “não mescladas”, portanto, as posições “que não sejam o canto superior esquerdo” nas áreas mescladas são NA. Para lidar com isso, use os parâmetros openxlsx e mergeCells.

P: Como faço para acrescentar dados a um arquivo do Excel já existente usando o writexl? R: O writexl não oferece suporte ao acréscimo de dados. Para acrescentar dados, use openxlsx:

R
library(openxlsx)
wb <- loadWorkbook("existing.xlsx")
addWorksheet(wb, "newsheet")
writeData(wb, "newsheet", new_df)
saveWorkbook(wb, "existing.xlsx")

📖 Resumo


📝 Exercícios

  1. Exercício básico: Crie um arquivo do Excel contendo três planilhas (Vendas, Contas a Receber e Estoque) e exporte-o usando write_xlsx(). Use excel_sheets() para verificar se os nomes das planilhas estão corretos e use read_excel() para ler a planilha “Vendas” e verificar se os dados estão corretos.

  2. Exercício básico: Abra o arquivo do Excel da questão anterior e use range = "A1:B5" para ler apenas as colunas A e B das linhas 1 a 5. Verifique se apenas 2 colunas e 5 linhas foram lidas.

  3. Exercício básico: Leia a planilha “Vendas” da questão anterior, use col_types = c("numeric", "date", "text", "numeric") para especificar explicitamente o tipo da coluna e verifique se o tipo está correto.

  4. Exercício avançado: Simule três filiais no Excel (três planilhas para cada uma). Use lapply para ler todas as planilhas em lote e use bind_rows para mesclar dados do mesmo tipo. Calcule o total de vendas para cada cidade.

  5. Desafio: Use openxlsx para criar um arquivo do Excel formatado: ① Coloque a linha de cabeçalho em negrito e em vermelho; ② Alinhe a coluna de números à direita; ③ Formate a coluna de números com separadores de milhares; ④ Defina as larguras das colunas para que se ajustem automaticamente. Salve-o como formatted_report.xlsx e abra-o no Excel para verificar os resultados (faça uma captura de tela e salve-a).

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%