Kopieer/plak vanuit Excel naar een webpagina

Is er een standaardmanier of bibliotheek om van een spreadsheet naar een webformulier te kopiëren en plakken?
Wanneer ik meer dan één cel uit Excel selecteer, verlies ik (uiteraard) het scheidingsteken en wordt alles in één cel van het webformulier geplakt.
Moet het in VB? of kan de verwerking worden uitgevoerd zodra de plakactie op het webformulier is gestart?


Antwoord 1, autoriteit 100%

Je verliest de scheidingstekens niet, de cellen worden gescheiden door tabs (\t) en rijen door nieuwe regels (\n) die mogelijk niet zichtbaar zijn in de formulier. Probeer het zelf: kopieer inhoud van Excel naar Kladblok en je zult zien dat je cellen netjes op een rij staan. Het is dan gemakkelijk om de velden op tabbladen te splitsen en ze door iets anders te vervangen, op deze manier kun je er zelfs een tabel van maken. Hier is een voorbeeld waarin jQuery wordt gebruikt:

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

Dus in wezen maakt dit script een HTML-tabel van geplakte Excel-gegevens.


Antwoord 2, autoriteit 33%

Als reactie op het antwoord van Tatu heb ik een snelle jsFiddle gemaakt om zijn oplossing te demonstreren:

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

Antwoord 3, autoriteit 14%

Op OSXen Windows, er zijn meerdere soorten klemborden voor verschillende soorten inhoud. Wanneer u inhoud in Excel kopieert, worden gegevens opgeslagen in de leesbare tekst en in het html-klembord.

De juiste manier (die niet in de war raakt door problemen met scheidingstekens) is om de HTML te ontleden. http://jsbin.com/uwuvan/5is een eenvoudige demo die laat zien hoe je het HTML-klembord kunt krijgen . De sleutel is om te binden aan de onpaste-gebeurtenis en te lezen

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

Antwoord 4, autoriteit 8%

Hetzelfde idee als Tatu (bedankt, ik heb het binnenkort nodig in ons project), maar met een reguliere expressie.
Wat misschien sneller is voor grote datasets.

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

Antwoord 5, autoriteit 8%

Voor toekomstige googlers die hier terechtkomen, zoals ik, heb ik het concept van @tatu Ulmanen gebruikt en er een reeks objecten van gemaakt. Deze eenvoudige functie neemt een reeks geplakte Excel- (of Google-blad)gegevens (bij voorkeur uit een textarea) en verandert deze in een reeks objecten. Het gebruikt de eerste rij voor kolom-/eigenschapsnamen.

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

Hopelijk helpt het iemand in de toekomst.


Antwoord 6, autoriteit 2%

UPDATE: dit is alleen waar als u ALLEEN OFFICE gebruikt in plaats van MS Excel.

Er is eigenlijk een stroom in alle antwoorden die hier worden gegeven en ook in de geaccepteerde. De stroom is dat wanneer je een lege cel in Excel hebt en die kopieert, je in het klembord 2 tabtekens naast elkaar hebt, dus na het splitsen krijg je een extra item in de array, dat dan verschijnt als een extra cel in die rij en verplaatst alle andere cellen met één. Dus om dat te voorkomen moet je in principe alle dubbele tab (tabs naast elkaar) tekens in een string vervangen door één tab char en deze dan pas splitsen.

Er is een bijgewerkte versie van @userfuser’s jsfiddle om dat probleem op te lossen door geplakte gegevens te filteren met 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');
    })
  })
})

Antwoord 7

Excel 2007 heeft een functie om dit te doen onder het tabblad “Gegevens” dat behoorlijk goed werkt.


Antwoord 8

Dit opgraven, voor het geval iemand het in de toekomst tegenkomt. Ik gebruikte de bovenstaande code zoals bedoeld, maar stuitte toen op een probleem met het weergeven van de tabel nadat deze naar een database was verzonden. Het is veel gemakkelijker als u de gegevens eenmaal hebt opgeslagen om PHP te gebruiken om de nieuwe regels en tabbladen in uw zoekopdracht te vervangen. U kunt de vervanging uitvoeren na indiening, $_POST[request] is de naam van uw tekstgebied:

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

Voer nu gewoon $request in uw database in en het wordt opgeslagen als een HTML-tabel.

Other episodes