PHP экспорт в Excel приводит к неверному формату и нежелательным признакам - PullRequest
0 голосов
/ 23 июня 2011

Я пытаюсь экспортировать данные из моей базы данных Microsoft SQL Server 2008 в электронную таблицу Excel.

Я использую это руководство: http://www.appservnetwork.com/modules.php?name=News&file=article&sid=8

Мой заголовок выглядит так:

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");;
header("Content-Disposition: attachment;filename=$filename.xls ");
header("Content-Transfer-Encoding: binary ");

Ячейка данных XLS выглядит следующим образом:

xlsBOF();

xlsWriteString(0,0,"$lng_report_age_title");
xlsWriteString(0,4,"$lng_report_sex_title");
xlsWriteString(0,6,"$lng_report_referredfrom_title");
xlsWriteString(0,8,"$lng_report_selfreferred_title");

xlsWriteString(1,0,"$lng_report_age04");
xlsWriteString(1,1,"$lng_report_age514");
xlsWriteString(1,2,"$lng_report_age1549");
xlsWriteString(1,3,"$lng_report_age50");
xlsWriteString(1,4,"$lng_report_sexm");
xlsWriteString(1,5,"$lng_report_sexf");
xlsWriteString(1,6,"$lng_report_referredfrom_indistrict");
xlsWriteString(1,7,"$lng_report_referredfrom_outdistrict");
xlsWriteString(1,8,"$lng_report_selfreferred_indistrict");
xlsWriteString(1,10,"$lng_report_selfreferred_outdistrict");

xlsWriteString(2,6,"$lng_report_referredfrom_new");
xlsWriteString(2,7,"$lng_report_referredfrom_new");
xlsWriteString(2,8,"$lng_report_selfreferred_new");
xlsWriteString(2,9,"$lng_report_selfreferred_old");
xlsWriteString(2,10,"$lng_report_selfreferred_new");
xlsWriteString(2,11,"$lng_report_selfreferred_old");

xlsWriteNumber(3,0,"$searchresultsage04");
xlsWriteNumber(3,1,"$searchresultsage514");
xlsWriteNumber(3,2,"$searchresultsage1549");
xlsWriteNumber(3,3,"$searchresultsage50");
xlsWriteNumber(3,4,"$searchresultssexm");
xlsWriteNumber(3,5,"$searchresultssexf");
xlsWriteNumber(3,6,"$searchresultsreferredfrom01");
xlsWriteNumber(3,7,"$searchresultsreferredfrom02");
xlsWriteNumber(3,8,"$searchresultsselfreferred03");
xlsWriteNumber(3,9,"$searchresultsselfreferred04");
xlsWriteNumber(3,10,"$searchresultsselfreferred05");
xlsWriteNumber(3,11,"$searchresultsselfreferred06");

xlsEOF();

exit();

А функции создания XLS выглядят так:

function xlsBOF() {

    echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);  

    return;
}

function xlsEOF() {

    echo pack("ss", 0x0A, 0x00);

    return;
}

function xlsWriteNumber($Row, $Col, $Value) {

   echo pack("sssss", 0x203, 14, $Row, $Col, 0x0);
   echo pack("d", $Value);

   return;
}

function xlsWriteString( $Row , $Col , $Value ) {

   $L = strlen( $Value );
   echo pack( "sssss" , 0x204 , 8 + $L , $Row , $Col , 0x0 , $L );
   echo $Value;

   return;
}

№ задачи.1: в листе Excel будет несколько нежелательных специальных символов вокруг текста, который я хочу отобразить (может быть, потому что я использую UTF-8? (Сначала попытался расшифровать строку; не помог) Возможно, потому что яиспользуя Excel 2007?)

№ задачи.2: Значения не записываются в строку / столбец, в котором я хочу, чтобы они были.

Результат выглядит следующим образом (специальные символы автоматически удаляются редактором stackoverflow, поэтому я заменяю их X):

XXXXXXXAgeXXXXXSexXXXX
Ссылается изXXXX
Самостоятельно указаноXXX 0-4 годаXXX
5-14 летXXXX 15-49 летXXX X
= 50 летXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXDistrictXXX
Xout DistrictXXXXXXNewXXXXXXNewXXXXXXNewXXXXXOldXXXX
XNewXXXXXXOldXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXX

Все эти данные в колонке а и в строках 1-8.

1033 * еще один момент, который я хотел бычтобы знать, как только это работает, это: Как я могу отформатировать ячейки (границы, шрифты и т. д.)?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 23 июня 2011

В качестве косвенного решения вашего вопроса, я бы порекомендовал занятия в http://phpexcel.codeplex.com/.

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

0 голосов
/ 08 декабря 2015

У меня была такая же проблема.

ob_end_clean(); $objWriter->save('php://output');

Это удалит ненужные символы из Excel.

...