PHP-версия таблиц JavaScript, чтобы преуспеть

Я был обязан сделать скрипт для Google Analytics. Сценарий работает совершенно нормально, но у меня возникают проблемы с переносом его в документ Excel с различными таблицами.

Я наткнулся на этот обходной путь, чтобы эффективно добавить в таблицы (я вывожу серию таблиц, и каждая таблица должна быть отдельной электронной таблицей).

var tablesToExcel = (function() {
var uri = 'data:application/vnd.ms-excel;base64,'
, tmplWorkbookXML = '<?xml version="1.0"?><?mso-application progid="Excel.Sheet"?><Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">'
+ '<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"><Author>Tony Lopez</Author><Created>{created}</Created></DocumentProperties>'
+ '<Styles>'
+ '<Style ss:ID="Currency"><NumberFormat ss:Format="Currency"></NumberFormat></Style>'
+ '<Style ss:ID="Date"><NumberFormat ss:Format="Medium Date"></NumberFormat></Style>'
+ '</Styles>'
+ '{worksheets}</Workbook>'
, tmplWorksheetXML = '<Worksheet ss:Name="{nameWS}"><Table>{rows}</Table></Worksheet>'
, tmplCellXML = '<Cell{attributeStyleID}{attributeFormula}><Data ss:Type="{nameType}">{data}</Data></Cell>'
, base64 = function(s) { return window.btoa(unescape(encodeURIComponent(s))) }
, format = function(s, c) { return s.replace(/{(\w+)}/g, function(m, p) { return c[p]; }) }
return function(tables, wsnames, wbname, appname) {
var ctx = "";
var workbookXML = "";
var worksheetsXML = "";
var rowsXML = "";

for (var i = 0; i < tables.length; i++) {
if (!tables[i].nodeType) tables[i] = document.getElementById(tables[i]);
for (var j = 0; j < tables[i].rows.length; j++) {
rowsXML += '<Row>'
for (var k = 0; k < tables[i].rows[j].cells.length; k++) {
var dataType = tables[i].rows[j].cells[k].getAttribute("data-type");
var dataStyle = tables[i].rows[j].cells[k].getAttribute("data-style");
var dataValue = tables[i].rows[j].cells[k].getAttribute("data-value");
dataValue = (dataValue)?dataValue:tables[i].rows[j].cells[k].innerHTML;
var dataFormula = tables[i].rows[j].cells[k].getAttribute("data-formula");
dataFormula = (dataFormula)?dataFormula:(appname=='Calc' && dataType=='DateTime')?dataValue:null;
ctx = {  attributeStyleID: (dataStyle=='Currency' || dataStyle=='Date')?' ss:StyleID="'+dataStyle+'"':''
, nameType: (dataType=='Number' || dataType=='DateTime' || dataType=='Boolean' || dataType=='Error')?dataType:'String'
, data: (dataFormula)?'':dataValue
, attributeFormula: (dataFormula)?' ss:Formula="'+dataFormula+'"':''
};
rowsXML += format(tmplCellXML, ctx);
}
rowsXML += '</Row>'
}
ctx = {rows: rowsXML, nameWS: wsnames[i] || 'Sheet' + i};
worksheetsXML += format(tmplWorksheetXML, ctx);
rowsXML = "";
}

ctx = {created: (new Date()).getTime(), worksheets: worksheetsXML};
workbookXML = format(tmplWorkbookXML, ctx);

var link = document.createElement("A");
link.href = uri + base64(workbookXML);
link.download = wbname || 'Workbook.xls';
link.target = '_blank';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
})();

И мой экспорт выглядит следующим образом (будет немного изменять функцию, но нужно только работать на Chrome)

  $('.export').on('click',function(){
$('table').each(function(){
var table = $(this);
tables.push(table[0]);
labels.push(table.find('thead th').text());
});
tablesToExcel(tables,labels,'TheDanApp.xls','Excel');
});

Теперь, что касается раздражающего бита, это работает идеально, как хотелось бы для данных, которые у меня есть, за исключением запросов, которые генерируют большие объемы данных (до 10 тыс. Строк на электронную таблицу), которые затем вылетают и отображают страницу привязки aw в Chrome.

Я также некоторое время изучал PHPExcel, но не могу понять, как сделать так, чтобы документ Excel отображался только при нажатии кнопки экспорта (я хочу, чтобы он выполнял запрос только при нажатии).

Вот php у меня пока

$objPHPExcel = new PHPExcel();
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);

$date = date('M Y',strtotime(startmonths($month,$numyears - ceil($i/12))));
$myWorkSheet = new PHPExcel_Worksheet($objPHPExcel, strval($date));
$objPHPExcel->addSheet($myWorkSheet);
$arrayData = array($rowlabels,$renamed);
$objPHPExcel->getActiveSheet()->fromArray($arrayData,NULL,'A1');

header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="danapp.xls"');
header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');

Где $ renamed — это массив данных, которые я передаю (возможно, мог бы переименовать его, но просто хотел бы этот функционал). А раздел с листами находится внутри большого цикла for для запросов.

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

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

В заключение я задам вопрос: есть ли способ преобразовать эту функцию javascript, которая у меня есть, в функцию php, поскольку она просто записывает в строку (хотя и строго отформатированную), поэтому я могу вывести эту строку в ссылка (или, возможно, в этом проблема, поскольку ссылка слишком длинная? Возможно, лучшим способом было бы открыть новое окно только для этого документа, я не уверен, и у меня не так много времени это так, как я заканчиваю некоторые другие работы в то же время).

Только что была распечатка URL для одного из результатов, который сломался … Я думаю, что URL-адрес немного длинный для этого метода (13,5 миллионов символов … все они необходимы)

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector