CLI em Node.js para gerenciar planilhas Excel via Microsoft Graph API (Microsoft 365 / OneDrive).
excel-manager/
├── excel_api.js # Módulo central — todas as funções da Graph API
├── excel_manager.js # CLI interativo — consome o excel_api.js
├── .env.example # Modelo de variáveis de ambiente
├── .env # Suas credenciais (não commitar!)
├── .token_cache.json # Cache de autenticação gerado automaticamente
└── package.json
npm install- Acesse portal.azure.com
- Vá em Azure Active Directory → App registrations → New registration
- Dê um nome (ex:
excel-manager) e clique em Register - Copie o Application (client) ID e o Directory (tenant) ID
- Em API permissions → Add a permission → Microsoft Graph → Delegated:
- Adicione
Files.ReadWrite.All - Clique em Grant admin consent
- Adicione
- (Opcional — modo app-only) Em Certificates & secrets → New client secret, gere um secret e copie o valor
cp .env.example .envAbra o .env e preencha:
TENANT_ID=seu_tenant_id
CLIENT_ID=seu_client_id
CLIENT_SECRET= # deixe vazio para usar Device Code (login no browser)
AUTH_MODE=device_code # ou client_credentialsnpm startAUTH_MODE |
Descrição | Quando usar |
|---|---|---|
device_code |
Login via browser — acessa o OneDrive do usuário logado | Uso pessoal / dev |
client_credentials |
App-only — sem login de usuário, precisa de CLIENT_SECRET |
Bots / servidores |
No modo
device_code, ao iniciar o script será exibido um link e um código para autenticar no browser. O token é cacheado em.token_cache.jsonpara não precisar repetir.
Após rodar npm start, use os comandos abaixo no terminal:
| Comando | Descrição |
|---|---|
listarArquivos |
Lista todos os .xlsx do OneDrive |
infoArquivo |
Exibe detalhes de um arquivo (nome, abas, URL...) |
deletarArquivo |
Deleta um arquivo pelo ID |
| Comando | Descrição |
|---|---|
listarAbas |
Lista todas as abas de um arquivo |
criarAba |
Cria uma nova aba |
renomearAba |
Renomeia uma aba existente |
deletarAba |
Deleta uma aba |
| Comando | Descrição |
|---|---|
lerRange |
Lê um range de células (ou todo o usedRange) |
lerCelula |
Lê valor, fórmula e texto de uma célula específica |
| Comando | Descrição |
|---|---|
escreverRange |
Escreve dados em um range (linha por linha) |
escreverFormula |
Insere uma fórmula em uma célula |
limparRange |
Limpa o conteúdo de um range |
| Comando | Descrição |
|---|---|
listarTabelas |
Lista tabelas do arquivo |
lerTabela |
Exibe os dados de uma tabela |
adicionarLinhaTabela |
Adiciona uma linha no final de uma tabela |
| Comando | Descrição |
|---|---|
criarSessao |
Cria sessão persistente para edições em lote (mais performance) |
fecharSessao |
Encerra a sessão |
Digite menu a qualquer momento para ver todos os comandos.
O excel_api.js é um módulo reutilizável. Importe em qualquer script do seu projeto:
const api = require("./excel_api");
// Listar arquivos
const files = await api.listarArquivos();
console.log(files);
// Ler range como array de objetos
const rows = await api.lerRangeComoObjetos(fileId, "Sheet1", "A1:E20");
console.log(rows);
// Escrever dados
await api.escreverRange(fileId, "Sheet1", "A1", [
["Nome", "Idade", "Cidade"],
["Dudu", 22, "SP"],
]);
// Inserir fórmula
await api.escreverFormula(fileId, "Sheet1", "D2", "=SUM(B2:C2)");
// Adicionar linha em tabela
await api.adicionarLinhaTabela(fileId, "Tabela1", ["Dudu", 22, "SP"]);getToken(deviceCodeCallback?) Autentica e retorna o access token
resetToken() Invalida o token em memória
listarArquivos(pasta?) → [{id, name, sizeKB, modified, webUrl}]
infoArquivo(fileId) → {id, name, sizeKB, created, modified, webUrl, sheets}
deletarArquivo(fileId)
listarAbas(fileId) → [{name, position, visibility}]
criarAba(fileId, nome) → {name, position}
renomearAba(fileId, atual, novo)
deletarAba(fileId, nome)
lerRange(fileId, aba, range?) → {address, rowCount, columnCount, values}
lerRangeComoObjetos(fileId, aba, range?) → [{...}]
lerCelula(fileId, aba, celula) → {address, value, formula, text}
escreverRange(fileId, aba, range, values)
escreverFormula(fileId, aba, celula, formula)
limparRange(fileId, aba, range)
listarTabelas(fileId) → [{id, name}]
lerTabela(fileId, tabelaId) → [{...}]
adicionarLinhaTabela(fileId, tabelaId, values)
criarSessao(fileId) → sessionId
fecharSessao(fileId, sessionId)
.env
.token_cache.json
node_modules/
MIT — Eduh Dev