Copia / incolla da Excel a una pagina web


89

Esiste un modo o una libreria standard per copiare e incollare da un foglio di lavoro a un modulo web? Quando seleziono più di una cella da Excel (ovviamente) perdo il delimitatore e tutto viene incollato in una cella del modulo web. Deve essere fatto in VB? o l'elaborazione potrebbe essere eseguita una volta avviata l'azione Incolla sul modulo web?


Stai cercando di automatizzare qualcosa? Puoi fare un esempio migliore ...
Dayton Brown

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

Risposte:


94

Non si perdono i delimitatori, le celle sono separate da tabulazioni ( \t) e righe da newlines ( \n) che potrebbero non essere visibili nel modulo. Prova tu stesso: copia il contenuto da Excel a Blocco note e vedrai le tue celle ben allineate. È facile quindi dividere i campi per tab e sostituirli con qualcos'altro, in questo modo puoi costruire anche una tabella 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 da dati Excel incollati.


9
Ho giocato con un problema simile, vale la pena notare, incollando in una casella di testo, perdi le nuove righe. Mentre incolli in un'area di testo, li mantieni.
wobbily_col

Per motivi pratici, potresti rendere questa risposta uno snippet per usi futuri.
AdrianoRR

1
Se c'è una nuova riga all'interno di una cella, questa si interrompe.
th3byrdm4n

Solo una breve nota su questo: funziona brillantemente ma Excel aggiunge una riga finale quando i dati vengono copiati in modo da finire con un vuoto td. Solo FYI
jg2703

questa è una soluzione rapida ma a breve termine, e se una delle mie cellule contenesse \ n in essa
MeVimalkumar

27

In risposta alla risposta di Tatu ho creato un rapido jsFiddle per mostrare 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);
}

3
Ed ecco la mia aggiunta a questa risposta, ma con la visualizzazione automatica della tabella, subito all'evento incolla: jsfiddle.net/sTX7y/690 Fondamentalmente, simula l'evento 'afterpaste'.
userfuser

12

Su OSX e Windows , ci sono 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 giusto (che non viene bloccato da problemi di delimitatori) è analizzare l'HTML. http://jsbin.com/uwuvan/5 è una semplice demo che mostra come ottenere gli appunti HTML. La chiave è legarsi all'evento onpaste e leggere

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

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

Funziona con Chrome su Windows con Excel o su Ubuntu con libreOffice. Migliore soluzione IMO, poiché mantiene tutta la formattazione dai fogli originali.
BiAiB

questa risposta abbastanza rilevante ma necessita di maggiori dettagli
MeVimalkumar

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>

Ciao Mic, questo è un codice fantastico! Hai qualche idea su come posso convertire questa tabella in un modulo sottomettibile?
BvilleBullet

dipende dal modulo che vuoi inviare. Ne farei un json in stringa e lo invierei come un singolo campo al server.
Mic

A proposito, funziona anche per una tabella di Word (uno dei "moduli" precedenti dei miei utenti che stiamo cercando di convertire). Grazie.
Hugh Seagraves

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 a textarea) e la trasforma in un array di oggetti. Utilizza 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;
}

Si spera che aiuti qualcuno in futuro.


1

AGGIORNAMENTO: questo è vero solo se utilizzi ONLYOFFICE invece di MS Excel.

In realtà c'è 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 la copi, negli appunti hai 2 caratteri di tabulazione uno accanto all'altro, quindi dopo la divisione ottieni un elemento aggiuntivo nell'array, che poi appare come una cella extra in quella riga e sposta tutte le altre celle di una. Quindi, per evitare che sia fondamentalmente necessario sostituire tutti i caratteri di doppia tabulazione (solo le tabulazioni una accanto all'altra) in una stringa con un carattere di tabulazione e solo dopo dividerlo.

Una versione aggiornata di jsfiddle di @ userfuser è qui per risolvere il problema filtrando i 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');
    })
  })
})

In realtà ho scoperto che questo accade solo se copi dal foglio di calcolo del software ONLYOFFICE. Hmm .. Lasciando questo qui nel caso qualcuno si imbattesse in esso.
Aram

0

Excel 2007 ha una funzione per farlo nella scheda "Dati" che funziona abbastanza bene.


0

Sto scavando, nel caso qualcuno lo incontrasse in futuro. Ho usato il codice sopra come previsto, ma poi ho riscontrato un problema durante la visualizzazione della tabella dopo che era stata inviata a un database. Una volta memorizzati i dati, è molto più semplice utilizzare PHP per sostituire le nuove righe e tabulazioni nella query. Puoi eseguire la sostituzione al momento dell'invio, $ _POST [richiesta] sarebbe il nome della tua area di testo:

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

Ora inserisci $ request nel tuo database e verrà archiviato come tabella HTML.


-1

Forse sarebbe meglio se leggessi il tuo file excel da PHP e poi lo salvi su un DB o esegui delle elaborazioni su di esso.

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


Questa è una soluzione assolutamente terribile. Sono arrivato a questo thread mentre lo sto facendo ed è incredibilmente soggetto a errori. Excel a volte sputa numeri come interi, a volte come float a volte come stringhe.
wobbily_col

si applicano anche scenari utente, in cui è necessario incollare da fonti inaffidabili, come la tua banca, i cui file xls / csv sono pieni di schifezze che devono essere setacciate manualmente
ZJR
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.