ToolActToolAct

Conversor de Excel para SQL

Carregue um arquivo Excel para converter em instruções SQL INSERT

Arraste um arquivo Excel aqui ou clique para selecionar

O que é Excel para SQL?

Excel para SQL é uma ferramenta online de conversão de formatos de dados que converte arquivos Excel (.xlsx/.xls) em instruções SQL INSERT para facilitar a importação em bancos de dados.

Excel é o formato de planilha mais utilizado, amplamente empregado para armazenamento e análise de dados. SQL é a linguagem de consulta padrão para bancos de dados relacionais, e as instruções INSERT são usadas para inserir dados em tabelas de banco de dados.

Com esta ferramenta, você pode converter rapidamente dados de planilhas Excel em instruções SQL executáveis, com suporte à seleção de múltiplas planilhas, nomes de tabela personalizados e estilos de aspas para facilitar operações de migração e importação de dados.

Como Usar

Como usar

  1. Faça upload de um arquivo Excel (formato .xlsx ou .xls)
  2. Se houver várias planilhas, selecione a que será convertida
  3. Defina o nome da tabela (o padrão é table_name)
  4. Escolha se a primeira linha deve ser usada como nomes dos campos
  5. As instruções SQL INSERT são geradas automaticamente — copie com um clique

Verificações de Geração de SQL

  • Confira nomes de colunas, tipos de dados, aspas e tratamento de NULL antes de executar o SQL gerado em um banco de dados real.
  • Para importações em produção, teste primeiro em uma tabela temporária e mantenha um backup da planilha original.

Casos de uso

Gerar SQL a partir de uma planilha selecionada da pasta de trabalhoEnvie um arquivo Excel, escolha a planilha, defina um nome de tabela e gere instruções INSERT a partir de nomes de cabeçalho ou nomes de coluna gerados como col1, col2, col3. Todo o pipeline roda no dispositivo, então o conteúdo da planilha de origem nunca sai do navegador, o que é útil ao trabalhar com listas de preços internos, dados de RH ou snapshots de staging que não devem sair do computador.
Alinhar aspas de identificadores para o rascunho do banco de dados alvoAlterne aspas de tabela e coluna entre acentos graves, aspas duplas e aspas simples, e opcionalmente inclua uma instrução CREATE TABLE simples com VARCHAR(255). Toda a análise e geração de SQL acontece localmente, então um script rascunho pode ser revisado quanto a nomes de colunas, tipos de dados e tratamento de aspas antes de ser executado no banco de dados alvo.
Preparar dados iniciais locais com limitações clarasO conversor preserva valores de célula como strings SQL ou NULL e escapa aspas simples, mas não infere tipos, restrições, índices, semânticas de data, transações ou sintaxe de carga em lote. Trate a saída como um rascunho para dados iniciais, não como uma migração pronta.
Escolher o estilo de aspas correto para o SGBD alvoMySQL e SQLite aceitam acentos graves, PostgreSQL prefere aspas duplas e SQL Server prefere colchetes; escolha o estilo correspondente no menu suspenso para que o script gerado rode no console alvo sem edições manuais. Tenha em mente que SQLite trata identificadores entre aspas duplas como literais de string quando não há contexto de coluna DUAL, então o padrão cruzado seguro é o estilo de valor com aspas simples e acento grave ou colchete para nomes de tabela/coluna. A inferência de tipos também é puramente léxica: uma coluna cuja primeira célula não vazia é 1, 2, 3 vira INT, uma coluna começando com 2024-01-01 é exportada como string mesmo parecendo uma data, e células monetárias armazenadas com separador de milhar serão exportadas com esse separador dentro da string.
Envolver inserts de múltiplas linhas dentro de uma transaçãoA página emite um INSERT por linha, o que é lento e inseguro para importações grandes. Cole todo o bloco dentro de um par BEGIN/COMMIT ou use o loader em lote do mecanismo ao mover mais de algumas centenas de linhas para um banco de dados em produção. A detecção da linha de cabeçalho percorre a primeira linha não vazia da planilha escolhida e emite `INSERT INTO ... (col1, col2, ...)` com base em seu texto; células DATE são lidas usando a convenção de número serial do Excel (dias desde 1900-01-01 com o bug do ano bissexto de 1900 deslocando 1º de março em um dia, então 25569 é o epoch Unix de 1970-01-01). Células de fórmula que não foram recalculadas carregam um `.value` desatualizado, e intervalos de células mescladas expõem apenas a âncora superior esquerda, então uma linha de título larga mesclada parecerá um único NULL para o analisador.

