2013-07-11 48 views
5

Hiện tại, tôi đang tạo một chương trình cho công việc của mình sử dụng PHPexcel để lấy tất cả dữ liệu từ một bảng excel, tạo một bảng tính mới và định dạng nó thành văn bản và chuyển tất cả dữ liệu từ bảng excel cũ.PHPExcel, Ngày được phân tích cú pháp không chính xác

php của tôi phải có khả năng nhận các giá trị từ bảng excel cũ và phân tích cú pháp chính xác, đặc biệt là ngày/số/v.v.

Mọi thứ đều hoạt động tốt trừ ngày. Đối với một số lý do khi tôi nhận được giá trị được định dạng của ô; nó không khớp với định dạng ngày trong trang tính đầu tiên. Cụ thể là một giá trị như thế này: 12/31/2099. Đối với một số lý do, nó đọc định dạng không chính xác như mm-dd-yy và đầu ra 12-31-99. Điều này là cực kỳ bực bội và tôi đã cọ rửa một nửa của internet cho một câu trả lời. Xin vui lòng giúp đỡ; Tôi không chắc vấn đề là gì! Mã số:

<?php 
$spreadSheet=$_FILES["filebrowser"]["tmp_name"]; 
/** PHPExcel_IOFactory */ 
require_once 'Classes/PHPExcel/IOFactory.php'; 
require_once 'Classes/PHPExcel/Shared/Date.php'; 
$objReader = PHPExcel_IOFactory::createReader('Excel2007'); 
//Create temporary sheet from uploaded file data 
$objPHPExcel = $objReader->load($spreadSheet); 
$sheet = $objPHPExcel->getActiveSheet(); 
$sheet->setTitle("Original Data"); 
$data=$sheet->getCell("D9")->getFormattedValue(); 

var_dump($data); 
exit;?> 

D9 là ô có định dạng DATE và giá trị là 12/31/2099. Mã này in 12-31-99 ...

+0

Hãy thử getValue() thay vì getFormattedValue() – aynber

+0

getValue() lấy giá trị dữ liệu thô của ô và trả về một phao. –

+0

Từ những gì tôi có thể nói ở đây (http://phpexcel.codeplex.com/discussions/371418) bạn sẽ có thể sử dụng Date :: Time để chuyển đổi nó sang định dạng ngày bạn muốn. – aynber

Trả lời

6

Sử dụng PHPExcel v1.7.9

mở tập tin "PHPExcel \ Phong cách \ NumberFormat.php"

Đến Đường dây 278:

self::$_builtInFormats[22] = 'm/d/yy h:mm'; 

thay thế với

self::$_builtInFormats[22] = 'dd-mm-yyyy hh:mm'; 

hoặc bất kỳ định dạng nào bạn muốn.

Tôi không thể tìm thấy một cách hiệu quả để thay đổi nó một cách hiệu quả và tôi không có lý do gì để định dạng ngày theo bất kỳ cách nào khác ngoài giải pháp này để giải pháp này hoạt động cho tôi.

+0

Tôi gặp vấn đề chính xác, câu trả lời này là gần nhất/dễ nhất Một số dòng cần được thay đổi là tự :: $ _ builtInFormats [14] = 'mm-dd-yy'; thành: self :: $ _ builtInFormats [14] = 'mm/dd/yyyy'; – Bryant

+0

Cảm ơn câu trả lời tốt đẹp như vậy @steve nhưng đối với tôi hoạt động dòng không có 270 tự :: $ _ builtInFormats [14] = 'mm-dd-yy'; thành: self :: $ _ builtInFormats [14] = 'yyyy-mm-dd' –

2

Sử dụng v1.7.8 và giả định Excel2007 aka .xlsx tập tin

$a1Cell = $sheet->getCell('A1'); 
$a1CellFormattedValue = trim($a1Cell->getFormattedValue()); 
if (!empty($a1CellFormattedValue)) { 
    $dateInTimestampValue = PHPExcel_Shared_Date::ExcelToPHP($a1Cell->getValue()); 
} 

Hãy để tôi giải thích mỗi dòng.

  • dòng 1 là để có được các đối tượng di động
  • dòng 2 và nếu khối là để chúng tôi chỉ thực hiện đối với các tế bào không có sản phẩm nào
  • dòng 4 là làm thế nào chúng ta thay đổi giá trị bên trong tế bào vào unix dấu thời gian.

Bạn còn lại với quyết định định dạng ngày nào để ghi giá trị vào tệp excel đích. Đề xuất của tôi là bạn quyết định với các bên liên quan rằng TẤT CẢ các ngày trong tệp excel đích sẽ theo một định dạng cụ thể.

Đây là cách sạch nhất mà tôi có thể nghĩ đến.

P.S. Nếu bạn có ô trống và bạn cố gắng thực hiện PHPExcel_Shared_Date::ExcelToPHP trên giá trị ô, bạn sẽ nhận được ngày hiện tại.

CẬP NHẬT

Chỉ cần nhận ra rằng bình luận của bạn đề cập đến bạn có thể không được tự ý quyết định định dạng. Xin lỗi vì điều đó. Nếu tôi gặp điều gì đó hữu ích, tôi sẽ cập nhật câu trả lời này.

0

Tôi vừa xem qua câu hỏi của bạn. nếu bạn biết định dạng, trong đó nổi trội là ngày tiết kiệm, sau đó bạn có thể sử dụng lớp PHP DateTime như một đại diện ngày trung

$data=$sheet->getCell("D9")->getFormattedValue(); 
$date = DateTime::createFromFormat ("m-d-y" , $data); 
$string_date = $date->format($format); 

nơi $format được định dạng bất kỳ mà bạn muốn

Các vấn đề liên quan