2014-10-08 3 views
0

몇 가지 질문을했을 수도 있지만이 문제에 대한 정확한 답변을 찾을 수 없었습니다. ExcelExcel (명백하게)을 생성하기 위해 PHPExcel을 사용하고 있으며 코드가 파일을 생성하기 위해 작동하지만 강제 다운로드 코드를 포함 할 때 파일을 손상시킵니다. 스크립트 내 최신 버전은 다음과 같습니다PHPExcel 강제 다운로드 문제

function make_xls_spreadsheet(){ 

/** Error reporting */ 
error_reporting(E_ALL); 

/* Set the save path */ 
define('XLSX_SAVE_PATH', 'tmp/'); 

/** Include path **/ 
set_include_path(get_include_path() . PATH_SEPARATOR . 'Classes/'); 

/** PHPExcel */ 
include 'PHPExcel.php'; 

/** PHPExcel_Writer_Excel2007 */ 
include 'PHPExcel/Writer/Excel2007.php'; 


/* Create a new PHPExcel Object */ 
$objPHPExcel = new PHPExcel(); 


/* Add some metadata to the file */ 
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw"); 
$objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw"); 
$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document"); 
$objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document"); 
$objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes."); 

/* Set active worksheet to first */ 
$objPHPExcel->setActiveSheetIndex(0); 
$objPHPExcel->getActiveSheet()->setTitle('Segments'); 

/* Add some data to the worksheet */ 
$objPHPExcel->setActiveSheetIndex(0); 
$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Hello'); 
$objPHPExcel->getActiveSheet()->SetCellValue('B2', 'world!'); 
$objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Hello'); 
$objPHPExcel->getActiveSheet()->SetCellValue('D2', 'world!'); 


/* Write to server */ 
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); 

$filename = "tony1.xlsx"; 

// Works fine up to here 

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
header('Content-Disposition: attachment;filename="'.$filename.'"'); 
header('Cache-Control: max-age=0'); 

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 
//$objWriter->save('php://output'); 
$objWriter->save(XLSX_SAVE_PATH . $filename); 
readfile(XLSX_SAVE_PATH . $filename); 


echo "DONE!"; 

$objPHPExcel->disconnectWorksheets(); 
unset($objPHPExcel); 



} 

내가 힘 코드 섹션을 제거 할 때, 파일을 생성하고 난 괜찮아 내려 FTP 수 있습니다 기억하십시오. 그러나 파일을 생성하고 강제 실행하면 파일이 손상됩니다. 일반적으로 "Open & 복구"(Office2011 MacOSX)를 클릭 할 수 있지만 분명히 바람직하지 않습니다.

사람은 나를 이해하는 데 도움이 시겠어요 :

  1. 은이 부패로 생성되는 이유는 무엇입니까? 그리고 강제로 다운로드하지 않을 때 제대로 작동하는 이유는 무엇입니까?
  2. 적절한 저장/강제 순서는 무엇입니까 (PHP의 header() 함수 사용)
  3. 더 좋은 방법이 있다면.

많은 감사를드립니다! 내가 클릭 "& 수리를 해결"할 때

**** 업데이트 **** 여기에 코드입니다 :

readfile(XLSX_SAVE_PATH . $filename); 

:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> 
    <logFileName>Repair Result to tony1 03178.xml</logFileName> 
    <summary>Errors were detected in file 'Macintosh HD:Users:tony.diloreto:Downloads:tony1.xlsx'</summary> 
    <additionalInfo><info>Excel completed file level validation and repair. Some parts of this workbook may have been repaired or discarded.</info></additionalInfo> 
</recoveryLog> 
+0

파일에 저장하는 대신 로컬 복사본이 없으면'php : // output'에 저장하고,'$ objWriter-> save ('php : // output');' –

+0

감사합니다 - do readfile() 줄이 필요합니까? 내가 그렇게하면 무엇이 들어갈 수 있을까요? –

+0

'$ objWriter ='다음의 모든 것을 바꿉니다. –

답변

0

이것은 엑셀 파일을 브라우저에 뱉어 브라우저에서 다운로드 할 때 excel 파일의 일부가되는이 내용을 밖으로 나눕니다.

echo "DONE!"; 

엑셀은

[excel data] 
+0

닫기지만 시가가 없습니다. 여전히 일부 콘텐츠는 "읽을 수 없음"이며 수정 및 복구해야한다고 말합니다. 다른 아이디어? –

2

// 실제로 답을 기대 할 때

[excel data]DONE! 

을 보내는 것은 대답은, 단지 간단한 exit(); 전화를 실제로 간단 필요로한다

을 @Dagon에 속한다.

최종 코드 블록이 같은 File.php을 수정하는

function make_xls_spreadsheet(){ 

/** Include path **/ 
set_include_path(get_include_path() . PATH_SEPARATOR . 'Classes/'); 

/** PHPExcel */ 
include 'PHPExcel.php'; 

/** PHPExcel_Writer_Excel2007 */ 
include 'PHPExcel/Writer/Excel2007.php'; 


/* Create a new PHPExcel Object */ 
$objPHPExcel = new PHPExcel(); 

/** Determine filename **/ 
$filename = "tony1.xlsx"; 

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


/* Add some metadata to the file */ 
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw"); 
$objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw"); 
$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document"); 
$objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document"); 
$objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes."); 

/* Set active worksheet to first */ 
$objPHPExcel->setActiveSheetIndex(0); 
$objPHPExcel->getActiveSheet()->setTitle('Segments'); 

/* Add some data to the worksheet */ 
$objPHPExcel->setActiveSheetIndex(0); 
$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Hello'); 
$objPHPExcel->getActiveSheet()->SetCellValue('B2', 'world!'); 
$objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Hello'); 
$objPHPExcel->getActiveSheet()->SetCellValue('D2', 'world!'); 


header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
header('Content-Disposition: attachment;filename="'.$filename.'"'); 
header('Cache-Control: max-age=0'); 

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

exit(); 

} 
+0

actully 두 번째 질문은 오늘 나는'exit(); '의 대답으로 답했다. http://stackoverflow.com/questions/26264997/passing-get-variables-using-header-in-php –

0

시도 :

보호 정적 $의 _useUploadTempDirectory = TRUE;

폴더 phpexcel/Classes/PHPExcel/Shared (가장 좋은 방법은 아니지만 저에게 효과적이었습니다).