Как я могу экспортировать таблицы, чтобы преуспеть с веб-страницы

Как я могу экспортировать таблицы, чтобы преуспеть с веб-страницы. Я хочу, чтобы экспорт содержал все форматирование и цвета.

Ответ 1

Далеко и самый чистый, самый простой экспорт из таблиц в Excel JQuery DataTables Table Tools плагин. Вы получаете сетку, которая сортирует, фильтрует, заказы и страницы ваших данных, а также всего несколько дополнительных строк кода и два небольших файла, вы получаете экспорт в Excel, PDF, CSV, в буфер обмена и на принтер.

Это весь необходимый код:

  $(document).ready( function () {
    $('#example').dataTable( {
        "sDom": 'T<"clear">lfrtip',
        "oTableTools": {
            "sSwfPath": "/swf/copy_cvs_xls_pdf.swf"
        }
    } );
} );

Итак, быстро развертывайте, не ограничивайте возможности браузера, не требуйте языка на сервере, и больше всего очень легко понять. Это беспроигрышный. Единственное, что у него есть, - это строгое форматирование столбцов.

Если форматирование и цвета являются абсолютными обработчиками, единственный 100% -ный надежный метод кросс-браузера, который я нашел, - это использовать серверный язык для обработки файлов Excel из вашего кода. Мое решение выбора PHPExcel Это единственный, который я нашел до сих пор, который позитивно обрабатывает экспорт с форматированием в MODERN версию Excel из любого браузера, когда вы ничего не даете, кроме HTML. Позвольте мне пояснить, однако, это определенно не так просто, как первое решение, а также немного ресурс. Однако, с положительной стороны, он также может выводить непосредственно в PDF. И, как только вы его настроите, он просто работает, каждый раз.

ОБНОВЛЕНИЕ - 15 сентября 2016 г. TableTools был прекращен в пользу нового плагина под названием " buttons" Эти инструменты выполняют те же функции, что и старое расширение TableTools, но FAR легче установить, и они используют загрузку HTML5 для современных браузеров, с возможностью возврата к исходной загрузке Flash для браузеров, которые не поддерживают HTML5 стандарт. Как вы можете видеть из многочисленных комментариев, так как я опубликовал этот ответ в 2011 году, была устранена основная слабость TableTools. Я по-прежнему не могу рекомендовать DataTables достаточно для обработки больших объемов данных просто как для разработчика, так и для пользователя.

Ответ 2

Давным-давно я обнаружил, что Excel откроет HTML файл с таблицей, если мы отправим его с типом содержимого Excel. Рассмотрим вышеприведенный документ:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Java Friends</title>
</head>
<body>
  <table style="font-weight: bold">
    <tr style="background-color:red"><td>a</td><td>b</td></tr>
    <tr><td>1</td><td>2</td></tr>
  </table>    
</body>
</html>

Я запустил в нем следующий букмарклет:

javascript:window.open('data:application/vnd.ms-excel,'+document.documentElement.innerHTML);

и на самом деле я получил его в виде файла Excel. Однако, я не получил ожидаемого результата - файл был открыт в OpenOffice.org Writer. Это моя проблема: у меня нет Excel в этой машине, поэтому я не могу попробовать ее лучше. Кроме того, этот трюк работал более или менее шесть лет назад со старыми браузерами и антикварной версией MS Office, поэтому я действительно не могу сказать, будет ли это работать сегодня.

В любом случае, в документе выше я добавил кнопку, которая будет загружать весь документ в виде файла Excel, теоретически:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Java Friends</title>
</head>
<body>
  <table style="font-weight: bold">
    <tr style="background-color:red"><td>a</td><td>b</td></tr>
    <tr><td>1</td><td>2</td></tr>
    <tr>
      <td colspan="2">
        <button onclick="window.open('data:application/vnd.ms-excel,'+document.documentElement.innerHTML);">
            Get as Excel spreadsheet
        </button>
      </td>
    </tr>
  </table>    
</body>
</html>

Сохраните его в файле и нажмите кнопку. Мне бы хотелось узнать, работает ли это или нет, поэтому я прошу вас прокомментировать даже за то, что он не работает.

Ответ 3

Можно использовать старый формат Excel 2003 XML (до OpenXML), чтобы создать строку, содержащую нужный вам XML, затем на стороне клиента вы можете использовать URI данных, чтобы открыть файл с использованием типа MIM типа XSL или отправить файл клиенту, используя тип mimetype Excel "Content-Type: application/vnd.ms-excel" со ​​стороны сервера.

  • Откройте Excel и создайте рабочий лист с нужным форматированием и цветами.
  • Сохраните книгу Excel как "XML Spreadsheet 2003 (*.xml)"
  • Откройте полученный файл в текстовом редакторе, таком как блокнот, и скопируйте значение в строку в приложении
  • Предполагая, что вы используете подход на стороне клиента с данными uri, код будет выглядеть так:
    
    <script type="text/javascript">
    var worksheet_template = '<?xml version="1.0"?><ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">'+
                 '<ss:Styles><ss:Style ss:ID="1"><ss:Font ss:Bold="1"/></ss:Style></ss:Styles><ss:Worksheet ss:Name="Sheet1">'+
                 '<ss:Table>{{ROWS}}</ss:Table></ss:Worksheet></ss:Workbook>';
    var row_template = '<ss:Row ss:StyleID="1"><ss:Cell><ss:Data ss:Type="String">{{name}}</ss:Data></ss:Cell></ss:Row>';
    </script>
    
    
  • Затем вы можете использовать замену строки, чтобы создать набор строк, которые будут вставлены в ваш шаблон рабочего листа
    
    <script type="text/javascript">
    var rows = document.getElementById("my-table").getElementsByTagName('tr'),
      row_data = '';
    for (var i = 0, length = rows.length; i < length; ++i) {
    row_data += row_template.replace('{{name}}', rows[i].getElementsByTagName('td')[0].innerHTML);
    }
    </script>
    
    
  • Как только у вас будет собранная информация, создайте финальную строку и откройте новое окно, используя URI данных

    
    <script type="text/javascript">
    var worksheet = worksheet_template.replace('{{ROWS}}', row_data);
    
    

    window.open('data:application/vnd.ms-excel,'+worksheet); </script>

Стоит отметить, что старые браузеры не поддерживают схему URI данных, поэтому вам может потребоваться создать файловую серверную версию для тех браузеров, которые ее не поддерживают.

Вам также может потребоваться выполнить кодировку base64 в содержимом URI данных, для чего может потребоваться js library, а также добавление строки '; base64' после типа mime в URI данных.

Ответ 4

В Excel есть небольшая известная функция под названием "Веб-запросы", которая позволяет получать данные практически с каждой веб-страницы без дополнительного программирования.

Веб-запрос обычно запускает HTTP-запрос непосредственно из Excel и копирует некоторые или все полученные данные (и, возможно, форматирование) на рабочий лист.

После того, как вы определили веб-запрос, вы можете обновить его в любое время, даже не исключив excel. Таким образом, вам не нужно фактически "экспортировать" данные и сохранить их в файл - лучше обновить данные так же, как из базы данных.

Вы даже можете использовать параметры URL, указав excel для определенных критериев фильтрации и т.д.

Однако недостатки, которые я заметил до сих пор:

  • динамически загруженные данные недоступны, поскольку Javascript не выполняется
  • Длина URL ограничена.

Here - вопрос о том, как создавать веб-запросы в Excel. Он ссылается на Справочный сайт Microsoft о том, как получить внешние данные с веб-страницы

Ответ 5

Это php, но вы можете изменить его на javascript:

