Excel'den bir web sayfasına Kopyala / Yapıştır


89

Bir elektronik sayfadan web formuna kopyalayıp yapıştırmanın standart bir yolu veya kitaplığı var mı? Excel'den birden fazla hücre seçtiğimde, sınırlayıcıyı (tabii ki) kaybediyorum ve tümü web formunun bir hücresine yapıştırılıyor. VB'de yapılması gerekiyor mu? veya web formunda yapıştırma işlemi başlatıldığında işlem yapılabilir mi?


Bir şeyi otomatikleştirmeye mi çalışıyorsun? Daha iyi bir örnek verebilir misiniz ...
Dayton Brown

2
Bu soruyu sormaya korkuyordum. Bunu yaptığınız ve bu kadar özlü davrandığınız için teşekkür ederim. :)
Nostalg.io

Yanıtlar:


94

Sınırlayıcıları kaybetmezsiniz, hücreler sekmelerle ( \t) ve satırlar \nformda görünmeyen yeni satırlarla ( ) ayrılır . Kendiniz deneyin: Excel'den Not Defteri'ne içerik kopyalayın ve hücrelerinizin güzel bir şekilde sıralandığını göreceksiniz. O zaman alanları sekmelere ayırmak ve başka bir şeyle değiştirmek kolaydır, bu şekilde onlardan bir tablo bile oluşturabilirsiniz. İşte jQuery kullanan bir örnek:

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

Yani özünde, bu komut dosyası yapıştırılan Excel verilerinden bir HTML tablosu oluşturur.


9
Ben de benzer bir problemle uğraşıyordum, not etmeye değer, bir metin kutusuna yapıştırırsanız, yeni satırları kaybedersiniz. Bir metin alanına yapıştırırken bunları saklarsınız.
wobbily_col

Pratik nedenlerden dolayı, bu yanıtı ileride kullanmak üzere bir pasaj haline getirebilirsiniz.
AdrianoRR

1
Bir hücre içinde yeni bir satır varsa bu kesilir.
th3byrdm4n

Bununla ilgili kısa bir not - mükemmel çalışır, ancak Excel veriler kopyalandığında son bir satır ekler, böylece boş bir satır elde edersiniz td. Sadece Bilginize
jg2703

bu hızlı ama kısa vadeli bir çözüm, peki ya hücrelerimden biri içinde \ n içeriyorsa
MeVimalkumar

27

Tatu'nun cevabına yanıt olarak, çözümünü sergilemek için hızlı bir jsFiddle oluşturdum:

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
Ve işte bu yanıta eklemem , ancak otomatik tablo ile hemen yapıştırma olayında gösteriliyor: jsfiddle.net/sTX7y/690 Temel olarak, 'afterpaste' olayını simüle ediyor.
userfuser

12

On OSX ve Windows'un , farklı içerik türleri için panolarda birden türleri vardır. Excel'de içerik kopyaladığınızda, veriler düz metinde ve html panosunda depolanır.

Doğru yol (sınırlayıcı sorunları nedeniyle hata yapmaz) HTML'yi ayrıştırmaktır. http://jsbin.com/uwuvan/5 , HTML panosunun nasıl alınacağını gösteren basit bir demodur . Anahtar, onpaste olayına bağlanmak ve

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

Jsbin benim için beklendiği gibi çalışmadı (Win 7 üzerinde Firefox 42, Excel 2013). Bu yanıtı gönderdikten sonra önemli bir şey değişti mi, bu da bu yaklaşımın artık işe yaramamasına neden oluyor mu? Tarayıcı konsolunda, metin / düz içeriğin günlüğe kaydedildiğini görüyorum, ancak metin / html içeriği boş.
Christian Semrau

Bu, chrome ile excel içeren pencerelerde veya libreOffice ile ubuntu'da çalışır. En iyi çözüm IMO, orijinal sayfalardaki tüm biçimlendirmeyi koruduğu için.
BiAiB

bu oldukça alakalı cevap ancak daha fazla
ayrıntıya

8

Tatu ile aynı fikir (teşekkür ederim yakında projemizde ihtiyacım olacak), ancak düzenli bir ifadeyle.
Büyük veri kümesi için daha hızlı olabilir.

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

