Có cách nào hoặc thư viện tiêu chuẩn để sao chép và dán từ bảng tính vào biểu mẫu web? Khi tôi chọn nhiều ô từ Excel I (hiển nhiên) 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. Có phải thực hiện trong VB không? hoặc quá trình xử lý có thể được thực hiện sau khi hành động dán được bắt đầu trên biểu mẫu web không?Sao chép/dán từ Excel vào trang web
Trả lời
Bạn không mất delimiters, các tế bào được phân cá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ự 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 hàng đẹp mắt. Thật dễ dàng sau đó để chia các trường theo tab và thay thế chúng bằng một thứ khác, theo cách này bạn có thể xây dựng ngay cả một bảng từ chúng. Dưới đây là 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 bảng HTML từ dữ liệu Excel được dán.
yêu thích, Cảm ơn! –
Tôi đã chơi xung quanh với một vấn đề tương tự, nó là đáng chú ý, dán vào một hộp văn bản, bạn 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. –
Vì lý do thực tế, bạn có thể làm cho câu trả lời này là một đoạn trích để sử dụng trong tương lai. – AdrianoRR
Có thể sẽ tốt hơn nếu bạn đọc tệp excel của mình từ PHP và sau đó lưu tệp đó vào DB hoặc thực hiện một số thao tác trên đó.
đây một trong nợ hướng dẫn về làm thế nào để đọ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 đã đi đến chủ đề này như tôi hiện đang làm điều này và nó là vô cùng dễ bị lỗi. Excel đôi khi nhổ ra các con số dưới dạng số nguyên, đôi khi đôi khi nổi như chuỗi. –
cũng là trường hợp người dùng áp dụng, nơi bạn cần dán từ các nguồn không đáng tin cậy, như ngân hàng của bạn, có tệp xls/csv chứa đầy crap cần phải được tìm kiếm thủ công – ZJR
Excel 2007 có tính năng để thực hiện việc này trong tab "Dữ liệu" hoạt động khá độc đáo.
Ý 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.
Cách nào có thể nhanh hơn cho 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 không? – BvilleBullet
tùy thuộc vào biểu mẫu bạn muốn gửi. Tôi sẽ tạo ra một json được rút gọn từ đó và đăng nó như một trường duy nhất tới máy chủ. – Mic
Nhân tiện, cách này cũng hoạt động đối với một bảng Word (một trong những biểu mẫu "di sản" của người dùng mà chúng tôi đang cố gắng chuyển đổi). Cảm ơn. –
Đào lên điều này, trong trường hợp bất kỳ ai gặp phải vấn đề này trong tương lai. Tôi đã sử dụng mã trên như dự định, nhưng sau đó chạy vào một vấn đề hiển thị bảng sau khi nó đã được gửi đến một cơ sở dữ liệu. Nó 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 bạn. Bạn có thể thực hiện việc thay thế khi nộp, $ _POST [yêu cầu] sẽ là tên của textarea 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 $ yêu cầu 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.
Trên OSX và Windows, có nhiều loại clipboards 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 bản rõ và trong khay nhớ tạm html.
Cách đúng (không bị vấp phải bởi các vấn đề phân tách) là phân tích cú pháp HTML. http://jsbin.com/uwuvan/5 là một bản trình diễn đơn giản cho thấy cách lấy khay nhớ tạm HTML.Điều quan trọng là để ràng buộc vào 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 cho phương pháp này không còn hoạt động nữa?Trong giao diện điều khiển trình duyệt, tôi thấy nội dung văn bản/nội dung đơn giản được ghi lại, nhưng nội dung văn bản/html trống. –
Tính năng này hoạt động với chrome hoặc trên các cửa sổ có excel hoặc trên ubuntu với libreOffice. Giải pháp IMO tốt nhất, vì nó giữ tất cả các định dạng từ các trang tính gốc. – BiAiB
Đáp lại câu trả lời của Tatu Tôi đã tạo ra một cách nhanh chóng jsFiddle cho trưng bày giải pháp của mình:
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);
}
Và đây là 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 lập tức trên sự kiện dán: http://jsfiddle.net/sTX7y/690/ Về cơ bản, nó mô phỏng sự kiện 'afterpaste'. – userfuser
Đối với bất kỳ googlers trong tương lai kết thúc ở đây như tôi, tôi đã sử dụng khái niệm @tatu Ulmanen và chỉ biến nó thành một mảng các đối tượng. Hàm đơn giản này lấy một chuỗi dữ liệu excel được dán (hoặc trang tính Google) (tốt nhất là từ một số textarea
) và biến nó thành một mảng các đố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 nó sẽ giúp ai đó trong tương lai.
CẬP NHẬT: Điều này chỉ đúng nếu bạn sử dụng ONLYOFFICE thay vì MS Excel.
Có thực sự là một luồng trong tất cả các câu trả lời được cung cấp ở đây và cũng có trong câu trả lời được chấp nhận. Dòng chảy là bất cứ khi nào bạn có một ô trống trong excel và sao chép, trong clipboard bạn có 2 ký tự tab bên cạnh nhau, vì vậy sau khi tách bạn nhận được một mục bổ sung trong mảng, sau đó xuất hiện dưới dạng ô bổ sung trong hàng đó và di chuyển tất cả các ô khác bằng một. Vì vậy, để tránh rằng bạn về cơ bản cần phải thay thế tất cả các tab đôi (tab bên cạnh nhau chỉ) ký tự trong một chuỗi với một tab char và chỉ sau đó chia nó.
Một phiên bản cập nhật của jsfiddle @ userfuser là đây để khắc phục vấn đề đó 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 xảy ra chỉ khi bạn sao chép từ bảng tính của phần mềm ONLYOFFICE. Hmm .. Để cái này ở đây trong trường hợp ai đó tình cờ gặp nó. – Aram
bạn đang cố gắng để tự động hóa một cái gì đó? Bạn có thể đưa ra một ví dụ tốt hơn ... –
Tôi sợ đặt câu hỏi này. Cảm ơn bạn đã làm điều đó, và để được như vậy ngắn gọn. :) –