<?php>
$colgroup = str_repeat("<col width=86>",5);
$data = "";
$time = date("M d, y g:ia");
$excel = "<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\">
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html>
<head>
<meta http-equiv=\"Content-type\" content=\"text/html;charset=utf-8\" />
<style id=\"Classeur1_16681_Styles\">
.xl4566 {
color: red;
}
</style>
</head>
<body>
<div id=\"Classeur1_16681\" align=center x:publishsource=\"Excel\">
<table x:str border=0 cellpadding=0 cellspacing=0 style=\"border-collapse: collapse\">
<colgroup>$colgroup</colgroup>
<tr><td class=xl2216681><b>Col1</b></td><td class=xl2216681><b>Col2</b></td><td class=xl2216681 ><b>Col3</b></td><td class=xl2216681 ><b>Col4</b></td><td class=xl2216681 ><b>Col5</b></td></tr>
<tr><td class=xl4566>1</td><td>2</td><td>3</td><td>4</td><td>5</td></tr>
</table>
</div>
</body>
</html>";
  $fname = "Export".time().".xls";
  $file = fopen($fname,"w+");
  fwrite($file,$excel);
  fclose($file);
  header('Content-Type: application/vnd.ms-excel');
  header('Content-Disposition: attachment; filename="'.basename($fname).'"');
  readfile($fname);
  unlink($fname); ?>    

Ответ 6

Во-первых, я бы не рекомендовал попробовать экспортировать Html и надеюсь, что пользовательский экземпляр Excel подберет его. Мой опыт в том, что это решение чревато проблемами, включая несовместимость с клиентами Macintosh, и сообщение пользователю о том, что данный файл не соответствует указанному формату. Самое пуленепробиваемое, удобное для пользователя решение - серверное, где вы используете библиотеку для создания фактического файла Excel и отправляете обратно пользователю. Следующим лучшим решением и более универсальным решением будет использование формата Open XML. Я столкнулся с несколькими редкими проблемами совместимости со старыми версиями Excel, но в целом это должно дать вам решение, которое будет работать с любой версией Excel, включая Mac.

Open XML

Ответ 7

mozilla по-прежнему поддерживает базовые 64 URI. Это позволяет динамически компоновать двоичный контент с помощью javascript:

<a href="data:application/vnd.ms-excel<base64 encoded binary excel content here>"> download xls</a>

если ваш файл excel не очень причудливый (нет диаграмм, формул, макросов), вы можете выкопать в формат и составить байты для своего файла, а затем закодировать их с base64 и вставить в href

см. https://developer.mozilla.org/en/data_URIs

Ответ 8

Этот код является только IE, поэтому он полезен только в ситуациях, когда вы знаете, что все ваши пользователи будут использовать IE (например, в некоторых корпоративных средах).

<script Language="javascript">
function ExportHTMLTableToExcel()
{
   var thisTable = document.getElementById("tbl").innerHTML;
   window.clipboardData.setData("Text", thisTable);
   var objExcel = new ActiveXObject ("Excel.Application");
   objExcel.visible = true;

   var objWorkbook = objExcel.Workbooks.Add;
   var objWorksheet = objWorkbook.Worksheets(1);
   objWorksheet.Paste;
}
</script>

Ответ 9

Предположения:

  • с адресом URL

  • преобразование должно выполняться на стороне клиента

  • системы - это Windows, Mac и Linux.

Решение для Windows:

код python, который открывает окно ie и имеет к нему доступ: переменная theurl содержит URL ('http://')

ie = Dispatch("InternetExplorer.Application")
ie.Visible = 1
ie.Navigate(theurl)

Примечание. Если страница недоступна напрямую, но логин, вам нужно будет обработать ее, введя данные формы и эмулируя действия пользователя с помощью python

вот пример

from win32com.client import Dispatch
ie.Document.all('username').value=usr
ie.Document.all('password').value=psw

тот же способ для извлечения данных с веб-страницы. Пусть говорят, что элемент с id 'el1' содержит данные. извлечение текста элемента в переменную

el1 = ie.Document.all('el1').value

тогда, когда данные находятся в переменной python, вы можете открыть экран excel аналогичным образом с помощью python:

from win32com.client import Dispatch
xlApp = Dispatch("Excel.Application")
xlWb = xlApp.Workbooks.Open("Read.xls")
xlSht = xlWb.WorkSheets(1)
xlSht.Cells(row, col).Value = el1

Решение для Mac:

только совет: используйте AppleScript - он имеет простой и похожий API как win32com.client Dispatch

Решение для Linux:

java.awt.Robot может работать для этого, у него есть щелчок, нажатие клавиши (горячие клавиши могут использоваться), но ни один API для Linux, о котором я знаю, не может работать так же просто, как AppleScript

Ответ 10

