PHPExcel阅读器 - 需要帮助

diE*_*cho 10 php database file-upload phpexcel

我使用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
Run Code Online (Sandbox Code Playgroud)

现在我有一些问题,请建议我优化的方法

  1. 我们如何获得工作表名称(bcoz在一个excel中有7张)
  2. 现在我将这些数据存储到db中,下面是代码片段

    $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);
    
    Run Code Online (Sandbox Code Playgroud)

这回来了

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] => 
    )

)
Run Code Online (Sandbox Code Playgroud)

我需要它

  • 每个excel表(即第一行)的标题成为数组的键($ arr_data)和
  • 休息成为数组的价值.
  • 时间变为某个整数值,与excel表中的相同
  • 所有行中数组的空白字段(ieblank标题列)应该被截断(这里[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  
    )  
)
Run Code Online (Sandbox Code Playgroud)

然后我使用所需数组上的mysql操作将数据存储到我的数据库中.

  • 有没有其他简短的方法来存储db中的上述数据

注意:请不要参考手册(这真的非常糟糕)...只需告诉我方法名称..

更新

@Mark感谢您的解决方案,它对我有很大的帮助,但仍然存在一些问题

  • 如何处理excel sheet中的空/空单元格.bcoz当任何单元格为空时它会显示一个通知

注意:未定义的索引:第60行的
C:\ xampp\htdocs\xls_reader\Tests\excel2007.php中的C注意:未定义的索引:第60行的C:\ xampp\htdocs\xls_reader\Tests\excel2007.php中的D

而第60行是

foreach($headingsArray as $columnKey => $columnHeading) { 
    $namedDataArray[$r][$columnHeading] = $dataRow[$row]$columnKey];
}
Run Code Online (Sandbox Code Playgroud)
  • 如何在检索完整数据数组之前设置条件,即如果我想要,如果第一列和第二列在任何行中为空/空白,则该行不应添加到我们所需的数组中

谢谢

Mar*_*ker 24

我们如何获得工作表名称(bcoz在一个excel有7张)?

要获取当前活动表:

$sheetName = $objPHPExcel->getActiveSheet()->getTitle();
Run Code Online (Sandbox Code Playgroud)

时间变为某个整数值,与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()方法:

$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 '</pre><hr />';
Run Code Online (Sandbox Code Playgroud)

  • 我对文档的关注是我花时间和精力写它...如果人们不使用那些文档,那么我可以花时间做其他事情,比如添加新功能,修复错误,编写更好的文档......如果人们不告诉我文档有什么问题,我不知道如何改进它 (5认同)
  • @diEcho - 我不认为这是一个问题或问题,这是预期的行为......虽然任何讨论的正确位置是PHPExcel讨论板而不是SO. (3认同)