Sao chép / Dán từ Excel vào một trang web


88

Có cách hoặc thư viện tiêu chuẩn nào để sao chép và dán từ một spreasheet sang một biểu mẫu web không? Khi tôi chọn nhiều ô từ Excel, tôi (rõ ràng) sẽ mất dấu phân cách và tất cả được dán vào một ô của biểu mẫu web. Nó có phải được thực hiện trong VB? hoặc việc xử lý có thể được thực hiện khi hành động dán được bắt đầu trên biểu mẫu web không?


Bạn đang cố gắng tự động hóa một cái gì đó? Bạn có thể cho một ví dụ tốt hơn ...
Dayton Brown

2
Tôi sợ phải hỏi câu hỏi này. Cảm ơn bạn đã làm nó, và vì nó rất ngắn gọn. :)
Nostalg.io

Câu trả lời:


93

Bạn không bị mất dấu phân cách, các ô được phân tách bằng tab ( \t) và các hàng bằng dòng mới ( \n) có thể không hiển thị trong biểu mẫu. Hãy tự mình thử: sao chép nội dung từ Excel sang Notepad, và bạn sẽ thấy các ô của mình được xếp một cách độc đáo. Sau đó, thật dễ dàng để chia các trường theo các tab và thay thế chúng bằng một cái gì đó khác, bằng cách này, bạn có thể tạo ngay cả một bảng từ chúng. Đây là một ví dụ sử dụng 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);

Vì vậy, về bản chất, tập lệnh này tạo một bảng HTML từ dữ liệu Excel được dán.


9
Tôi đã chơi xung quanh với một vấn đề tương tự, điều đáng chú ý là, dán vào hộp văn bản, bạn sẽ mất các dòng mới. Trong khi dán vào một vùng văn bản, bạn giữ chúng.
wobbily_col

Vì những lý do thiết thực, bạn có thể đặt câu trả lời này thành một đoạn trích để sử dụng trong tương lai.
AdrianoRR

1
Nếu có một dòng mới trong một ô, điều này sẽ bị vỡ.
th3byrdm4n

Chỉ cần một ghi chú nhanh về điều này - hoạt động tuyệt vời nhưng Excel thêm một hàng theo sau khi dữ liệu được sao chép, vì vậy bạn sẽ kết thúc bằng một ô trống td. Just FYI
jg2703

đây là một cách nhanh chóng nhưng ngắn hạn giải pháp, những gì nếu một trong các tế bào của tôi chứa \ n trong nó
MeVimalkumar

27

Để đáp lại câu trả lời của Tatu, tôi đã tạo một jsFiddle nhanh để giới thiệu giải pháp của anh ấy:

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
Và đây là phần bổ sung của tôi cho câu trả lời này, nhưng với bảng tự động hiển thị, ngay khi dán sự kiện: jsfiddle.net/sTX7y/690 Về cơ bản, nó mô phỏng sự kiện 'dư vị'.
userfuser

12

Trên OSXWindows , có nhiều loại khay nhớ tạm cho các loại nội dung khác nhau. Khi bạn sao chép nội dung trong Excel, dữ liệu được lưu trữ trong văn bản rõ ràng và trong khay nhớ tạm thời html.

Cách đúng đắn (không gặp phải vấn đề về dấu phân cách) là phân tích cú pháp HTML. http://jsbin.com/uwuvan/5 là một bản demo đơn giản cho thấy cách lấy khay nhớ tạm HTML. Điều quan trọng là liên kết với sự kiện onpaste và đọc

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

Jsbin không hoạt động như mong đợi đối với tôi (Firefox 42 trên Win 7, Excel 2013). Có điều gì quan trọng đã thay đổi kể từ khi bạn đăng câu trả lời này, điều này khiến cách tiếp cận này không còn hoạt động nữa không? Trong bảng điều khiển của trình duyệt, tôi thấy nội dung văn bản / nội dung thuần túy được ghi lại, nhưng nội dung văn bản / html trống.
Christian Semrau

Điều này hoạt động với chrome hoặc trên windows với excel hoặc trên ubuntu với libreOffice. IMO giải pháp tốt nhất, vì nó giữ tất cả các định dạng từ các trang tính gốc.
BiAiB

câu trả lời nhưng cần khá liên quan này quy định chi tiết hơn
MeVimalkumar

8

Ý tưởng tương tự như Tatu (cảm ơn, tôi sẽ cần nó sớm trong dự án của chúng tôi), nhưng với một biểu thức chính quy.
Điều này có thể nhanh hơn đối với tập dữ liệu lớn.

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

