Skopiuj / wklej z programu Excel do strony internetowej

88

Czy istnieje standardowy sposób lub biblioteka kopiowania i wklejania z arkusza kalkulacyjnego do formularza internetowego? Kiedy wybieram więcej niż jedną komórkę z Excela, (oczywiście) tracę ogranicznik i wszystko jest wklejane do jednej komórki formularza internetowego. Czy trzeba to zrobić w VB? czy może przetwarzanie może zostać wykonane po rozpoczęciu czynności wklejania w formularzu internetowym?

Jego głupota
źródło
Próbujesz coś zautomatyzować? Czy możesz podać lepszy przykład ...
Dayton Brown
2
Bałem się zadać to pytanie. Dziękuję za zrobienie tego i za zwięzłość. :)
Nostalg.io Kwietnia

Odpowiedzi:

93

Nie tracisz ograniczników, komórki są oddzielone tabulatorami ( \t), a wiersze znakami nowej linii ( \n), które mogą nie być widoczne w formularzu. Spróbuj sam: skopiuj zawartość z Excela do Notatnika, a zobaczysz, że twoje komórki są ładnie ułożone. Łatwo jest wtedy podzielić pola na zakładki i zastąpić je czymś innym, w ten sposób można zbudować z nich nawet tabelę. Oto przykład użycia 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);

Zasadniczo ten skrypt tworzy tabelę HTML z wklejonych danych programu Excel.

Tatu Ulmanen
źródło
9
Bawiłem się podobnym problemem, warto zauważyć, wklejając do pola tekstowego gubisz nowe linie. Podczas wklejania do obszaru tekstowego je zachowujesz.
wobbily_col
Ze względów praktycznych możesz uczynić tę odpowiedź fragmentem do wykorzystania w przyszłości.
AdrianoRR
1
Jeśli w komórce jest nowa linia, to się zepsuje.
th3byrdm4n
Krótka uwaga na ten temat - działa świetnie, ale Excel dodaje końcowy wiersz, gdy dane są kopiowane, więc kończy się pustym td. Do Twojej wiadomości
jg2703,
to jest szybkie, ale krótkoterminowe rozwiązanie, co jeśli jedna z moich komórek zawiera \ nw niej
MeVimalkumar,
27

W odpowiedzi na odpowiedź Tatu stworzyłem szybkie jsFiddle do zaprezentowania jego rozwiązania:

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);
}
dunderwood
źródło
3
A oto mój dodatek do tej odpowiedzi, ale z automatyczną tabelą pokazującą natychmiast po zdarzeniu wklejania: jsfiddle.net/sTX7y/690 Zasadniczo symuluje zdarzenie „afterpaste”.
userfuser
12

W systemach OSX i Windows istnieje wiele typów schowków dla różnych typów treści. Podczas kopiowania treści w programie Excel dane są przechowywane w postaci zwykłego tekstu oraz w schowku html.

Właściwym sposobem (który nie powoduje problemów z separatorami) jest przeanalizowanie kodu HTML. http://jsbin.com/uwuvan/5 to proste demo pokazujące, jak uzyskać schowek HTML. Kluczem jest powiązanie ze zdarzeniem onpaste i przeczytanie

event.clipboardData.getData('text/html')
SheetJS
źródło
Plik jsbin nie działał zgodnie z oczekiwaniami (Firefox 42 na Win 7, Excel 2013). Czy od czasu opublikowania tej odpowiedzi zmieniło się coś ważnego, co sprawia, że ​​to podejście już nie działa? W konsoli przeglądarki widzę zarejestrowany tekst / zwykłą zawartość, ale zawartość text / html jest pusta.
Christian Semrau
Działa to z Chrome w systemie Windows z programem Excel lub w systemie Ubuntu z libreOffice. Najlepsze rozwiązanie IMO, ponieważ zachowuje całe formatowanie z oryginalnych arkuszy.
BiAiB
ta dość trafna odpowiedź, ale potrzebna jest więcej szczegółów
MeVimalkumar
8

Ten sam pomysł co Tatu (dzięki, będę go potrzebował wkrótce w naszym projekcie), ale z wyrażeniem regularnym.
Co może być szybsze w przypadku dużego zbioru danych.

