web-dev-qa-db-ja.com

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. シート名を取得するにはどうすればよいですか(1つのExcelにbcozが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);
    

そしてこれは戻ります

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)のキーになり、
  • 残りは配列の値になります。
  • 時間は整数値に変更されました。これは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アクションを使用してデータをデータベースに保存します。

  • 上記のデータをdbに保存する他の短い方法はありますか

注:マニュアルを参照しないでください(本当に非常に悪いです)...メソッド名を教えてください。

更新

@Markあなたの解決策をありがとう、それは私を大いに助けます、しかしそれでもいくつかの問題があります

  • excelシートで空/空白のセルを処理する方法..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];
}
  • 完全なデータの配列を取得する前に条件を設定する方法。つまり、1番目と2番目の列のいずれかの行が空/空白の場合、その行を目的の配列に追加しないでください。

ありがとう

10
diEcho

シート名を取得するにはどうすればよいですか(1つのExcelにbcozが7枚あります)?

現在アクティブなシートを取得するには:

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

時間は整数値に変更されました。これはExcelシートと同じである必要があります。

PHPExcel_Shared_Date :: ExcelToPHP($ excelDate)またはPHPExcel_Shared_Date :: ExcelToPHPObject($ excelDate)を見て、日付/時刻の値をPHP timestampまたはDateTimeオブジェクトに変換します。

すべてのrwoと列を自分でループするのではなく、$ objPHPExcel-> getActiveSheet()-> toArray()メソッドを見てください。ただし、フォーマットされた引数でtoArrayを使用する場合は、$ objReader-> setReadDataOnly(true);を使用しないでください。そうしないと、PHPExcelは数値と日付/時刻を区別できません。最新のSVNコードでは、ワークシートオブジェクトにrangeToArray()メソッドが追加されています。これにより、一度に1行(またはセルのブロック)を読み取ることができます。 $ 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 />';
24
Mark Baker