Guia para transformar relatórios XLS e consultas ad‑hoc em endpoints JSON paginados para BI
Por Kevin Marcondes · Publicado em · Atualizado em · 9 min de leitura
Este guia mostra, passo a passo, como transformar relatórios XLS e consultas ad‑hoc em endpoints JSON paginados para BI. Você verá arquitetura de referência, padrões de contrato, paginação, desempenho, segurança e testes. O objetivo é publicar dados de forma consistente para dashboards sem reescrever tudo do zero.
Quando faz sentido expor planilhas e queries como APIs
Transformar planilhas e consultas pontuais em endpoints JSON paginados é útil quando BI precisa de atualização frequente, consistência de formato e acesso automatizado. Em vez de e-mails com anexos, você oferece uma fonte única e versionada.
O movimento também evita divergências entre áreas. Todos consomem o mesmo contrato JSON, com filtros e paginação previsíveis. Isso facilita governança, audita acessos e acelera novos painéis.
Nem todo caso é ideal. Se os dados mudam a cada segundo e a planilha exige macros complexas, considere primeiro estabilizar a origem. Quando a query é muito pesada, extraia e materialize resultados em etapas fora do horário crítico.
Sinais de que está na hora: planilhas enormes circulando por e-mail, colunas inconsistentes, versões divergentes de números e retrabalho para atualizar dashboards.
- Dashboard depende de extração manual recorrente.
- Erros frequentes por versões diferentes da planilha.
- Consultas SQL manuais compartilhadas por copiar/colar.
- Necessidade de filtros e fatias consistentes entre áreas.
Arquitetura de referência: da planilha/SQL ao endpoint paginado
Uma arquitetura simples resolve a maioria dos casos. Separe ingestão, transformação, publicação e observabilidade. Cada etapa pode ser iterada sem travar o restante.
Ingestão: obtenha o XLS de uma origem confiável ou rode a consulta ad‑hoc em um job agendado. Salve em um storage com versionamento para rastreio. Registre metadata mínima: fonte, horário e hash do arquivo.
Transformação: padronize cabeçalhos, tipos, datas e normalização leve (por exemplo, separar dimensões e fatos). Valide linhas problemáticas e gere um relatório de qualidade dos dados.
Publicação: carregue resultados para uma base de leitura (relacional ou colunar) ou materialize em arquivos particionados. Exponha via API REST com filtros e paginação estáveis. Inclua metadados como total e links next/prev quando fizer sentido.
Observabilidade: métricas de ingestão, tempos de resposta e taxa de erros. Logs com correlação da execução que gerou o dataset publicado.
Comece simples: mesmo um endpoint sobre um dataset materializado diariamente já elimina anexos e reduz retrabalho. Evolua depois para cargas parciais e atualização quase em tempo real.
- Ingestão agendada com versionamento.
- Transformação com validação de tipos.
- Publicação em API REST com filtros/paginação.
- Métricas e logs para rastreabilidade.
Contratos JSON consistentes: campos, tipos e metadados
Defina um contrato claro e previsível. Nomes de campos em snake_case ou camelCase, escolha uma convenção e mantenha-a. Use tipos consistentes: números como número, não string. Datas em ISO 8601 com timezone.
Inclua metadados de paginação e versão do dataset quando necessário. Evite mudar nomes de campos sem versionar a rota. Documente nulos, padrões e intervalos válidos.
Abaixo, um mapeamento prático de tipos comuns que surgem em planilhas e consultas para o JSON do endpoint.
- Datas em ISO 8601: 2024-05-08T13:45:00Z.
- Moedas como decimal com ponto e escala fixa.
- Booleanos como true/false, não "Sim/Não".
- Campos opcionais documentados; evite surpresas.
- Erros padronizados com code e message.
| Origem (Excel/SQL) | JSON esperado | Observações |
|---|---|---|
| Texto livre | string | Trime espaços; normalize encoding. |
| Número com vírgula | number | Converta vírgula em ponto; defina escala. |
| Data em dd/mm/aaaa | string (ISO 8601) | Converta e valide timezone. |
| Moeda formatada (R$ 1.234,56) | number | Remova símbolos; mantenha centavos. |
| S/N, Y/N | boolean | Mapeie para true/false. |
| Campo vazio | null | Documente se pode ser null. |
Paginação e filtros que funcionam no BI
Paginação garante respostas estáveis e previsíveis. Dois padrões comuns: offset/limit e cursor (keyset). Offset/limit é simples, porém degrada em conjuntos grandes. Cursor usa um marcador derivado da ordenação, mantendo performance mais estável.
Escolha uma ordenação imutável e indexada, como id ou timestamp de criação. Para cursor, devolva next_cursor e, opcionalmente, prev_cursor. Inclua page_size aceitando limites razoáveis.
Filtros devem ser whitelisted e documentados. Prefira igualdade, intervalos e prefixos, todos com índices adequados. Evite permitir expressões arbitrárias.
Exemplo de rota: GET /api/v1/vendas?data_ini=2024-01-01&data_fim=2024-01-31&cursor=abc&limit=500. O corpo pode incluir items[], next_cursor e total_estimate quando computar o total for caro.
- Offset/limit: simples, piora com tabelas grandes.
- Cursor/keyset: rápido e estável; exige ordenação fixa.
- Limite máximo por página evita abusos.
- Retorne links next/prev quando possível.
- Filtre apenas pelos campos indexados.
Passos práticos: do XLS/SQL ao endpoint
Um roteiro direto ajuda a sair do zero rapidamente. Adapte conforme suas ferramentas e SLAs.
1) Localize a fonte oficial do relatório ou query e automatize a extração. Salve cada execução com carimbo de data/hora e hash.
2) Faça parsing do XLS, padronize cabeçalhos e detete linhas inválidas; gere um arquivo de rejeições para revisão.
3) Normalize tipos: datas, decimais, booleanos e nulos. Documente conversões aplicadas.
4) Materialize o conjunto transformado em uma área de leitura. Opcional: particione por data.
5) Modele a API: rotas, filtros, paginação, ordenação e códigos de erro. Especifique exemplos de request/response.
6) Implemente o endpoint com limites de página, compressão e validações de entrada. Logue correlações.
7) Publique documentação e um sandbox simples para consumidores de BI testarem filtros e paginação.
8) Monitore latência, taxas de erro e consumo. Planeje revisões de esquema com versionamento.
Desempenho e atualização: cache, materiais e cargas parciais
Para dashboards, latência consistente é crucial. Use cache HTTP com ETag/Last-Modified e respostas 304 quando não houver mudanças. Documentação de referência em HTTP caching pode ajudar.
Materialize resultados caros e atualize em janela programada. Se sua consulta é pesada, rode-a off-peak e publique o artefato final de leitura.
Quando houver necessidade de atualização mais frequente, implemente cargas parciais. Use colunas de atualização, logs de alterações ou estratégias de captura de dados de mudança.
Otimize consultas e índices antes de expor filtros. Reduza round-trips e serialize respostas compactas.
- ETag e Last-Modified para evitar transferências desnecessárias.
- Pré-cálculo diário/horário de agregados pesados.
- Cargas incrementais com marcação de última atualização.
- Compressão HTTP e seleções de campos.
Segurança, governança e observabilidade
A segurança precisa estar no desenho desde o início. Implemente autenticação, autorização por escopos e limites de taxa. Separe datasets por sensibilidade e remova PII quando não necessária.
Audite acessos e guarde trilhas de quem consumiu qual versão do dataset. Exponha limites de uso e mensagens de erro claras. Métricas e logs estruturados facilitam o diagnóstico e evitam quedas de SLAs.
Para governança, versionamento é essencial. Prefira /api/v1/... e documente mudanças incompatíveis. Inclua contato e política de depreciação na documentação.
- OAuth2/Bearer tokens e escopos por dataset.
- Rate limiting para proteger a infraestrutura.
- Logs com correlation_id em cada request.
- Versionamento de rotas e política de breaking changes.
Testes, validação e automação de publicação
Crie um conjunto de dados de amostra e "golden files" JSON para validar o contrato. Adote testes de contrato e consumer-driven, garantindo que mudanças não quebrem painéis.
Cubra casos de paginação, filtros e ordenação estável. Gere casos extremos: páginas vazias, limites máximos e filtros inválidos.
Automatize a publicação da API e do dataset materializado em pipeline. Ao detectar alterações de esquema, exija revisão e versão nova. Registre métricas de sucesso por etapa do pipeline.
- Testes de contrato com exemplos reais.
- Casos extremos de paginação e filtros.
- Pipeline automatizado com gates de qualidade.
- Alertas quando latência ou erros aumentarem.
Perguntas frequentes
Devo ler direto do XLS a cada request ou materializar o resultado?
Para BI, materializar o resultado e servir a partir de uma base de leitura é geralmente mais previsível e econômico. XLSs variam em formatação e podem conter células inconsistentes; materialize, valide e versione cada execução, registre metadata (fonte, horário, hash) e atualize em janelas controladas para garantir um contrato JSON estável e reduzir retrabalho.
Offset/limit ou cursor: qual paginação escolher?
Offset/limit é simples e adequado para conjuntos pequenos ou quando consumidores precisam navegar por páginas arbitrárias. Em tabelas grandes, cursor (keyset) tende a manter performance e estabilidade, desde que exista uma ordenação imutável e indexada (por exemplo id ou timestamp). Avalie o custo e a necessidade de saltos arbitrários antes de optar.
Como lidar com tipos inconsistentes na planilha?
Trate inconsistências na etapa de transformação: padronize cabeçalhos, converta datas para ISO 8601 com timezone, normalize números para decimal com ponto e booleanos para true/false. Valide linhas inválidas, gere um arquivo de rejeições para revisão e documente campos opcionais e valores padrão para manter o contrato JSON previsível.
Com que frequência devo atualizar os endpoints para BI?
A frequência depende do uso: dashboards operacionais podem exigir atualizações por hora; painéis executivos costumam aceitar janelas diárias. Se a consulta for pesada, materialize off‑peak e publique o artefato final. Para necessidades maiores de frescor, implemente cargas parciais usando colunas de atualização ou logs de alteração, balanceando custo e frescor.
Como proteger o acesso aos endpoints?
Implemente autenticação (por exemplo OAuth2/Bearer), autorização por escopos e limites de taxa para proteger a infraestrutura. Separe datasets por sensibilidade, remova PII quando não for necessária e audite acessos com logs que incluam correlation_id. Versione rotas e comunique deprecações para reduzir quebras em consumidores.
Pronto para publicar seus dados como endpoints JSON paginados?
Se você precisa transformar relatórios XLS e consultas ad‑hoc em uma API estável para BI, posso ajudar a avaliar o caminho mais simples e seguro para o seu cenário.
Falar sobre meus relatóriosVeja também
- Guia: checklist de pré‑deploy e plano de rollback rápido para aplicações PHP em produção
- Checklist de segurança para pipelines CI/CD com runners self‑hosted e secrets management
- Guia: centralização de logs com Fluentd e Elasticsearch para aplicações PHP em VPS
- Guia: organizar migrations e rollbacks em PostgreSQL para equipes pequenas