Existe uma maneira ou biblioteca padrão de copiar e colar de uma planilha em um formulário da web? Quando seleciono mais de uma célula no Excel, (obviamente) perco o delimitador e tudo é colado em uma célula do formulário da web. Tem que ser feito em VB? ou o processamento poderia ser feito quando a ação de colar for iniciada no formulário da web?
javascript
html
forms
excel
Sua estupidez
fonte
fonte
Respostas:
Você não perde os delimitadores, as células são separadas por tabulações (
\t
) e linhas por novas linhas (\n
) que podem não estar visíveis no formulário. Experimente você mesmo: copie o conteúdo do Excel para o Bloco de notas e verá suas células bem alinhadas. É fácil então dividir os campos por tabulações e substituí-los por outra coisa, desta forma você pode construir até mesmo uma tabela a partir deles. Aqui está um exemplo usando jQuery:var data = $('input[name=excel_data]').val(); var rows = data.split("\n"); var table = $('<table />'); for(var y in rows) { var cells = rows[y].split("\t"); var row = $('<tr />'); for(var x in cells) { row.append('<td>'+cells[x]+'</td>'); } table.append(row); } // Insert into DOM $('#excel_table').html(table);
Então, em essência, esse script cria uma tabela HTML a partir de dados colados do Excel.
fonte
td
. Apenas para sua informaçãoEm resposta à resposta de Tatu, criei um jsFiddle rápido para apresentar sua solução:
http://jsfiddle.net/duwood/sTX7y/
HTML
<p>Paste excel data here:</p> <textarea name="excel_data" style="width:250px;height:150px;"></textarea><br> <input type="button" onclick="javascript:generateTable()" value="Genereate Table"/> <br><br> <p>Table data will appear below</p> <hr> <div id="excel_table"></div>
JS
function generateTable() { var data = $('textarea[name=excel_data]').val(); console.log(data); var rows = data.split("\n"); var table = $('<table />'); for(var y in rows) { var cells = rows[y].split("\t"); var row = $('<tr />'); for(var x in cells) { row.append('<td>'+cells[x]+'</td>'); } table.append(row); } // Insert into DOM $('#excel_table').html(table); }
fonte
No OSX e no Windows , existem vários tipos de pranchetas para diferentes tipos de conteúdo. Quando você copia conteúdo no Excel, os dados são armazenados em texto simples e na área de transferência html.
A maneira certa (que não é confundida por problemas de delimitador) é analisar o HTML. http://jsbin.com/uwuvan/5 é uma demonstração simples que mostra como obter a área de transferência HTML. A chave é ligar-se ao evento onpaste e ler
event.clipboardData.getData('text/html')
fonte
A mesma ideia do Tatu (obrigado vou precisar dela em breve no nosso projeto), mas com uma expressão regular.
O que pode ser mais rápido para grandes conjuntos de dados.
<html> <head> <title>excelToTable</title> <script src="../libs/jquery.js" type="text/javascript" charset="utf-8"></script> </head> <body> <textarea>a1 a2 a3 b1 b2 b3</textarea> <div></div> <input type="button" onclick="convert()" value="convert"/> <script> function convert(){ var xl = $('textarea').val(); $('div').html( '<table><tr><td>' + xl.replace(/\n+$/i, '').replace(/\n/g, '</tr><tr><td>').replace(/\t/g, '</td><td>') + '</tr></table>' ) } </script> </body> </html>
fonte
Para qualquer futuro googler que acabe aqui como eu, usei o conceito de @tatu Ulmanen e apenas o transformei em uma série de objetos. Essa função simples pega uma string de dados colados do Excel (ou planilha do Google) (de preferência de a
textarea
) e os transforma em uma matriz de objetos. Ele usa a primeira linha para nomes de coluna / propriedade.function excelToObjects(stringData){ var objects = []; //split into rows var rows = stringData.split('\n'); //Make columns columns = rows[0].split('\t'); //Note how we start at rowNr = 1, because 0 is the column row for (var rowNr = 1; rowNr < rows.length; rowNr++) { var o = {}; var data = rows[rowNr].split('\t'); //Loop through all the data for (var cellNr = 0; cellNr < data.length; cellNr++) { o[columns[cellNr]] = data[cellNr]; } objects.push(o); } return objects; }
Espero que ajude alguém no futuro.
fonte
ATUALIZAÇÃO: Isso só é verdadeiro se você usar o ONLYOFFICE em vez do MS Excel.
Na verdade, há um fluxo em todas as respostas fornecidas aqui e também na aceita. O fluxo é que sempre que você tiver uma célula vazia no excel e copiá-la, na área de transferência você terá 2 caracteres de guia um ao lado do outro, então após a divisão você obtém um item adicional no array, que aparece como uma célula extra naquela linha e move todas as outras células em uma. Então, para evitar isso, você basicamente precisa substituir todos os caracteres de tabulação dupla (tabulações ao lado uma da outra) em uma string por um caractere de tabulação e só então dividi-lo.
Uma versão atualizada do jsfiddle de @ userfuser está aqui para corrigir esse problema, filtrando os dados colados com removeExtraTabs
http://jsfiddle.net/sTX7y/794/
function removeExtraTabs(string) { return string.replace(new RegExp("\t\t", 'g'), "\t"); } function generateTable() { var data = removeExtraTabs($('#pastein').val()); var rows = data.split("\n"); var table = $('<table />'); for (var y in rows) { var cells = rows[y].split("\t"); var row = $('<tr />'); for (var x in cells) { row.append('<td>' + cells[x] + '</td>'); } table.append(row); } // Insert into DOM $('#excel_table').html(table); } $(document).ready(function() { $('#pastein').on('paste', function(event) { $('#pastein').on('input', function() { generateTable(); $('#pastein').off('input'); }) }) })
fonte
O Excel 2007 possui um recurso para fazer isso na guia "Dados" que funciona muito bem.
fonte
Desenterrando isso, caso alguém encontre no futuro. Usei o código acima conforme planejado, mas tive um problema ao exibir a tabela depois que ela foi enviada a um banco de dados. É muito mais fácil depois de armazenar os dados para usar o PHP para substituir as novas linhas e guias em sua consulta. Você pode realizar a substituição após o envio, $ _POST [solicitação] seria o nome de sua área de texto:
$postrequest = trim($_POST[request]); $dirty = array("\n", "\t"); $clean = array('</tr><tr><td>', '</td><td>'); $request = str_replace($dirty, $clean, $postrequest);
Agora, basta inserir $ request em seu banco de dados e ele será armazenado como uma tabela HTML.
fonte
Talvez seja melhor se você ler seu arquivo Excel do PHP e salvá-lo em um banco de dados ou processá-lo.
aqui, um tutorial detalhado sobre como ler e gravar dados do Excel com PHP:
http://www.ibm.com/developerworks/opensource/library/os-phpexcel/index.html
fonte