Hướng dẫn phpspreadsheet corrupt file - tập tin bị hỏng phpspreadsheet

Tôi có vấn đề khi cố gắng tải xuống tệp XLSX. Nó hoạt động tốt khi tôi kiểm tra nó cục bộ, nhưng khi tôi tải nó lên máy chủ sản xuất, tệp bị hỏng.

Đây là đầu ra tệp:

Hướng dẫn phpspreadsheet corrupt file - tập tin bị hỏng phpspreadsheet

Đây là mã IM đang sử dụng:

getActiveSheet();
    $sheet->setCellValue('A1', '#');
    $sheet->setCellValue('B1', 'First');
    $sheet->setCellValue('C1', 'Last');
    $sheet->setCellValue('D1', 'Handle');

    header('Content-Type: application/vnd.openxmlformats- 
    officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename="text.xlsx"');
    header('Cache-Control: max-age=0');
    $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
    $writer->save('php://output');
    die;

Tôi đã thử thay đổi tiêu đề, nó không giúp được gì:

tiêu đề ('loại nội dung: Ứng dụng/vnd.ms-excel');

Đây là:

  • một báo cáo lỗi
  • một yêu cầu tính năng
  • Không phải là một câu hỏi sử dụng (hỏi họ trên https://stackoverflow.com/questions/tagged/phpspreadsheet hoặc https://gitter.im/phpoffice/phpspreadsheet) a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)

Hành vi mong đợi là gì?

Phục vụ bảng tính trống cho trình duyệt

Hành vi hiện tại là gì?

Phục vụ một tập tin Excel bị hỏng. Thông báo lỗi Excel:

Chúng tôi đã tìm thấy một vấn đề với một số nội dung trong test.xlsx. Bạn có muốn chúng tôi cố gắng và phục hồi càng nhiều càng tốt không? Nếu bạn tin tưởng nguồn gốc của sổ làm việc này, nhấp vào Có.

Sau khi sửa chữa, tôi nhận được tin nhắn sau:

Excel đã hoàn thành xác thực và sửa chữa cấp độ tệp.Một số phần của sổ làm việc này có thể đã được sửa chữa hoặc loại bỏ.

Các bước để tái tạo là gì?

Chạy mã bên dưới



require __DIR__ . '/vendor/autoload.php';

// add code that show the issue here...
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();

// Redirect output to a client’s web browser (Xlsx)
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="test.xlsx"');
header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');

// If you're serving to IE over SSL, then the following may be needed
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

$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('php://output');

Phiên bản nào của phpspreadsheet và PHP bị ảnh hưởng?

PHP: V7.0.22 Excel: 2016 OS: Windows 10, 64bit Webserver: Apache HTTPD-2.4.27-win64-VC14 (thông qua Laragon v3.1.4)
Excel: 2016
OS: Windows 10, 64bit
Webserver: Apache httpd-2.4.27-win64-VC14 (via Laragon v3.1.4)

Ghi chú

Hành vi tương tự tồn tại nếu tôi tải tệp excel trống qua load ()

- [X] a bug report
- [ ] a feature request
- [ ] **not** a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)

Khi tạo một bảng tính với các siêu liên kết, các liên kết phải được chèn dưới dạng URL siêu văn bản và không nên tham nhũng tệp.

Với hơn 32766 hàng và 2 cột, tệp được tạo bị hỏng và tất cả các siêu liên kết sẽ bị xóa sau khi sửa chữa nó trong Excel.Đối với các thử nghiệm của tôi, giới hạn cho các hàng là 32767 khi xảy ra lỗi.
For my tests the limit for the rows was 32767 where the error occured.


use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Cell\DataType;

require __DIR__ . '/vendor/autoload.php';

// Create new Spreadsheet object
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

$columns = array (
				"A",
				"B"
);

//Limit where error occurs is 32767. No error for 32766
for( $i = 1; $i < 32767; $i ++ )
{
	foreach ( $columns as $column )
	{
		$currentCell = $sheet->getCell( $column . $i );
		$currentCell->setValueExplicit( "http://google.de", DataType::TYPE_STRING );
		$sheet->getCell( $column . $i )->getHyperlink()->setUrl( "http://google.de" );
	}
}

//Write to file
//Occures also for XLS Files
$writer = new Xlsx($spreadsheet);
$writer->save("test.xlsx");