2010-07-16 8 views
6

Tôi gặp phải sự cố lạ khi đặt định dạng ngày tùy chỉnh với PHPExcel: Tôi đang viết ngày định dạng sql cho ô và đặt định dạng của nó bằng setFormatCode thành 'd/m/y '. Khi tôi mở nó trong Excel 2007, nó cho thấy định dạng ngày ban đầu cho đến khi tôi nhấp đúp vào ô và sau đó nó được cập nhật theo định dạng mong muốn của tôi. Có cách nào để tự làm mới mà không cần tôi giúp đỡ không?Tùy chỉnh định dạng ô PHPExcel chỉ hiển thị sau khi nhấp đúp vào

$sheet->setCellValueByColumnAndRow($column, $row, '2010-07-16'); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

Trả lời

13

Trừ khi bạn đang sử dụng "Nâng cao giá trị gia tăng Binder" PHPExcel, sau đó $ sheet-> setCellValueByColumnAndRow ($ cột, $ row, '2010-07-16'); sẽ lưu trữ giá trị dưới dạng chuỗi, không phải là ngày, do đó định dạng ngày bạn đang đặt trong dòng tiếp theo là vô nghĩa khi được áp dụng cho chuỗi cho đến khi bạn đọc tệp kết quả trong Excel và bắt buộc làm mới ... Excel sau đó sửa lỗi của bạn.

Để đảm bảo giá trị được lưu trữ chính xác ở vị trí đầu tiên, bạn cần lưu trữ giá trị ngày/dấu thời gian/số thay vì chuỗi, sau đó đặt mặt nạ định dạng để đảm bảo rằng nó được coi là ngày/dấu thời gian thay vì giá trị số.

Hoặc chuyển đổi chuỗi của bạn vào một ngày PHP sử dụng strtotime(), sau đó sử dụng PHPExcel được xây dựng trong phương pháp chuyển đổi date:

$PHPDateValue = strtotime('2010-07-16'); 
$ExcelDateValue = PHPExcel_Shared_Date::PHPToExcel($PHPDateValue); 
$sheet->setCellValueByColumnAndRow($column, $row, $ExcelDateValue); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

hoặc sử dụng được xây dựng trong phương pháp để chuyển đổi một chuỗi ngày định dạng để Excel giá trị datetime trực tiếp

$dateString = '2010-07-16'; 
$ExcelDateValue = PHPExcel_Shared_Date::stringToExcel($dateString); 
$sheet->setCellValueByColumnAndRow($column, $row, $ExcelDateValue); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

hoặc sử dụng DATEVALUE() chức năng Công cụ tính chức năng của thư viện:

$dateString = '2010-07-16'; 
$ExcelDateValue = PHPExcel_Calculation_Functions::DATEVALUE($dateString); 
$sheet->setCellValueByColumnAndRow($column, $row, $ExcelDateValue); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

hoặc, tùy chọn 4, là sử dụng "Nâng cao giá trị gia tăng Binder" PHPExcel của

Để bật tính năng này, hãy thực hiện các cuộc gọi tĩnh sau

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_AdvancedValueBinder()); 

trước khi bạn khởi tạo đối tượng bảng tính của bạn, hoặc tải nó từ tập tin

Sau đó PHPExcel sẽ xác định giá trị của bạn là một ngày, và xử lý việc chuyển đổi sang một ngày Excel/timestamp và định dạng nó tự động

$dateString = '2010-07-16'; 
$sheet->setCellValueByColumnAndRow($column, $row, $dateString); 
+0

Đó là câu trả lời hay. Cảm ơn bạn! – ISBL

+0

Nó không thể sai nếu nó được trả lời bởi một trong những PHPExcel tạo ra anh ta tự –

1

Tôi muốn thêm một tùy chọn 5 ...

Nếu bạn muốn sử dụng điều này với SetValueExplicit bạn sẽ làm điều đó theo cách này:

\\convert bDate to dDate 
$dDate = PHPExcel_Shared_Date::PHPToExcel(strtotime($bDate)); 

\\must use type numeric 
$worksheet->getCell($col_row)->setValueExplicit($dDate,PHPExcel_Cell_DataType::TYPE_NUMERIC); 
\\use FORMAT_DATE of your choice i am using "YYYY-MM-DD" 
$worksheet->getStyle($col_row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2); 

Xin lưu ý rằng các định dạng ngày trong tài liệu và trực tuyến dường như đã lỗi thời. Để có danh sách đầy đủ tất cả các loại FORMAT_DATE_XYZ khác nhau, hãy tìm trong tệp PHPExcel \ Style \ Number_Format.php trong bản sao thư viện của bạn.

Có lẽ dễ nhất là chỉ sử dụng Giá trị nâng cao Binder nhưng nếu bạn không thể hoặc không muốn hy vọng thông tin này hữu ích cho bạn.