2010-01-05 19 views
64

Esiste un modo o una libreria standard per copiare e incollare da un foglio di calcolo in un modulo Web? Quando seleziono più di una cella da Excel I (ovviamente) perde il delimitatore e tutto viene incollato in una cella del modulo Web. Dev'essere fatto in VB? oppure l'elaborazione può essere eseguita una volta avviata l'azione Incolla nel modulo Web?Copia/incolla da Excel a una pagina Web

+0

Stai cercando di automatizzare qualcosa? Puoi dare un esempio migliore ... –

+2

Avevo paura di fare questa domanda. Grazie per averlo fatto e per essere così conciso. :) –

risposta

65

Non perdi i delimitatori, le cellule sono separate da schede (\t) e righe di ritorni a capo (\n) che potrebbe non essere visibile nel modulo. Provalo tu stesso: copia i contenuti da Excel a Blocco note e vedrai le tue celle allineate in modo corretto. È facile quindi suddividere i campi in schede e sostituirli con qualcos'altro, in questo modo puoi creare anche un tavolo da loro. Ecco un esempio utilizzando 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); 

Quindi, in sostanza, questo script crea una tabella HTML dai dati di Excel incollati.

+1

love it, Thanks! –

+5

Ho giocato con un problema simile, vale la pena notare che, incollando su una casella di testo, si perdono le nuove righe. Mentre incollati in un'area di testo, tieni loro. –

+0

Per motivi pratici, è possibile rendere questa risposta uno snippet per usi futuri. – AdrianoRR

0

Forse sarebbe meglio se tu leggessi il tuo file excel da PHP, e poi lo salvi in ​​un DB o lo elabori.

qui un tutorial in-reparto su come leggere e scrivere dati di Excel con PHP:
http://www.ibm.com/developerworks/opensource/library/os-phpexcel/index.html

+0

Questa è una soluzione assolutamente terribile. Sono venuto a questo thread come sto facendo attualmente ed è incredibilmente incline agli errori. Excel a volte sputa i numeri come numeri interi, a volte come float a volte come stringhe. –

+0

si applicano anche gli scenari utente, in cui è necessario incollare da fonti inaffidabili, come la banca, i cui file xls/csv sono pieni di merda che devono essere setacciati manualmente – ZJR

0

Excel 2007 ha una funzionalità per farlo nella scheda "Dati" che funziona molto bene.

8

La stessa idea di Tatu (grazie ne avrò bisogno presto nel nostro progetto), ma con un'espressione regolare.
Che potrebbe essere più veloce per set di dati di grandi dimensioni.

<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> 
+0

Ciao Mic, questo è un grande codice! Hai qualche idea su come posso convertire questa tabella in una forma presentabile? – BvilleBullet

+0

dipende dal modulo che si desidera inviare. Vorrei fare un jit stringificato e pubblicarlo come un singolo campo sul server. – Mic

+0

A proposito, questo funziona anche per una tabella di Word (una delle "form" legacy dei miei utenti "che stiamo cercando di convertire). Grazie. –

0

Scavando questo, nel caso in cui qualcuno lo incontrasse in futuro. Ho usato il codice sopra come previsto, ma poi ho incontrato un problema che mostrava la tabella dopo che era stata inviata a un database. È molto più semplice una volta memorizzati i dati per utilizzare PHP per sostituire le nuove linee e schede nella tua query. È possibile eseguire la sostituzione al momento della presentazione, $ _POST [Richiesta] sarebbe il nome del textarea:

$postrequest = trim($_POST[request]); 
$dirty = array("\n", "\t"); 
$clean = array('</tr><tr><td>', '</td><td>'); 
$request = str_replace($dirty, $clean, $postrequest); 

Ora basta inserire $ richiesta nel database, e saranno memorizzati in una tabella HTML.

3

Su OSX e Windows, esistono più tipi di appunti per diversi tipi di contenuto. Quando copi il contenuto in Excel, i dati vengono archiviati nel testo normale e negli appunti html.

Il modo corretto (che non viene sollevato dai problemi del delimitatore) è quello di analizzare l'HTML. http://jsbin.com/uwuvan/5 è una semplice demo che mostra come ottenere gli appunti HTML.La chiave è quella di legarsi alla manifestazione onpaste e leggere

event.clipboardData.getData('text/html') 
+0

jsbin non ha funzionato come previsto per me (Firefox 42 su Win 7, Excel 2013). Qualcosa di importante è cambiato da quando hai postato questa risposta, il che rende questo approccio non più funzionante?Nella console del browser, vedo il testo/contenuto semplice registrato, ma il contenuto text/html è vuoto. –

+0

Funziona con chrome su Windows con Excel o su Ubuntu con libreOffice. La migliore soluzione IMO, poiché mantiene tutta la formattazione dei fogli originali. – BiAiB

16

In risposta alla risposta da Tatu ho creato un rapido jsFiddle per la presentazione la sua soluzione:

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); 
} 
+0

Ed ecco la mia aggiunta a questa risposta, ma con la tabella automatica che mostra, subito dopo l'evento paste: http://jsfiddle.net/sTX7y/690/ Fondamentalmente, simula l'evento "afterpaste". – userfuser

5

Per tutti i futuri googler che finiscono qui come me, ho usato il concetto di @tatu Ulmanen e l'ho trasformato in una serie di oggetti. Questa semplice funzione prende una stringa di dati excel (o foglio Google) incollati (preferibilmente da un textarea) e li trasforma in una serie di oggetti. Usa la prima riga per i nomi di colonne/proprietà.

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; 
} 

Speriamo che aiuti qualcuno in futuro.

0

AGGIORNAMENTO: questo è vero solo se si utilizza ONLYOFFICE anziché MS Excel.

C'è in realtà un flusso in tutte le risposte fornite qui e anche in quella accettata. Il flusso è che ogni volta che hai una cella vuota in Excel e copia quella, negli appunti hai 2 caratteri di tabulazione uno accanto all'altro, quindi dopo averlo diviso ottieni un elemento aggiuntivo nell'array, che poi appare come una cella aggiuntiva in quella riga e sposta tutte le altre celle di una unità. Quindi, per evitare di dover sostanzialmente sostituire tutti i caratteri a doppia linguetta (solo una accanto all'altra) in una stringa con un carattere di tabulazione e solo dopo dividerlo.

Una versione aggiornata del jsfiddle @ di userfuser è qui per risolvere questo problema filtrando dati incollati 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'); 
    }) 
    }) 
}) 
+0

In realtà ho scoperto che questo accade solo se si copia dal foglio di calcolo del software ONLYOFFICE. Hmm .. Lasciando questo qui nel caso qualcuno lo inciampi. – Aram

Problemi correlati