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
- Faça upload de um arquivo Excel (formato .xlsx ou .xls)
- Se houver várias planilhas, selecione a que será convertida
- Defina o nome da tabela (o padrão é table_name)
- Escolha se a primeira linha deve ser usada como nomes dos campos
- 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
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.