web-dev-qa-db-ja.com

PHPExcel:クライアント側でExcelファイルをダウンロードします

問題は解決しました:この問題が発生する可能性のある他のユーザー-PHPファイルのエンコードに注意してください。PHPExcelを使用する場合、UTF8ではなくANSIIエンコードである必要があります。それ以外の場合、Excelがダウンロードされます。追加されたヘッダー(回答1)は、ファイル自体のエンコードを変更した後に問題を解決しました。

MYSQL DBのテーブルからExcelを作成するためにPHPExcelを使用しているため、ユーザーは自分のコンピューターにダウンロードできます。

次のコードは正しいExcelファイルを作成しますが、問題はサーバーにダウンロードされることです。私はヘッダーを追加する必要があることをPHPExcelのマニュアルで読みました:

header('Content-Type: application/vnd.ms-Excel');
header('Content-Disposition: attachment;filename="'.$name.'.xls"');
header('Cache-Control: max-age=0');
header('Cache-Control: max-age=1');
header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header ('Pragma: public'); // HTTP/1.0

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

しかし、それを実行すると、ダウンロードされたファイルは次のようになります。1。内部に若干のジブリッシュがある。問題は、このファイルがUTF8として保存され、ANSIとしてエンコードした場合、正常に機能していることですが、もちろん手動による変更であり、ユーザーに到達するにはExcelが適切に機能している必要があります。

バグは何ですか?

動作する私のコード(ただし、ファイルをサーバーにダウンロードします):

<?php
include 'connection.php';
include 'checkUser.php';

//Getting all the needed information from the DB
$task_id=$_GET['id'];
$query2 = "SELECT * FROM projects WHERE ProjectID=$task_id";
$data2 = mysqli_query($con, $query2);
$row = mysqli_fetch_array($data2);
$project_type = $row['ProjectType'];
$project_name = $row['ProjectName'];

switch ($project_type){
                    case 2: $NumberOfRows=22;  $project = "slivedetails"; break;
                    case 3: $NumberOfRows=30;  $project = "plivedetails"; break;
                    default: $NumberOfRows=0; $project = "none";
                    }
//column names
if ($project="slivedetails"){
    $ColumnNames = mysqli_query($con,"SHOW COLUMNS FROM slivedetails") or die("mysql error"); 
    }
else if ($project="plivedetails"){
    $ColumnNames = mysqli_query($con, "SHOW COLUMNS FROM plivedetails") or die("mysql error"); 
    }

$query = "SELECT * FROM $project WHERE TaskID=$task_id";
$data = mysqli_query($con, $query);
$num_rows = mysqli_num_rows($data); 


/** Include PHPExcel */
require_once 'PHPExcel_1.7.9_doc/Classes/PHPExcel.php';
require_once 'PHPExcel_1.7.9_doc/Classes/PHPExcel/IOFactory.php';


// create new PHPExcel object
$objPHPExcel = new PHPExcel();
    $objPHPExcel = new PHPExcel();

// writer already created the first sheet for us, let's get it
$objSheet = $objPHPExcel->getActiveSheet();
// rename the sheet
$objSheet->setTitle('Task Results');

// let's bold and size the header font and write the header
// as you can see, we can specify a range of cells, like here: cells from A1 to A4
$objSheet->getStyle('A1:AD1')->getFont()->setBold(true)->setSize(12);

$char = 65;
// write header]
for ($i=1;$i<=$NumberOfRows;$i++){
    $col_name = mysqli_fetch_array($ColumnNames);
    $objSheet->getCell(chr($char).'1')->setValue($col_name['Field']);
    $char++;
}

// Now we need to get the data from the DB. While we have a row in the result:
$rowIterator=2; //our row number. We begin from 2 because the first one is the title.

while ($RowInfo = mysqli_fetch_array($data)){
//We will fill the information based on the amount of columns:
$char = 65; //we set the first char as column A
for ($i=0;$i<$NumberOfRows;$i++){
    $objSheet->getCell(chr($char).$rowIterator)->setValue($RowInfo[$i]);
    $char++;
}
$rowIterator++;
}

// autosize the columns
$char = 65;
for ($i=1;$i<=$NumberOfRows;$i++){
    $objSheet->getColumnDimension(chr($char))->setAutoSize(true);
    $char++;
}

// create the writer
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007");
$objWriter->save('results.xlsx');


?>
11
Alex

次の包含を削除します。

_require_once 'PHPExcel_1.7.9_doc/Classes/PHPExcel/IOFactory.php';
_

オブジェクトを2回宣言しました。それらの1つを削除します。

_// create new PHPExcel object
$objPHPExcel = new PHPExcel();
_

ライターを作成する直前に次のヘッダーを挿入します。

_header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header("Content-Disposition: attachment; filename=\"results.xlsx\"");
header("Cache-Control: max-age=0");
_

次の代わりに(実際にサーバーにファイルを保存します):

_$objWriter->save('results.xlsx');
_

以下を挿入します(これにより、ダウンロード可能なファイルが作成されます)。

_$objWriter->save("php://output");
_

これは意味不明なテキストを解決するはずです。それでもこのようなテキストが表示される場合は、最後の行($objWriter->save("php://output");)の前に次のコードを挿入してください。

_ob_clean();
_

これでうまくいきました。それが役に立てば幸い。

8
Placid

これは機能するはずです。次のようにコードを変更してみてください。

header("Content-Type: application/vnd.ms-Excel");
header("Content-Disposition: attachment; filename=my_Excel_filename.xls");
header("Pragma: no-cache");
header("Expires: 0");

flush();

require_once 'PHPExcel.php';

$objPHPExcel = new PHPExcel();

// here fill data to your Excel sheet

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

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

アレックス、同じ問題がありました。私はそれらすべてを行いましたが、再び結果は同じでした。 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');を変更しました

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

すべての.xlsx.xlsに変更しました。

それが役立つことを願っています。

0