2016-07-07 5 views
1

Я пытаюсь экспортировать в файл xlsx из запроса MSSQL в PHP. У меня нет доступа к серверам, на которых размещен мой веб-сайт, поэтому я не могу использовать ничего, что еще не встроено в PHP. Я использую PHP 5.4. До сих пор я создал <a></a>, который ссылается на страницу php, которая должна извлекать данные из моей базы данных MSSQL. Вместо этого он дает мне пустой файл в формате xls. Когда я его открываю, он выдает ошибку об отсутствии файла stylesheet.css в папке загрузки, а затем открывает пустую книгу xls. Вот мой ExportToExcel.php файл:Как экспортировать из PHP в Excel (xlsx)

$tsql = "select ID, TableName, UpdateDate from pmdb.TableUpdates order by UpdateDate"; 
//echo $tsql . "<br>"; 
$getqueries = $conn->query($tsql); 
//echo "<BR>"; 
//var_dump($getqueries); 
$result = $getqueries->fetchALL(PDO::FETCH_ASSOC); 
$filename = "TableUpdates"; 
//var_dump($tsql); 

header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
header("Content-Disposition: attachment; filename=$filename.xls"); 

/*******Start of Formatting for Excel*******/ 

//define separators (defines columns in excel & tabs in word) 
$sep = "\t"; //tabbed character 
$br = "\r\n"; //line break 

//start of printing column names as names of SQL fields 
//$max = sqlsrv_num_fields($result); 
/* for ($i = 0; $i < $max; $i++) { 
echo sqlsrv_field_metadata($result,$i) . "\t"; 
} 
print("\n"); */ 

foreach(sqlsrv_field_metadata($result) as $fieldMetadata) { 
foreach($fieldMetadata as $name => $value) { 
    echo "$value" . $sep; 
} 
} 
echo $br; 

//end of printing column names 

//start while loop to get data 
while($row = sqlsrv_fetch($result)) 
{ 
    $schema_insert = ""; 
    for($j=0; $j<sqlsrv_num_fields($result);$j++) 
    { 
     if(!isset($row[$j])) 
      $schema_insert .= "NULL".$sep; 
     elseif ($row[$j] != "") 
      $schema_insert .= "$row[$j]".$sep; 
     else 
      $schema_insert .= "".$sep; 
    } 
    $schema_insert = str_replace($sep."$", "", $schema_insert); 
    $schema_insert = preg_replace("/\r\n|\n\r|\n|\r/", " ", $schema_insert); 
    $schema_insert .= "\t"; 
    print(trim($schema_insert)); 
    print "\n"; 
} 

Я получил большую часть этого от других вопросов, но ни один из них не был ответ либо.

EDIT

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

Формат файла и расширение. , , не совпадают. , ,

и

Проблемы во время загрузки: Отсутствует файл: C: \ Users \ имя пользователя \ Downloads \ stylesheet.css

, но все, печатает в одном столбце. Он разделяется запятой, но все значения находятся в одном столбце. Вот новая часть кода:

//define separators (defines columns in excel & tabs in word) 
$sep = ","; //tabbed character 
$br = "<br>"; //line break 

$hsql = "select Headings from TableHeadings where TableName = 'TableUpdates' order by ID"; 
$getHeadings = $conn->query($hsql); 
$rHeadings = $getHeadings->fetchALL(PDO::FETCH_ASSOC); 

$headings = array($rHeadings[0]["Headings"],$rHeadings[1]["Headings"],$rHeadings[2]["Headings"]); 

//start of printing column names as names of SQL fields 
foreach($headings as $Heading => $value) 
{ 
    echo "$value" . $sep; 
} 
echo $br; 
for ($i = 0;$i < 3;$i++) 
{ 
    for($l = 0;$l < 3;$l++) 
    { 
     if ($l == 0) 
     { 
      echo $result[$i]["ID"] . $sep; 
     } 
     elseif ($l == 1) 
     { 
      echo $result[$i]["TableName"] . $sep; 
     } 
     else 
     { 
      echo $result[$i]["UpdateDate"]; 
     } 
    } 
    echo $br; 
} 

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

ID,TableName,UpdateDate, 
1,pmdb.MaterialTracking,2016-07-08 13:45:05.963 
2,pmdb.OSP_OPR_Report,2016-07-08 13:45:45.883 
3,pmdb.COEI_OPR_Report,2016-07-08 13:45:47.920 
+0

Вы не создаете файл xls. '.xls' является составным оле. Вы генерируете CSV-файл и LYING, чтобы отличить его тип. Вот почему Excel говорит, что формат не соответствует. НИЧЕГО нет, вы можете обойти это, потому что Excel знает, что вы лжете ему. Либо используйте надлежащую библиотеку excel, либо скажите Excel, что это файл csv, правильный путь. –

+0

@MarcB Я думал, что это правильный заголовок библиотеки («Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet») '. Если нет, то что есть и как я могу изменить его на csv? Если бы я новичок, я бы уже это сделал. – Mike

+0

Это не библиотека. это просто говорит клиенту: «Я отправляю вам файл такого типа». а затем вы отправляете данные совершенно другого типа. –

ответ

0

Я констатировала header так, что Excel знает, что это CSV-файл, это открытие. Я больше не получаю ошибок.

header("Content-Type: application/x-csv"); 
header("Content-Disposition: attachment; filename=$filename.csv"); 

Я до сих пор не имеют каких-либо других библиотек, так что не будет никакого форматирования, просто файл CSV.

Смежные вопросы