<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>
Mic
źródło
Cześć Mic, to świetny kod! Czy masz wgląd w to, jak mogę przekształcić tę tabelę w formularz do przesłania?
BvilleBullet
zależy to od formularza, który chcesz przesłać. Zrobiłbym z tego stringified json i opublikowałbym go jako pojedyncze pole na serwerze.
Mic
Nawiasem mówiąc, działa to również w przypadku tabeli programu Word (jeden z starszych „formularzy” moich użytkowników, który próbujemy przekonwertować). Dzięki.
Hugh Seagraves,
5

Dla przyszłych pracowników Google, którzy trafią tutaj, tak jak ja, wykorzystałem koncepcję @tatu Ulmanen i po prostu przekształciłem ją w szereg obiektów. Ta prosta funkcja pobiera ciąg wklejonych danych programu Excel (lub arkusza Google) (najlepiej z a textarea) i zamienia go w tablicę obiektów. Używa pierwszego wiersza dla nazw kolumn / właściwości.

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

Mam nadzieję, że pomoże to komuś w przyszłości.

Gruchać
źródło
1

AKTUALIZACJA: jest to prawdą tylko wtedy, gdy używasz ONLYOFFICE zamiast MS Excel.

Właściwie jest przepływ we wszystkich udzielonych tutaj odpowiedziach, a także w zaakceptowanej. Przepływ jest taki, że za każdym razem, gdy masz pustą komórkę w programie Excel i kopiujesz ją, w schowku masz 2 znaki tabulacji obok siebie, więc po podzieleniu otrzymujesz jeden dodatkowy element w tablicy, który następnie pojawia się jako dodatkowa komórka w tym wierszu i przesuwa wszystkie inne komórki o jeden. Aby tego uniknąć, w zasadzie musisz zamienić wszystkie podwójne znaki tabulacji (tylko tabulatory obok siebie) w ciągu na jeden znak tabulacji i dopiero wtedy go podzielić.

Zaktualizowana wersja jsfiddle @ userfuser jest tutaj, aby naprawić ten problem, filtrując wklejone dane za pomocą 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');
    })
  })
})
Aram
źródło
Dowiedziałem się, że dzieje się tak tylko wtedy, gdy kopiujesz z arkusza kalkulacyjnego oprogramowania ONLYOFFICE. Hmm ... Zostaw to tutaj na wypadek, gdyby ktoś się na to natknął.
Aram
0

Excel 2007 ma do tego funkcję na karcie „Dane”, która działa całkiem nieźle.

LeWoody
źródło
0

Odkopać to na wypadek, gdyby ktoś natknął się na to w przyszłości. Użyłem powyższego kodu zgodnie z przeznaczeniem, ale napotkałem problem z wyświetlaniem tabeli po przesłaniu jej do bazy danych. Po zapisaniu danych jest znacznie łatwiej, aby użyć PHP do zastąpienia nowych linii i zakładek w zapytaniu. Możesz dokonać zamiany po przesłaniu, $ _POST [żądanie] będzie nazwą Twojego obszaru tekstowego:

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

Teraz po prostu wstaw $ request do swojej bazy danych, a zostanie ona zapisana jako tabela HTML.

dcclassics
źródło
-1

Może byłoby lepiej, gdybyś przeczytał swój plik Excela z PHP, a następnie albo zapisał go w bazie danych, albo dokonał na nim przetwarzania.

tutaj szczegółowy samouczek dotyczący odczytywania i zapisywania danych Excela w PHP:
http://www.ibm.com/developerworks/opensource/library/os-phpexcel/index.html

Adnan
źródło
To absolutnie straszne rozwiązanie. Doszedłem do tego wątku, ponieważ obecnie to robię i jest on niesamowicie podatny na błędy. Excel czasami wypluwa liczby jako liczby całkowite, czasami jako liczby zmiennoprzecinkowe, czasami jako ciągi.
wobbily_col
obowiązują również scenariusze użytkowników, w których musisz wkleić z niewiarygodnych źródeł, takich jak bank, którego pliki xls / csv są pełne bzdur, które należy ręcznie przesiać
ZJR