Это на самом деле более просто, чем вы думаете: "Просто" скопируйте таблицу HTML (то есть: код HTML для таблицы) в буфер обмена. Excel умеет декодировать HTML-таблицы; он даже попытается сохранить атрибуты.

Жесткая часть - это "скопировать таблицу в буфер обмена", поскольку нет стандартного способа доступа к буферу из JavaScript. См. Это сообщение в блоге: Доступ к системному буферу с JavaScript - Святой Грааль?

Теперь все, что вам нужно, это таблица как HTML. Я предлагаю jQuery и метод html().

Ответ 11

простой поиск в Google показал это:

Если данные на самом деле являются HTML-страницей и не были созданы ASP, PHP или каким-либо другим языком сценариев, и вы используете Internet Explorer 6, и на вашем компьютере установлен Excel, просто щелкните правой кнопкой мыши на и просмотрите меню. Вы должны увидеть "Экспорт в Microsoft Excel". Если все эти условия верны, щелкните элемент меню, и после нескольких запросов он будет импортирован в Excel.

если вы не можете этого сделать, он дает альтернативный метод "перетаскивания":

http://www.mrkent.com/tools/converter/

Ответ 13

Есть два практических способа сделать это автоматически, в то время как во всех браузерах можно использовать только одно решение. Прежде всего, вы должны использовать открытую спецификацию xml для создания листа excel. Доступны бесплатные плагины от Microsoft, которые делают этот формат также доступным для более старых офисных версий. Открытый xml является стандартным с 2007 года. Оба пути очевидны для серверов или клиентов.

Реализация клиентов использует новый стандарт CSS, который позволяет хранить данные, а не только URL-адрес данных. Это отличный подход, потому что вам не нужен серверный сервер, просто данные и некоторые javascript. Недостатком убийства является то, что microsoft не поддерживает все его части в текущих версиях IE (я не знаю об IE9). Microsoft ограничивает данные как образ, но нам нужен документ. В firefox это работает отлично. Для меня IE был причиной убийства.

Другим способом является реализация пользователем сервера. Должно быть много реализаций открытого XML для всех языков. Вам просто нужно захватить один. В большинстве случаев это будет самый простой способ модифицировать Viewmodel, чтобы получить документ, но вы можете отправить все данные с Clientside на сервер и сделать то же самое.

Ответ 14

   function normalexport() {

       try {
           var i;
           var j;
           var mycell;
           var tableID = "tblInnerHTML";
           var drop = document.getElementById('<%= ddl_sections.ClientID %>');
           var objXL = new ActiveXObject("Excel.Application");
           var objWB = objXL.Workbooks.Add();
           var objWS = objWB.ActiveSheet;
           var str = filterNum(drop.options[drop.selectedIndex].text);
           objWB.worksheets("Sheet1").activate; //activate dirst worksheet
           var XlSheet = objWB.activeSheet; //activate sheet
           XlSheet.Name = str; //rename


           for (i = 0; i < document.getElementById("ctl00_ContentPlaceHolder1_1").rows.length - 1; i++) {
               for (j = 0; j < document.getElementById("ctl00_ContentPlaceHolder1_1").rows(i).cells.length; j++) {
                   mycell = document.getElementById("ctl00_ContentPlaceHolder1_1").rows(i).cells(j);

                   objWS.Cells(i + 1, j + 1).Value = mycell.innerText;

                   //                                                objWS.Cells(i + 1, j + 1).style.backgroundColor = mycell.style.backgroundColor;
               }
           }

           objWS.Range("A1", "L1").Font.Bold = true;
           //                objWS.Range("A1", "L1").Font.ColorIndex = 2;
           //                 objWS.Range("A1", "Z1").Interior.ColorIndex = 47;

           objWS.Range("A1", "Z1").EntireColumn.AutoFit();

           //objWS.Range("C1", "C1").ColumnWidth = 50;

           objXL.Visible = true;

       } catch (err) {
           alert("Error. Scripting for ActiveX might be disabled")
           return
       }
       idTmr = window.setInterval("Cleanup();", 1);

   }


   function filterNum(str) {

       return str.replace(/[ / ]/g, '');
   }