PHPExcel 阅读器——需要帮助

标签 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

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

  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 工作表的标题(即第一行)成为 array($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 操作将数据存储到我的数据库中。

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

注意:请不要引用手册(真的很糟糕)...只告诉我方法名称..

更新

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

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

Notice: Undefined index: C in C:\xampp\htdocs\xls_reader\Tests\excel2007.php on line 60
Notice: Undefined index: D in C:\xampp\htdocs\xls_reader\Tests\excel2007.php on line 60

而第 60 行是

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

谢谢

最佳答案

how do we get the sheet name ( bcoz in one excel there are 7 sheets )?

获取当前事件工作表:

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

time changed into some integer value, that shoud be same as in excel sheet

查看 PHPExcel_Shared_Date::ExcelToPHP($excelDate) 或 PHPExcel_Shared_Date::ExcelToPHPObject($excelDate) 以将日期/时间值转换为 PHP 时间戳或 DateTime 对象

查看 $objPHPExcel->getActiveSheet()->toArray() 方法,而不是自己循环遍历所有 rwos 和列。但是,如果您想将 toArray 与格式化参数一起使用,请不要使用 $objReader->setReadDataOnly(true);否则 PHPExcel 无法区分数字和日期/时间。最新的 SVN 代码已将 rangeToArray() 方法添加到工作表对象,它允许您一次读取一行(或单元格 block ),例如$objPHPExcel->getActiveSheet()->rangeToArray('A1:A4')

你剩下的问题基本上都是 PHP 数组操作

编辑

附言。不要只是告诉我们手册真的非常糟糕...告诉我们如何改进它。

编辑 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 />';

关于PHPExcel 阅读器——需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4792543/

相关文章:

php - 将PHP创建的日期时间插入MySQL表后,使用相同的变量值查询同一个表时没有返回结果

database - 什么是 Vanilla 模式?

database - 数据库的 Post、ApplyUpdates 和 Commit 之间有什么区别?

javascript - 使用 AJAX 将 GAE 文件上传到 blobstore

ruby-on-rails - Rails 5.2 Active Storage 清除/删除附件

javascript - 保存上传到 asp 的文件时可以阻止 window.onbeforeunload :fileupload

php - Codeigniter:查询在 select/like 语句中返回表中的所有行

php - 固定成本 map 库或服务?

php - 虚构事件网站的事件预订

mysql - 如何使用联接从两个表创建一个 View ,以显示另一个表的 COUNT?