PHPExcel reader - требуется помощь - PullRequest
10 голосов
/ 25 января 2011

Я использую PHPExcel для чтения данных из листа Excel и сохранения в таблице mysql, до сих пор я не мог загружать .xls, а также файл .xlsx, и после загрузки xls я получил структуру таблицы ниже данные

name    start_date              end_date               city
one 11/25/2011 3:30:00 PM   11/29/2011 4:40:00 AM   Jaipur
two 10/22/2011 5:30:00 PM   10/25/2011 6:30:00 AM   Kota
three  3/10/2011 2:30:00 PM 3/11/2011 12:30:00 AM   Bikaner
                                                    chandigarh

Теперь у меня есть некоторые проблемы, пожалуйста, предложите мне оптимизированный метод

  1. как мы получим название листа (bcoz в одном excel есть 7 листов)
  2. на данный момент, что я делаю, чтобы сохранить эти данные в БД, ниже приведен фрагмент кода

    $inputFileName = "test.xls";  
    $inputFileType = PHPExcel_IOFactory::identify($inputFileName);  
    $objReader = PHPExcel_IOFactory::createReader($inputFileType);  
    $objReader->setReadDataOnly(true);  
    /**  Load $inputFileName to a PHPExcel Object  **/  
    $objPHPExcel = $objReader->load($inputFileName);  
    $total_sheets=$objPHPExcel->getSheetCount(); // here 4  
    $allSheetName=$objPHPExcel->getSheetNames(); // array ([0]=>'student',[1]=>'teacher',[2]=>'school',[3]=>'college')  
    $objWorksheet = $objPHPExcel->setActiveSheetIndex(0); // first sheet  
    $highestRow = $objWorksheet->getHighestRow(); // here 5  
    $highestColumn = $objWorksheet->getHighestColumn(); // here 'E'  
    $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);  // here 5  
    for ($row = 1; $row <= $highestRow; ++$row) {  
        for ($col = 0; $col <= $highestColumnIndex; ++$col) {  
        $value=$objWorksheet->getCellByColumnAndRow($col, $row)->getValue();  
            if(is_array($arr_data) ) { $arr_data[$row-1][$col]=$value; }  
        }  
    }
    print_r($arr_data);
    

и это возвращает

Array
(
[0] => Array
    (
        [0] => name
        [1] => start_date
        [2] => end_date
        [3] => city
        [4] =>         
    )

[1] => Array
    (
        [0] => one  
        [1] => 40568.645833333
        [2] => 40570.5
        [3] => Jaipur
        [4] => 
    )
[2] => Array
    (
        [0] => two 
        [1] => 40568.645833333
        [2] => 40570.5
        [3] => Kota
        [4] => 
    )
[3] => Array
    (
        [0] => three
        [1] => 40568.645833333
        [2] => 40570.5
        [3] => Bikaner
        [4] => 
     )
  [4] => Array
    (
        [0] => 
        [1] => 
        [2] => 
        [3] => Chandigarh
        [4] => 
    )

)

Мне нужно это

  • заголовок каждого листа Excel (т.е. первая строка) становится ключом массива ($ arr_data) и
  • rest становится значением массива.
  • время изменилось на некоторое целочисленное значение, которое должно быть таким же, как в листе Excel
  • пустое поле (т.е. заголовок столбца) массива во всей строке должно быть обрезано (здесь [4])
  • , если первое поле листа Excel (или объединенное условие на некоторых поля), то эта строка не должна быть добавлена ​​в массив

т.е. нужный массив должен выглядеть как

Array  
    (  
    [0] => Array  
    (  
      [name] => one  
      [start_date] => 11/25/2011 3:30:00 PM  
      [end_date] => 11/29/2011 4:40:00 AM  
      [city] => Jaipur  
    )  
    [1] => Array  
    (  
      [name] => two  
      [start_date] => 10/22/2011 5:30:00 PM  
      [end_date] => 10/25/2011 6:30:00 AM  
      [city] => Kota  
    )  
    [2] => Array  
    (  
      [name] => three  
      [start_date] => 3/10/2011 2:30:00 PM  
      [end_date] => 3/11/2011 12:30:00 AM  
      [city] => Bikaner  
    )  
)