Princípio técnico

A página analisa a pasta de trabalho enviada com SheetJS — XLSX.read(arrayBuffer, {type: 'array'}) retorna um objeto de pasta de trabalho cuja planilha possui células indexadas por chaves A1, em seguida XLSX.utils.sheet_to_json(sheet, {header: 1, defval: null}) percorre o intervalo delimitado !ref em um array de arrays. A primeira linha não vazia (quando a opção primeira-linha-como-cabeçalho está ativa) é tomada como nomes de colunas; caso contrário, nomes no estilo SheetJS como col1, col2, col3 são sintetizados. Cada linha restante é emitida como uma única instrução SQL no formato INSERT INTO `tabela` (`c1`, `c2`, ...) VALUES (v1, v2, ...);, com CREATE TABLE `tabela` (`c1` VARCHAR(255), ...); opcional prefixado. A aspa de identificadores varia conforme o dialeto SQL e é governada pelo padrão SQL:1992 e pelo desvio de cada fabricante: SQL padrão e PostgreSQL citam identificadores com aspas duplas ("col"), MySQL e MariaDB usam acentos graves (`col`) por padrão e só aceitam aspas duplas quando o modo SQL ANSI_QUOTES está ativo, SQLite aceita tanto acentos graves quanto aspas duplas (e, para retrocompatibilidade, trata identificadores entre aspas duplas que não resolvem como literais de string — uma armadilha bem documentada na página de Quirks do SQLite), SQL Server e Sybase usam colchetes ([col]). A aspa de valores segue as regras de literais de string SQL: aspas simples envolvem o literal e são escapadas dobrando-as ('O''Brien'), conforme ISO/IEC 9075. Células vazias mapeiam para o literal sem aspas NULL, não para a string vazia ''; células numéricas com cell.t === 'n' são emitidas sem aspas; booleanos tornam-se 1/0 ou TRUE/FALSE conforme o dialeto; datas exigem tratamento explícito. Células de data precisam de atenção especial porque o SheetJS preserva o número serial subjacente: o Excel armazena datas como dias desde 1900-01-01 com o bug histórico do ano bissexto de 1900-02-29 deslocando datas anteriores a março de 1900 em um dia, e o sistema Excel-para-Mac de 1904 usa 1904-01-01 como epoch. A conversão para ISO 8601 (YYYY-MM-DD HH:mm:ss, formato aceito tanto por MySQL DATETIME quanto por PostgreSQL TIMESTAMP) é (serial - 25569) * 86400000 ms após o epoch Unix, depois formatada em UTC. A inferência de tipos é puramente léxica e superficial: uma coluna cuja primeira célula não vazia é inteiro torna-se INT, decimal torna-se DECIMAL(10,2), texto torna-se VARCHAR(255), e uma coluna começando com 2024-01-01 pode ser exportada como string, a menos que a célula de origem tenha cell.t === 'd'. Inserts em massa são emitidos como um INSERT por linha, o que é lento em escala; combinar 100-500 linhas em um único INSERT INTO t VALUES (...), (...), (...); reduz as viagens de rede em ~100x, e envolver o script em BEGIN; ... COMMIT; transforma a importação em uma transação atômica que reverte na primeira linha com falha.

  • Aspa de identificadores por dialeto: MySQL/MariaDB `col` (acentos graves, ou "col" com ANSI_QUOTES ativo); PostgreSQL e SQL padrão "col"; SQL Server [col]; SQLite aceita ambos (mas "col" silenciosamente cai para literal de string quando col não é um identificador conhecido).
  • Escape de literal de string (ISO/IEC 9075): envolva com aspas simples e dobre aspas simples internas (O'Brien → 'O''Brien'); nunca insira barras invertidas cruas — o standard_conforming_strings do PostgreSQL é padrão on desde 9.1.
  • Número serial de data do Excel: dias desde 1900-01-01 com o bug de 1900-02-29 (ou 1904-01-01 se workbook.date1904 for true); string ISO 8601 = new Date((serial - 25569) * 86400000).toISOString().
  • Inferência de tipos é léxica: inteiros → INT, decimais → DECIMAL(10,2), texto → VARCHAR(255); datas que parecem datas mas não têm cell.t === 'd' são exportadas como strings; células monetárias com separador de milhar exportam com o separador dentro da string.
  • Tratamento de NULL: uma célula vazia do Excel torna-se o literal sem aspas NULL, não '' — a diferença importa para colunas NOT NULL e para COUNT(col) que ignora NULLs mas conta ''.
  • Insert em massa: combinar 100-500 linhas em um único INSERT INTO t VALUES (...),(...),...; reduz viagens de rede em ~100x versus um INSERT por linha; o max_allowed_packet do MySQL (padrão 64 MB) limita o tamanho por instrução.
  • Envolva o script gerado em BEGIN;...COMMIT; (PostgreSQL/SQLite) ou START TRANSACTION;...COMMIT; (MySQL InnoDB) para que uma única linha com falha reverta todo o lote; tabelas MyISAM ignoram a transação e fazem commit parcial.

Exemplos

Planilha Excel → instruções INSERT

Planilha "users" (3 linhas):
id | name    | email             | age
1  | Alice   | alice@mail.com    | 28
2  | Bob     | bob@mail.com      | 34

SQL gerado:
INSERT INTO users (id, name, email, age) VALUES (1, 'Alice', 'alice@mail.com', 28);
INSERT INTO users (id, name, email, age) VALUES (2, 'Bob', 'bob@mail.com', 34);

INSERT único com várias linhas (importação mais rápida)

Use a opção "combinar linhas" para cargas em massa:

INSERT INTO products (sku, name, price) VALUES
  ('A001', 'USB-C Cable',  9.90),
  ('A002', 'HDMI Adapter', 14.50),
  ('A003', 'Mouse Pad',    4.25);

Reduz 3 idas e voltas para 1 — mais seguro para lotes de 100-500 linhas.

Escape de aspas para nomes com apóstrofo

Célula de origem: O'Brien

SQL gerado (aspas simples duplicadas):
INSERT INTO customers (id, name) VALUES (42, 'O''Brien');

Tratamento de NULL — célula vazia do Excel vira NULL literal, não '':
INSERT INTO customers (id, phone) VALUES (43, NULL);

Envolver a importação em uma transação

BEGIN;
INSERT INTO orders (id, customer_id, total, created_at) VALUES (1001, 7, 199.50, '2026-06-01');
INSERT INTO orders (id, customer_id, total, created_at) VALUES (1002, 7, 42.00,  '2026-06-02');
INSERT INTO orders (id, customer_id, total, created_at) VALUES (1003, 9, 78.30,  '2026-06-03');
COMMIT;

Se alguma linha falhar, o lote inteiro sofre rollback.

Perguntas frequentes

A planilha é enviada para algum servidor?

Não. O arquivo é processado no seu navegador via SheetJS e o SQL é gerado localmente. Nada é enviado para nenhum servidor, então até dados sensíveis permanecem no seu dispositivo.

Que tipo de SQL é gerado?

Uma instrução CREATE TABLE seguida de INSERT INTO individuais (uma linha por instrução). O SQL gerado usa o nome da tabela que você informou e o estilo de aspas que selecionou (simples, dupla ou crase).

Como os tipos das colunas são inferidos?

A página analisa uma amostra de cada coluna e escolhe o tipo mais restrito que encaixa: INTEGER, DECIMAL, VARCHAR(N), BOOLEAN ou DATE/DATETIME. Você pode sobrescrever antes de gerar o SQL. Colunas com tipos misturados acabam virando VARCHAR.

E as datas do Excel?

Datas no Excel são armazenadas como números seriais. A página gera o valor bruto que veio da planilha. Confira o SQL gerado e ajuste os literais de data conforme o formato do seu banco de destino, se necessário.

Como caracteres especiais e aspas são escapados?

Aspas simples são duplicadas (Smith's vira Smith''s). Barras invertidas e caracteres Unicode passam direto, no padrão de strings do PostgreSQL. Se o destino for MySQL com NO_BACKSLASH_ESCAPES desligado, talvez seja preciso escapar as barras invertidas manualmente.

O resultado funciona em MySQL, PostgreSQL, SQLite e MSSQL?

Os INSERTs básicos funcionam nos quatro. O CREATE TABLE usa tipos portáveis (INT, VARCHAR, DECIMAL, DATE). Para tipos específicos do dialeto (SERIAL, AUTO_INCREMENT, IDENTITY), edite o CREATE para se adequar ao banco de destino.

As fórmulas são avaliadas?

Não. É usado o valor em cache que o Excel salvou. Abra a planilha de origem, recalcule, salve e reenvie se precisar dos valores atualizados das fórmulas.