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 pacotexlsx, 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
- Os três formatos de arquivo do Excel (.xlsx / .xls / .xlsm)
- Instalação do pacote readxl e de suas quatro funções principais
- Leitura de várias planilhas e processamento em lote
- 8 parâmetros comuns do
read_excel(sheet,range,col_types,na) - writexl: gravar no Excel
- Diferenças em relação ao openxlsx
- Prática: Processamento em lote de relatórios financeiros mensais
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:
- Cada arquivo do Excel contém 3 planilhas (Detalhes de vendas, Recibos, Estoque)
- Cada arquivo do Excel tem o mesmo formato
- É necessário importar um total de 90 tabelas para o R para análise
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
# 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.
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
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) |
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 |
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
# 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
# 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:
# 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
# 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
- Implementação em R puro (não depende do Java nem do LibreOffice)
- Rápido (back-end em C++)
- API simples (apenas
write_xlsx())
(2) Sintaxe básica
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
# 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")
openxlsx:
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
# ============================================
# 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)
Resultado esperado (trecho):
=== 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
iconvpara 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")ousheet = 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 userange = "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, useopenxlsx(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âmetrosopenxlsxemergeCells.
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:
library(openxlsx)
wb <- loadWorkbook("existing.xlsx")
addWorksheet(wb, "newsheet")
writeData(wb, "newsheet", new_df)
saveWorkbook(wb, "existing.xlsx")
📖 Resumo
- O readxl é a melhor opção — dependências exclusivas do R, rápido e lida automaticamente com várias planilhas
- 3 formatos do Excel:
.xlsx(moderno),.xls(antigo),.xlsm(com macros) - 4 funções principais:
read_excel/read_xlsx/read_xls/excel_sheets - 8 parâmetros comuns:
sheetrangecol_typescol_namesnaskipn_maxpath - writexl: A melhor opção para gravar no Excel — R puro, rápido, não suporta formatação
- Use o openxlsx para formatação/fórmulas — é poderoso, mas possui uma API complexa; evite o pacote xlsx (requer Java)
- Processamento em lote de vários arquivos com várias planilhas: percorrer
lapply+bind_rowspara mesclar
📝 Exercícios
-
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(). Useexcel_sheets()para verificar se os nomes das planilhas estão corretos e useread_excel()para ler a planilha “Vendas” e verificar se os dados estão corretos. -
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. -
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. -
Exercício avançado: Simule três filiais no Excel (três planilhas para cada uma). Use
lapplypara ler todas as planilhas em lote e usebind_rowspara mesclar dados do mesmo tipo. Calcule o total de vendas para cada cidade. -
Desafio: Use
openxlsxpara 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 comoformatted_report.xlsxe abra-o no Excel para verificar os resultados (faça uma captura de tela e salve-a).