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
今私はいくつかの問題を抱えています、私に最適化された方法を提案してください
今のところ、これらのデータを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] =>
)
)
わたしはそれが必要
つまり、目的の配列は次のようになります
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あなたの解決策をありがとう、それは私を大いに助けます、しかしそれでもいくつかの問題があります
注意:未定義のインデックス: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つの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 />';