10

我正在使用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. 我们如何获得工作表名称(一个 excel 中的 bcoz 有 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 表中的相同
  • 应截断所有行中数组的空白字段( 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  
    )  
)

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

  • 是否有任何其他简短的方法可以将上述数据存储在数据库中

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

更新

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

  • 如何处理excel sheet..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];
}
  • 如何在检索完整数据数组之前设置条件,即如果我想要如果第一列和第二列在任何行中为空/空白,则不应将该行添加到我们所需的数组中

谢谢

4

1 回答 1

24

我们如何获得工作表名称(一个 excel 中的 bcoz 有 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() 方法:

$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 />';
于 2011-01-25T11:03:18.257 回答