2010-11-21 38 views
7

Tôi đang cố gắng đọc một số tệp excel với phpexcel, hoạt động tốt cho đến nay. phpexcel là một chút quá thông minh mặc dù, và loại bỏ số không đứng đầu từ các tế bào của tôi. tôi đoán tôi cần phải nói với nó để điều trị các tế bào như một chuỗi văn bản, không phải là chung hoặc số. nhưng tôi đã thất bại. tôi thậm chí còn tìm thấy các chủ đề trên stackoverflow về điều này, nhưng các giải pháp được đề xuất chỉ đơn giản là sẽ không hoạt động.định dạng ô trong phpexcel

bên dưới là một đoạn nội dung tôi đang làm việc.

foreach(@$objWorksheet->getRowIterator() as $row){ 
    $cellIterator = $row->getCellIterator(); 
    $cellIterator->setIterateOnlyExistingCells(false); 
    foreach($cellIterator as $cell){ 
     #$objWorksheet->getStyle($cell->getCoordinate())->getNumberFormat()->setFormatCode('@'); 
     $cells[] = $cell->getValue(); 
    } 
} 

bất kỳ ý tưởng nào? tôi không muốn giới hạn bản thân mình để chỉ đọc nội dung số, vì tôi không có quyền kiểm soát những gì người dùng sẽ tải lên. xử lý mọi thứ như dây sẽ là hoàn hảo.

/Peder

Trả lời

3

Phương pháp getValue() thực hiện chính xác những gì nó nên làm, mà không cố gắng để trở nên thông minh. Nó trả về giá trị thực được lưu trữ trong ô. Nếu ô đó chứa một số nguyên, nó trả về một số nguyên; nếu ô chứa float, nó sẽ trả về một phao; nếu nó chứa một chuỗi, nó trả về một chuỗi. Việc thông minh là trả về giá trị đó như một chuỗi được định dạng (với các số 0 hàng đầu nếu thích hợp), sau đó bạn cần sử dụng một phương pháp khá khác và áp dụng định dạng ô cho giá trị trả về.

foreach($cellIterator as $cell){ 
    $cells[] = PHPExcel_Style_NumberFormat::toFormattedString($cell->getValue(), 
       $objPHPExcel->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode() 
    ); 
} 

hoặc nếu ô có chứa một công thức:

foreach($cellIterator as $cell){ 
    $cells[] = PHPExcel_Style_NumberFormat::toFormattedString($cell->getCalculatedValue(), 
       $objPHPExcel->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode() 
    ); 
} 

Và xin đừng sử dụng @ để thử và ngăn chặn sai sót. PHPExcel ném ngoại lệ, và bạn thực sự cần phải bẫy chúng.

Tuy nhiên, đối với những gì bạn đang làm, bạn có thể xem xét phương thức toArray() của bảng tính, sẽ trả về một mảng của tất cả các giá trị ô trong trang tính.

+0

cảm ơn, tất cả những thứ tốt. nhưng - áp dụng điều này và cố gắng phân tích cú pháp tệp csv, nhưng dường như tất cả các ô của tôi được định dạng là "chung". tập tin trông như thế này: http://dl.dropbox.com/u/252696/csv.csv đây là một hạn chế của định dạng csv, và nếu vậy - sẽ không tốt hơn nếu phpexcel vừa trả lại nội dung của các ô ? – fjallstrom

+0

Nếu PHPExcel đơn giản trả lại "chuỗi", nó sẽ mất tất cả khả năng xử lý dữ liệu từ bảng tính Excel.Nếu bạn chỉ đang cố đọc một tệp CSV thành một mảng, tùy chọn tốt nhất của bạn là các hàm xử lý csv được tích hợp sẵn của PHP, như fgetcsv() –

+0

Nếu bạn muốn PHPExcel xử lý đầu vào từ tệp CSV dưới dạng chuỗi thay vì số, thì bạn có thể viết một "bộ lọc đọc" đơn giản để đảm bảo tất cả đầu vào từ tệp được coi là chuỗi. –

1

Có điều gì đó dễ dàng hơn các Iterator đó. Để làm foreach Bạn cũng có thể sử dụng phương pháp toArray, ví dụ:

$active_sheet = $objPHPExcel -> getActiveSheet(); 
foreach($active_sheet -> toArray() as $row_n => $row){ 
foreach($row as $cell_n => $cell){ 
    // operations here 
} 
} 

Làm việc tốt cho tôi và cũng có vẻ nhanh hơn sau đó Iterator, giống như Mark Baker buồn.

Trong xử lý CVS tôi thấy một vấn đề chính: người dùng phải xuất biểu mẫu dữ liệu Excel và quá trình này có thể gây nhầm lẫn cho hầu hết trong số họ. Đó là lý do tại sao tôi tìm kiếm giải pháp để nhập trực tiếp từ Excel.

Khi sử dụng các trình vòng lặp đó là điều gì đó kỳ lạ đối với tôi và tôi thực sự không hiểu nhiều về nó. Trong khi truy cập dữ liệu bằng cách sử dụng iterator nó trả về vài (dạng 2 đến 4 trong trường hợp của tôi) các đối tượng được tuần tự hóa và nhận dữ liệu trong số đó là cơn ác mộng.

1

không ai trong số các giải pháp được cung cấp làm việc cho tôi (nhập khẩu với PHPExcel v1.7.5 CSV) tôi giải quyết bằng cách thiết lập giá trị chất kết dính như thế này:

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_StringValueBinder()); 

trước PHPExcel_IOFactory::createReader('CSV')

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