php drupal 讀日期/百分數格式問題/excel_import解析

excel_import()解析php

前言:由於業務須要,我開始的需求是:既拿到正確的日期格式,讀取到的excel數據格式也跟以前相同,後期能儘可能減小代碼的修改。可是,我後期雖然拿到了相同的數據格式,最後由於執行速度不佳,被迫放棄,用了createdreader->getActiveSheet->toArray方法來達到目的。可是這是我第一次有修改/研究源碼的行爲,仍是值得mark一下的。數據庫

 

-----------------------------------------------------------------------------------------------post

如下是前期想法:性能

缺陷一:spa

drupal 利用 PHPExcel_IOFactory 對象封裝了一個excel_import的方法,可是這個方法有個比較神奇的屬性, setReadDataOnly。excel

看了看源碼,這個屬性大意是,setReadDataOnly爲true的時候就不會讀excel中每一個cell的style,例如border、color,從而增長了讀取速度。orm

開啓這個模式的優點:大概是性能比較好。具體運行速度我試了一下,1000行的excel讀取速度是7s,下面我將這個方法的setReadDataOnly設置爲false,1000行的excel讀取速度爲30秒,差異有點大哦。對象

setReadDataOnly的影響:get

(1):丟掉了excel中每一個cell單獨的formatCode,並統一將他們的formatCode設置爲general。源碼

(2):刪掉了無效的cell,即便cell有border這樣的干擾因素。

這樣作的結果是,某些特殊的格式在倒入數據庫中得不到正確的格式/值。例如2019-03-06,獲得的結果是43530

缺陷二:

沒有轉換格式的操做。

這是缺陷一帶來的必然結果,由於每一個cell的formatCode都是general了,還換啥格式?

解決方法(我修改了一下excel_import方法):

思路很簡單。

(1):拿掉setReadDataOnly模式。

(2):增長轉換格式操做。

function phpexcel_import_change_format($path, $keyed_by_headers = TRUE, $keyed_by_worksheet = FALSE) {
if (is_readable($path)) {
$library = libraries_load('PHPExcel');

if (!empty($library['loaded'])) {
// Determine caching method.
list($cache_method, $cache_settings) = _phpexcel_get_cache_settings();

// Is it available ? If not, return an error.
if (empty($cache_method)) {
return PHPEXCEL_CACHING_METHOD_UNAVAILABLE;
}

PHPExcel_Settings::setCacheStorageMethod($cache_method, $cache_settings);

$xls_reader = PHPExcel_IOFactory::createReaderForFile($path);
//註釋掉setReadDataOnly模式操做
//      if (!empty($custom_calls)) {
// foreach ($custom_calls as $method => $args) {
// if (method_exists($xls_reader, $method)) {
// call_user_func_array(array($xls_reader, $method), $args);
// }
// }
// }

$xls_data = $xls_reader->load($path);

$data = array();
$headers = array();
$options = array(
'path' => $path,
'keyed_by_headers' => $keyed_by_headers,
'keyed_by_worksheet' => $keyed_by_worksheet,
);
$i = 0;

phpexcel_invoke('import', 'full', $xls_data, $xls_reader, $options);

foreach ($xls_data->getWorksheetIterator() as $worksheet) {
$j = 0;

phpexcel_invoke('import', 'sheet', $worksheet, $xls_reader, $options);

foreach ($worksheet->getRowIterator() as $row) {
if ($keyed_by_worksheet) {
$i = $worksheet->getTitle();
}
$k = 0;

$cells = $row->getCellIterator();

$cells->setIterateOnlyExistingCells(FALSE);

phpexcel_invoke('import', 'row', $row, $xls_reader, $options);

foreach ($cells as $cell) {
//轉換格式操做
$style=$xls_data->getActiveSheet()->getParent()->getCellXfByIndex($cell->getXfIndex());
$value_t = $cell->getValue();
$value=PHPExcel_Style_NumberFormat::toFormattedString(
$value_t,
($style && $style->getNumberFormat()) ?
$style->getNumberFormat()->getFormatCode() :
PHPExcel_Style_NumberFormat::FORMAT_GENERAL
); $value = drupal_strlen($value) ? trim($value) : ''; if (!$j && $keyed_by_headers) { $value = drupal_strlen($value) ? $value : $k; phpexcel_invoke( 'import', 'pre cell', $value, $cell, $options, $k, $j ); $headers[$i][] = $value; } elseif ($keyed_by_headers) { phpexcel_invoke( 'import', 'pre cell', $value, $cell, $options, $k, $j ); $data[$i][$j - 1][$headers[$i][$k]] = $value; phpexcel_invoke( 'import', 'post cell', $data[$i][$j - 1][$headers[$i][$k]], $cell, $options, $k, $j ); } else { $col_index = $k; if ($cells->getIterateOnlyExistingCells()) { $col_index = PHPExcel_Cell::columnIndexFromString($cell->getColumn()) - 1; } phpexcel_invoke( 'import', 'pre cell', $value, $cell, $options, $col_index, $j ); $data[$i][$j][$col_index] = $value; phpexcel_invoke( 'import', 'post cell', $data[$i][$j][$col_index], $cell, $options, $col_index, $j ); } $k++; } $j++; } if (!$keyed_by_worksheet) { $i++; } } // Free up memory. $xls_data->disconnectWorksheets(); unset($xls_data); return $data; } else { watchdog('phpexcel', "Couldn't find the PHPExcel library. Excel import aborted.", array(), WATCHDOG_ERROR); return PHPEXCEL_ERROR_LIBRARY_NOT_FOUND; } } else { watchdog('phpexcel', "The path '@path' is not readable. Excel import aborted.", array('@path' => $path)); return PHPEXCEL_ERROR_FILE_NOT_READABLE; }}
相關文章
相關標籤/搜索