2011-04-22 109 views
3

我正在嘗試使用PHPExcel從excelsheet中讀取數字。從ExcelExcel中讀取數字時出現問題PHPExcel

的代碼我有讀取數據:

$objReader = PHPExcel_IOFactory::createReaderForFile($upload_file); 
$objReader = PHPExcel_IOFactory::createReader('Excel2007'); 
$objReader->setReadDataOnly(true); 
$objPHPExcel = $objReader->load($upload_file); 
$objWorksheet = $objPHPExcel->getActiveSheet(); 
$data = array(); 

$i = 0; 

foreach ($objWorksheet->getRowIterator() as $row) { 
    if ($i < 1) { 
    $i++; 
    continue; //Skip heading titles 
} 
$cellIterator = $row->getCellIterator();   
$cellIterator->setIterateOnlyExistingCells(false);  
foreach ($cellIterator as $cell) {   
    $data [$i] [] = $cell->getValue();   
}  
$i ++; 

代碼工作。我讀了Excel,所有的數據都很好地保存在$ data數組中。 問題出在A列我收到了一個數字(4078500264822)。它返回爲「4078500264820」(見最後0)。不管我怎麼讀它。如果我打印整個行,我看到的值是錯誤的。當我使用諸如「getCalculatedValue」之類的函數時,結果是相同的。

我認爲這與該領域如何在Excel中保存有關。我把它保存爲類型「數字」。 哪裏在另一排。我保存了相同的號碼。這次作爲「文本」(excel拋出一個關於此的通知)。 PHPExcel可以讀取該數字。我有一張40張唱片。其中26個單元格將其最後一個數字替換爲0.您可以在此處找到截斷文件(僅有2行) - >http://dl.dropbox.com/u/1458083/excel.xlsx

回答

-3

謝謝mark和crishoj的支持。不幸的是,它沒有解決問題;( 我不能給任何人在這裏正確的解決方案,因爲我的數據顯然已經損壞,甚至在Excel加載函數被調用之前,

我解決了問題,迫使我的客戶使用CSV (代碼爲1,PHPExcel == awesome!),現在我將所有內容作爲字符串接收(因此,它可以工作!)

再次感謝您的所有幫助

+0

在這裏,我們解決方案,以幫助他人,因爲圖書館不屬於任何一個,事實上,圖書館成爲開放源碼是救世主 – Michael 2017-03-19 12:50:36

2

您在哪個平臺上?

我的Mac上使用從PHPExcel 1.7.6的MacPorts的(64位)PHP解釋器,我似乎得到正確的值:

array (
    1 => 
    array (
    0 => 4078500264822, 
    1 => '02648-32.000.00', 
    2 => 'Wand-slangenbox automatic', 
    3 => '20m slang, rolt zichzelf gelijkmatig op na gebruik. Geïntegreerde draaggreep voor 
comfortabel transport, inclusief montagemateriaal en wand-/vloerhouder.', 
    4 => 17400, 
    5 => 119.95, 
    6 => '', 
    7 => 12, 
), 
    2 => 
    array (
    0 => '4078500888707', 
    1 => '08887-20.000.00', 
    2 => 'Accu gras-buxusschaar set', 
    3 => 'Eenvoudig gras en buxus in vorm knippen zonder storende kabels. De messen kunnen worden verwisseld zonder gereedschap, het is bijzonder gemakkelijk, snel en veilig. Laat tevens op tijd zien wanneer de accu weer moet worden opgeladen. ', 
    4 => 16340, 
    5 => 69.95, 
    6 => 79.95, 
    7 => 12, 
), 
) 

的輸出是什麼,當你運行:

$ php -r 'echo PHP_INT_MAX;' 

如果是2147483647,則嘗試64位解釋器。或者使用PHPExcel提交請求以修復投射。

+1

那就是我們最重要的事情。 PHP_INT_MAX返回2147483647沒有我的live(linux)和測試環境(測試localhost,windows)。嘗試完全相同的導入不會影響localhost tho。將該號碼保存爲「文本」並不能解決問題。不幸的是,只是改變到64位環境不可能生活:( – Tjirp 2011-04-22 08:55:58

2

如果該值在Excel中以字符串形式存儲,則在將其加載到PHPExcel中時將以字符串形式存儲該值(假設您使用的是默認值活頁夾...高級值活頁夾肯定會導致因爲它的目的是處理轉換爲更合適的數據類型)。如果它在Excel中存儲爲數字,那麼即使在加載到PHPExcel之前,精度也會丟失。

儘管你可以做的是使用bindValue()方法設置你自己的Value Binder(擴展了默認值綁定器),該方法測試正在讀取的單元格的列引用(以查看它是否爲列A),以及強制PHPExcel將該值存儲爲字符串(即使已從Excel文件中讀取數字)。

編輯

該粘合劑應該做的,我建議什麼,迫使PHPExcel加載在A列的所有值作爲字符串。

class SpecialValueBinder extends PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder 
{ 
    public function bindValue(PHPExcel_Cell $cell, $value = null) 
    { 
     if ($cell->getColumn() == 'A') { 
      $value = PHPExcel_Shared_String::SanitizeUTF8($value); 
      $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING); 
      return true; 
     } 

     // Not bound yet? Use parent... 
     return parent::bindValue($cell, $value); 
    } 
} 


/** Tell PHPExcel that we want to use our Special Value Binder **/ 
PHPExcel_Cell::setValueBinder(new SpecialValueBinder()); 

確保您定義的粘合劑,並告訴PHPExcel使用它之前執行的load()

EDIT 2

由於crishoj所做的一切,我已經運行代碼(在Windows上使用32位PHP)。一個var_dump()返回值爲4078500264822作爲一個浮點數,這是我所期望的(該值太大而無法存儲爲32位整數),並且回顯它會顯示相同的正確值,而不會損失精度。

+0

你說「精度在它加載到PHPExcel之前就已經丟失了」。這是否意味着我只需要強制A列爲文本類型?我現在已經測試了一些看起來的確如此,當我上傳的時候,我得到了一個float:float(4078500264820)。如果我強制這個列是文本,它就會工作(也就是你的代碼將它轉換爲一個字符串,但正如你所說的,precision已經丟失了)。 – Tjirp 2011-04-22 12:11:15

+0

我的不好之處我一直在檢查excel.xlsx文件的源代碼,Excel存儲了完整的值,因爲它實際上是作爲純文本值存儲在工作表XML文件中的,如果你使用的是xls文件,那麼它將被存儲爲一個64位的浮點數,這將導致Excel本身不精確。因爲單元格類型是一個數字,PHPExcel的默認行爲是在它加載文件時將其轉換爲浮點數(因爲一個32位整數不能保持這個大小的值),一個d這種鑄造可能會導致精度損失。 – 2011-04-22 12:23:59

+0

特殊活頁夾強制將該值視爲文本(與從xlsx文件中讀取完全相同),而不是將其強制轉換爲浮動形式,因爲類型表示它應該是。因爲這裏沒有強制轉換,因此保留在xlsx文件的xml中的字符串值「按原樣」保持不變,因此不會丟失精度。 – 2011-04-22 12:26:07

9

或者只是嘗試ini_set(「precision」,「15」);默認值是12.爲我工作

+0

謝謝真的有用 – 2014-05-13 09:41:21

相關問題