и после этого я сохраняю данные в моей БД, используя действие mysql для нужного массива.

  • есть ли другой краткий метод для хранения вышеуказанных данных в дБ

Примечание: пожалуйста, не ссылайтесь на руководство (это действительно очень плохо) ... просто скажите мне название метода ..

обновление

@ Марк Спасибо за ваше решение, оно мне очень помогает, но все же есть некоторые проблемы

  • как обрабатывать пустую / пустую ячейку в листе Excel..bcoz, если какая-либо ячейка пуста, отображается уведомление

Примечание: неопределенный индекс: C в C: \ xampp \ htdocs \ xls_reader \ Tests \ excel2007.php по линии 60
Примечание: неопределенный индекс: D в C: \ xampp \ htdocs \ xls_reader \ Tests \ excel2007.php по линии 60

, тогда как строка 60 -

foreach($headingsArray as $columnKey => $columnHeading) { 
    $namedDataArray[$r][$columnHeading] = $dataRow[$row]$columnKey];
}
  • как установить условия перед извлечением массива полных данных, т. Е. Если я хочу, чтобы первый и второй столбцы были пустыми / пустыми в какой-либо строке, тогда эту строку не следует добавлять в наш требуемый массив

спасибо

1 Ответ

24 голосов
/ 25 января 2011

как получить имя листа (bcoz в одном excel есть 7 листов)?

Чтобы получить текущий активный лист:

$sheetName = $objPHPExcel->getActiveSheet()->getTitle();

время изменилось на некоторое целочисленное значение, которое должно быть таким же, как в листе Excel

Посмотрите PHPExcel_Shared_Date :: ExcelToPHP ($ excelDate) или PHPExcel_Shared_Date :: ExcelToPHPObject ($ excelDate) для преобразования даты /значения времени для PHP-метки времени или объекта DateTime

Взгляните на метод $ objPHPExcel-> getActiveSheet () -> toArray (), а не просматривайте все rwos и столбцы самостоятельно.Если вы хотите использовать toArray с отформатированным аргументом, не используйте $ objReader-> setReadDataOnly (true);в противном случае PHPExcel не сможет различить число и дату / время.В последнем коде SVN добавлен метод rangeToArray () к объекту рабочего листа, который позволяет одновременно читать строку (или блок ячеек), например, $ objPHPExcel-> getActiveSheet () -> rangeToArray ('A1: A4')

Остальные вопросы - это в основном манипуляции с массивами PHP

РЕДАКТИРОВАТЬ

PS.Вместо того, чтобы просто сказать нам, что руководство действительно очень плохое ... расскажите, как мы можем его улучшить.

РЕДАКТИРОВАТЬ 2

Использование новейшего кода SVN длявоспользоваться методом rangeToArray ():

<code>$objWorksheet = $objPHPExcel->setActiveSheetIndex(0);
$highestRow = $objWorksheet->getHighestRow();
$highestColumn = $objWorksheet->getHighestColumn();

$headingsArray = $objWorksheet->rangeToArray('A1:'.$highestColumn.'1',null, true, true, true);
$headingsArray = $headingsArray[1];

$r = -1;
$namedDataArray = array();
for ($row = 2; $row <= $highestRow; ++$row) {
    $dataRow = $objWorksheet->rangeToArray('A'.$row.':'.$highestColumn.$row,null, true, true, true);
    if ((isset($dataRow[$row]['A'])) && ($dataRow[$row]['A'] > '')) {
        ++$r;
        foreach($headingsArray as $columnKey => $columnHeading) {
            $namedDataArray[$r][$columnHeading] = $dataRow[$row][$columnKey];
        }
    }
}

echo '<pre>';
var_dump($namedDataArray);
echo '
«;
...