HTML-таблица в Excel (xls) с использованием javascript/jQuery

Я пытаюсь экспортировать таблицу html в документ Excel с помощью экспорта javascript/jquery. Пока я нашел 2 решения, но ни одно из них не соответствует моим требованиям:

Экспорт таблицы HTML

  • Не экспортирует встроенный стиль (стиль является обязательным требованием)

Table2Excel

  • Не работает во всех версиях IE (требуется совместимость со всеми браузерами)

Я ищу решение, которое является как можно минимальным (оба этих решения были очень «аккуратными», но, согласно моим комментариям выше, у них обоих было падение, которое не соответствовало моим требованиям.

Кто-нибудь знает лучшее решение? Мои требования к этому экспорту:

  • Должен работать во всех браузерах
  • Необходимо экспортировать встроенный стиль
  • ЕСЛИ ВОЗМОЖНО было бы неплохо иметь возможность назвать файл

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

Спасибо!


person David Dawson    schedule 11.06.2015    source источник


Ответы (1)


Я предполагаю, что PHP/Flash не подходит. (Если нет, проверьте PHPExcel и DataTables».

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

Прежде чем мы перейдем к коду, некоторые ограничения:

  1. Вам, вероятно, потребуется найти форматы MS Office XML для XLS и настроить
  2. Как только файл загрузится (это будет .xls), вы, вероятно, получите сообщение об ошибке, например: «Этот файл говорит, что он в формате XLS, но может быть и не так, вы все равно хотите его открыть?»
  3. Вам, вероятно, потребуется «Сохранить как» в каком-либо допустимом формате Excel, чтобы заставить его конвертировать из HTML в тело документа Excel.
  4. Я использовал это довольно широко в Chrome/Firefox/Internet Explorer, но вы должны проверить себя.
  5. В настоящее время установлено замораживание строк/столбцов. Измените XML и/или заморозьте переменные в верхней части функции tableToExcel().
  6. Ресурсоемкий на стороне клиента. Вероятно, лучше всего использовать какой-нибудь серверный скрипт.
  7. Существует ограничение на размер таблицы, которое (я предполагаю) основано на размере переменной javascript. Я использовал его с некоторыми столами, такими как 50x300, но я бы не рекомендовал его для столов гораздо большего размера.

Он принимает строку текста таблицы HTML (включая <table>). Вы можете отформатировать этот HTML с помощью встроенных стилей (к сожалению, не будет работать с таблицей стилей CSS).

tableToExcel($('table').html(),'Worksheet Name');

Вот функции. Наслаждаться!

function b64toBlob(b64Data, contentType, sliceSize) {
    contentType = contentType || '';
    sliceSize = sliceSize || 512;

    var byteCharacters = atob(b64Data);
    var byteArrays = [];

    for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
        var slice = byteCharacters.slice(offset, offset + sliceSize);

        var byteNumbers = new Array(slice.length);
        for (var i = 0; i < slice.length; i++) {
            byteNumbers[i] = slice.charCodeAt(i);
        }

        var byteArray = new Uint8Array(byteNumbers);

        byteArrays.push(byteArray);
    }

    var blob = new Blob(byteArrays, {type: contentType});
    return blob;
}

function tableToExcel(table,name) {
	var freezeTopRowNumber = '4';
	var freezeColNumber = '6';
	var template = '<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">';
	template += '<head><!--[if gte mso 9]>';
	template += '<xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name>';
	template += '<x:WorksheetOptions><x:Selected/><x:FreezePanes/><x:FrozenNoSplit/><x:SplitHorizontal>'+freezeTopRowNumber+'</x:SplitHorizontal><x:TopRowBottomPane>'+freezeTopRowNumber+'</x:TopRowBottomPane>';
	template += '<x:SplitVertical>'+freezeColNumber+'</x:SplitVertical><x:LeftColumnRightPane>'+freezeColNumber+'</x:LeftColumnRightPane>';
	template += '<x:ActivePane>2</x:ActivePane><x:Panes><x:Pane><x:Number>3</x:Number></x:Pane><x:Pane><x:Number>2</x:Number></x:Pane></x:Panes>';
	template += '<x:ProtectContents>False</x:ProtectContents><x:ProtectObjects>False</x:ProtectObjects><x:ProtectScenarios>False</x:ProtectScenarios>';
	template += '<x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head>';
	template += '<body>{table}</body></html>';
	var base64 = function(s) { return window.btoa(unescape(encodeURIComponent(s))) };
	var format = function(s, c) { return s.replace(/{(\w+)}/g, function(m, p) { return c[p]; }) };
	var ctx = {worksheet: name || 'Worksheet', table: table};
	var b = base64(format(template,ctx));

	var blob = b64toBlob(b,'application/vnd.ms-excel');
	var blobURL = URL.createObjectURL(blob);
	window.location.href = blobURL;


}

person Michael Tallino    schedule 12.06.2015