¿Existe una forma estándar o una biblioteca para copiar y pegar desde una hoja de cálculo a un formulario web? Cuando selecciono más de una celda de Excel, (obviamente) pierdo el delimitador y todo se pega en una celda del formulario web. ¿Tiene que hacerse en VB? ¿O podría realizarse el procesamiento una vez que se inicia la acción de pegar en el formulario web?
javascript
html
forms
excel
Su amabilidad
fuente
fuente
Respuestas:
No pierde los delimitadores, las celdas están separadas por tabulaciones (
\t
) y las filas por líneas nuevas (\n
) que pueden no ser visibles en el formulario. Pruébelo usted mismo: copie el contenido de Excel al Bloc de notas y verá sus celdas bien alineadas. Entonces, es fácil dividir los campos por pestañas y reemplazarlos con otra cosa, de esta manera puede construir incluso una tabla a partir de ellos. Aquí hay un ejemplo 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);
Entonces, en esencia, este script crea una tabla HTML a partir de datos de Excel pegados.
fuente
td
. Solo para su informaciónEn respuesta a la respuesta de Tatu, he creado un jsFiddle rápido para mostrar su solución:
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); }
fuente
En OSX y Windows , hay varios tipos de portapapeles para diferentes tipos de contenido. Cuando copia contenido en Excel, los datos se almacenan en texto sin formato y en el portapapeles html.
La forma correcta (que no se tropieza con problemas de delimitadores) es analizar el HTML. http://jsbin.com/uwuvan/5 es una demostración simple que muestra cómo obtener el portapapeles HTML. La clave es unirse al evento onpaste y leer
event.clipboardData.getData('text/html')
fuente
La misma idea que Tatu (gracias la necesitaré pronto en nuestro proyecto), pero con una expresión regular.
Lo que puede ser más rápido para grandes conjuntos de datos.
<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>
fuente
Para cualquier futuro googlers que termine aquí como yo, utilicé el concepto de @tatu Ulmanen y lo convertí en una serie de objetos. Esta función simple toma una cadena de datos pegados de Excel (u hoja de Google) (preferiblemente de a
textarea
) y los convierte en una matriz de objetos. Utiliza la primera fila para los nombres de columna / propiedad.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; }
Ojalá ayude a alguien en el futuro.
fuente
ACTUALIZACIÓN: Esto solo es cierto si usa ONLYOFFICE en lugar de MS Excel.
En realidad, hay un flujo en todas las respuestas proporcionadas aquí y también en la aceptada. El flujo es que cada vez que tiene una celda vacía en Excel y la copia, en el portapapeles tiene 2 caracteres de pestaña uno al lado del otro, por lo que después de dividir obtiene un elemento adicional en la matriz, que luego aparece como una celda adicional en esa fila. y mueve todas las demás celdas en una. Entonces, para evitar eso, básicamente necesita reemplazar todos los caracteres de doble pestaña (solo pestañas una al lado de la otra) en una cadena con un carácter de pestaña y solo luego dividirlo.
Una versión actualizada de jsfiddle de @ userfuser está aquí para solucionar ese problema al filtrar los datos pegados con 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'); }) }) })
fuente
Excel 2007 tiene una función para hacer esto en la pestaña "Datos" que funciona bastante bien.
fuente
Desenterrando esto, en caso de que alguien lo encuentre en el futuro. Utilicé el código anterior según lo previsto, pero luego encontré un problema al mostrar la tabla después de haberla enviado a una base de datos. Una vez que haya almacenado los datos, es mucho más fácil usar PHP para reemplazar las nuevas líneas y pestañas en su consulta. Puede realizar el reemplazo al enviarlo, $ _POST [solicitud] sería el nombre de su área de texto:
$postrequest = trim($_POST[request]); $dirty = array("\n", "\t"); $clean = array('</tr><tr><td>', '</td><td>'); $request = str_replace($dirty, $clean, $postrequest);
Ahora simplemente inserte $ request en su base de datos y se almacenará como una tabla HTML.
fuente
Tal vez sería mejor leer su archivo de Excel desde PHP y luego guardarlo en una base de datos o procesarlo.
aquí un tutorial detallado sobre cómo leer y escribir datos de Excel con PHP:
http://www.ibm.com/developerworks/opensource/library/os-phpexcel/index.html
fuente