Merhaba Mic, bu harika bir kod! Bu tablo dönüşümünü gönderilebilir bir forma nasıl alabileceğime dair herhangi bir fikriniz var mı?
BvilleBullet

göndermek istediğiniz forma bağlıdır. Bundan stringized bir json yapıp sunucuya tek bir alan olarak gönderirdim.
Mic

Bu arada, bu bir Word tablosu için de işe yarıyor (kullanıcılarımdan birinin dönüştürmeye çalıştığımız eski "formları"). Teşekkürler.
Hugh Seagraves

5

Buraya benim gibi gelecek herhangi bir Google çalışanı için @tatu Ulmanen'in konseptini kullandım ve onu bir dizi nesneye dönüştürdüm. Bu basit işlev, yapıştırılmış excel (veya Google sayfası) verilerinden (tercihen textareaa'dan) oluşan bir dizi alır ve bunları bir dizi nesneye dönüştürür. Sütun / özellik adları için ilk satırı kullanır.

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

Umarım gelecekte birine yardımcı olur.


1

GÜNCELLEME: Bu yalnızca MS Excel yerine ONLYOFFICE kullanıyorsanız geçerlidir.

Aslında burada verilen tüm cevaplarda ve ayrıca kabul edilen cevaplarda bir akış var. Akış, excel'de boş bir hücreye sahip olduğunuzda ve bunu kopyaladığınızda, panoda yan yana 2 sekme karakteriniz olduğu için, böldükten sonra dizide ek bir öğe alırsınız ve bu öğe, o satırda fazladan bir hücre olarak görünür. ve diğer tüm hücreleri birer birer taşır. Bu nedenle, temelde bir dizedeki tüm çift sekmeli (yalnızca birbirinin yanındaki sekmeler) karakterleri bir sekme karakteriyle değiştirmeniz ve yalnızca daha sonra bölmeniz gerekir.

@ Userfuser'in jsfiddle'ın güncellenmiş bir sürümü, yapıştırılan verileri removeExtraTabs ile filtreleyerek bu sorunu çözmek için burada.

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

Aslında bunun sadece ONLYOFFICE yazılımının elektronik tablosundan kopyaladığınızda olduğunu öğrendim. Hmm .. Birinin üzerine düşme ihtimaline karşı bunu burada bırakıyorum.
Aram

0

Excel 2007, oldukça güzel çalışan "Veri" sekmesi altında bunu yapmak için bir özelliğe sahiptir.


0

Gelecekte birisinin karşısına çıkma ihtimaline karşı, bunu kazmak. Yukarıdaki kodu amaçlandığı gibi kullandım, ancak daha sonra bir veritabanına gönderildikten sonra tabloyu görüntüleyen bir sorunla karşılaştım. Sorgunuzdaki yeni satırları ve sekmeleri değiştirmek için PHP'yi kullanmak üzere verileri depoladıktan sonra çok daha kolay. Değiştirmeyi gönderdikten sonra gerçekleştirebilirsiniz, $ _POST [istek] metin alanınızın adı olacaktır:

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

Şimdi veritabanınıza $ request ekleyin ve bu bir HTML tablosu olarak saklanacaktır.


-1

Excel dosyanızı PHP'den okuyup daha sonra bir DB'ye kaydederseniz veya üzerinde bazı işlemler yaparsanız daha iyi olur.

burada, PHP ile Excel verilerinin nasıl okunacağı ve yazılacağı hakkında ayrıntılı bir eğitim:
http://www.ibm.com/developerworks/opensource/library/os-phpexcel/index.html


Bu kesinlikle korkunç bir çözüm. Şu anda bunu yaptığım için bu konuya geldim ve inanılmaz derecede hataya meyilli. Excel bazen sayıları tamsayı olarak, bazen kayan, bazen dizeler olarak tükürür.
wobbily_col

xls / csv dosyaları manuel olarak elenmesi gereken saçmalıklarla dolu bankanız gibi güvenilmez kaynaklardan yapıştırmanız gereken kullanıcı senaryoları da geçerlidir
ZJR
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.