Xin chào Mic, đây là mã tuyệt vời! Bạn có bất kỳ thông tin chi tiết nào về cách tôi có thể chuyển đổi bảng này thành một biểu mẫu có thể gửi được không?
BvilleBullet

nó phụ thuộc vào hình thức bạn muốn gửi. Tôi sẽ tạo một json được xâu chuỗi từ đó và đăng nó dưới dạng một trường duy nhất lên máy chủ.
Mic

Nhân tiện, điều này cũng hoạt động cho bảng Word (một trong những "biểu mẫu" kế thừa của người dùng của tôi mà chúng tôi đang cố gắng chuyển đổi). Cảm ơn.
Hugh Seagraves

5

Đối với bất kỳ người dùng google nào trong tương lai kết thúc ở đây như tôi, tôi đã sử dụng khái niệm của @tatu Ulmanen và chỉ biến nó thành một mảng đối tượng. Hàm đơn giản này nhận một chuỗi dữ liệu excel (hoặc Google sheet) đã dán (tốt nhất là từ a textarea) và biến nó thành một mảng đối tượng. Nó sử dụng hàng đầu tiên cho tên cột / thuộc tính.

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

Hy vọng rằng nó sẽ giúp một ai đó trong tương lai.


1

CẬP NHẬT: Điều này chỉ đúng nếu bạn sử dụng ONLYOFFICE thay vì MS Excel.

Thực sự có một luồng trong tất cả các câu trả lời được cung cấp ở đây và cả trong câu được chấp nhận. Quy trình là bất cứ khi nào bạn có một ô trống trong excel và sao chép ô đó, trong khay nhớ tạm thời, bạn có 2 ký tự tab bên cạnh nhau, vì vậy sau khi tách bạn sẽ nhận được một mục bổ sung trong mảng, sau đó xuất hiện dưới dạng một ô bổ sung trong hàng đó và di chuyển tất cả các ô khác từng ô. Vì vậy, để tránh điều đó về cơ bản bạn cần thay thế tất cả các ký tự tab kép (chỉ các tab cạnh nhau) trong một chuỗi bằng một ký tự tab và chỉ sau đó tách nó ra.

Phiên bản cập nhật của jsfiddle @ userfuser có ở đây để khắc phục sự cố đó bằng cách lọc dữ liệu đã dán với 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');
    })
  })
})

Tôi thực sự phát hiện ra rằng điều này chỉ xảy ra nếu bạn sao chép từ bảng tính của phần mềm ONLYOFFICE. Hmm .. Để cái này ở đây phòng khi ai đó tình cờ gặp nó.
Aram

0

Excel 2007 có một tính năng để thực hiện việc này trong tab "Dữ liệu" hoạt động khá độc đáo.


0

Đào lên điều này, phòng khi có ai đó bắt gặp nó trong tương lai. Tôi đã sử dụng mã trên như dự định, nhưng sau đó gặp sự cố hiển thị bảng sau khi nó đã được gửi đến cơ sở dữ liệu. Sẽ dễ dàng hơn nhiều khi bạn đã lưu trữ dữ liệu để sử dụng PHP để thay thế các dòng và tab mới trong truy vấn của mình. Bạn có thể thực hiện thay thế khi gửi, $ _POST [request] sẽ là tên của vùng văn bản của bạn:

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

Bây giờ chỉ cần chèn $ request vào cơ sở dữ liệu của bạn và nó sẽ được lưu trữ dưới dạng bảng HTML.


-1

Có lẽ sẽ tốt hơn nếu bạn đọc tệp excel của mình từ PHP, và sau đó lưu nó vào DB hoặc thực hiện một số xử lý trên đó.

đây là hướng dẫn chi tiết về cách đọc và ghi dữ liệu Excel với PHP:
http://www.ibm.com/developerworks/opensource/library/os-phpexcel/index.html


Đó là một giải pháp hoàn toàn khủng khiếp. Tôi đến với chủ đề này vì tôi hiện đang làm điều này và nó rất dễ bị lỗi. Excel đôi khi giải ra các số dưới dạng số nguyên, đôi khi trôi nổi đôi khi dưới dạng chuỗi.
wobbily_col

cũng kịch bản người dùng áp dụng, nơi bạn cần phải dán từ các nguồn đáng tin cậy, như ngân hàng của bạn, mà xls / file csv có đầy đủ crap mà cần phải được sieved bằng tay
ZJR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.