Есть ли стандартный способ или библиотека для копирования и вставки из электронной таблицы в веб-форму? Когда я выбираю более одной ячейки в Excel, я (очевидно) теряю разделитель, и все вставляется в одну ячейку веб-формы. Это нужно делать на VB? или можно ли выполнить обработку после запуска действия вставки в веб-форме?
javascript
html
forms
excel
Его дерзость
источник
источник
Ответы:
Вы не потеряете разделители, ячейки разделяются табуляцией (
\t
), а строки - символом новой строки (\n
), которые могут быть не видны в форме. Попробуйте сами: скопируйте содержимое из Excel в Блокнот, и вы увидите, что ваши ячейки красиво выстроены в линию. Тогда легко разделить поля вкладками и заменить их чем-то другим, таким образом вы можете построить даже таблицу из них. Вот пример использования 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);
По сути, этот скрипт создает HTML-таблицу из вставленных данных Excel.
источник
td
. Just FYIВ ответ на ответ Тату я быстро создал jsFiddle для демонстрации своего решения:
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); }
источник
В OSX и Windows существует несколько типов буферов обмена для разных типов контента. Когда вы копируете содержимое в Excel, данные сохраняются в виде обычного текста и в буфере обмена HTML.
Правильный способ (который не связан с проблемами с разделителями) - это проанализировать HTML. http://jsbin.com/uwuvan/5 - это простая демонстрация, показывающая, как получить буфер обмена HTML. Ключ - привязать к событию onpaste и прочитать
event.clipboardData.getData('text/html')
источник
Та же идея, что и у Тату (спасибо, скоро в нашем проекте она понадобится), но с регулярным выражением.
Что может быть быстрее для большого набора данных.
<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>
источник
Для будущих гуглеров, оказавшихся здесь, как и я, я использовал концепцию @tatu Ulmanen и просто превратил ее в массив объектов. Эта простая функция принимает строку вставленных данных Excel (или таблицы Google) (предпочтительно из a
textarea
) и превращает ее в массив объектов. Он использует первую строку для имен столбцов / свойств.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; }
Надеюсь, это поможет кому-то в будущем.
источник
ОБНОВЛЕНИЕ: это верно, только если вы используете ONLYOFFICE вместо MS Excel.
На самом деле все ответы, представленные здесь, а также в принятом, есть поток. Поток заключается в том, что всякий раз, когда у вас есть пустая ячейка в excel и копируете ее, в буфере обмена у вас есть 2 символа табуляции рядом друг с другом, поэтому после разделения вы получаете один дополнительный элемент в массиве, который затем появляется как дополнительная ячейка в этой строке и перемещает все остальные ячейки на одну. Поэтому, чтобы избежать этого, вам в основном нужно заменить все символы двойной табуляции (только табуляции рядом друг с другом) в строке одним символом табуляции и только затем разделить его.
Обновленная версия jsfiddle @ userfuser здесь, чтобы исправить эту проблему путем фильтрации вставленных данных с помощью 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'); }) }) })
источник
В Excel 2007 есть функция для этого на вкладке «Данные», которая работает довольно хорошо.
источник
Копаем это на случай, если кто-нибудь столкнется с этим в будущем. Я использовал приведенный выше код по назначению, но затем столкнулся с проблемой отображения таблицы после того, как она была отправлена в базу данных. После того, как вы сохранили данные, гораздо проще использовать PHP для замены новых строк и вкладок в вашем запросе. Вы можете выполнить замену при отправке, $ _POST [запрос] будет именем вашего текстового поля:
$postrequest = trim($_POST[request]); $dirty = array("\n", "\t"); $clean = array('</tr><tr><td>', '</td><td>'); $request = str_replace($dirty, $clean, $postrequest);
Теперь просто вставьте $ request в свою базу данных, и она будет сохранена в виде таблицы HTML.
источник
Может быть, было бы лучше, если бы вы прочитали свой файл Excel с PHP, а затем либо сохранили его в БД, либо обработали его.
вот подробное руководство о том, как читать и записывать данные Excel с помощью PHP:
http://www.ibm.com/developerworks/opensource/library/os-phpexcel/index.html
источник