Jak używać phpexcel do odczytu danych i wstawienia ich do bazy danych?
108
Mam phpaplikację, w której chcę odczytać dane z programu Excel, wstawić do bazy danych, a następnie wygenerować raporty PDF dla konkretnych użytkowników. Szukałem dużo, ale nie podano nic konkretnego na temat obu rzeczy.
Czy myślałeś o wyeksportowaniu danych programu Excel do CSV? Czy w twoich danych jest coś, co eliminuje CSV jako opcję?
Telmo Marques
2
Czy przeglądałeś już bibliotekę PHPExcel?
Mark Baker,
@MarkBaker Nie widziałem jeszcze biblioteki, chociaż próbowałem sprawdzić plik referencyjny funkcji, ale był zbyt duży, aby zajrzeć, ponieważ musiałem sprawić, aby to działało jak najszybciej, oprócz innych części projektu.
coder101
@TelmoMarques myśleliśmy o zrobieniu tego przez csv, ale chcieliśmy to zrobić przy użyciu PHPExcel, w przeciwnym razie ostatnia opcja csv jest zawsze dostępna.
coder101
Może zajrzeć do tego samouczka. Miejmy nadzieję, że okaże się
tisuchi
Odpowiedzi:
224
Wykorzystanie biblioteki PHPExcel do odczytu pliku Excel i przeniesienia danych do bazy danych
// Include PHPExcel_IOFactory
include 'PHPExcel/IOFactory.php';
$inputFileName ='./sampleData/example1.xls';// Read your Excel workbooktry{
$inputFileType =PHPExcel_IOFactory::identify($inputFileName);
$objReader =PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFileName);}catch(Exception $e){die('Error loading file "'.pathinfo($inputFileName,PATHINFO_BASENAME).'": '.$e->getMessage());}// Get worksheet dimensions
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();// Loop through each row of the worksheet in turnfor($row =1; $row <= $highestRow; $row++){// Read a row of data into an array
$rowData = $sheet->rangeToArray('A'. $row .':'. $highestColumn . $row,
NULL,
TRUE,
FALSE);// Insert row data array into your database of choice here}
Wszystko więcej staje się bardzo zależne od Twojej bazy danych i tego, jak chcesz, aby dane w niej były uporządkowane
Przetestowałem to dzisiaj w wersji 1.7.9, 2013-06-02 i nie działa. musiałem zastąpić $highestColumn = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());prostym $sheet->getHighestColumn(). możesz mieć błąd w kodzie, gdy próbujesz pobrać indeks kolumny z ciągu - ALE spróbuj uzyskać do niego dostęp poprzez $ najwyższa kolumna. $ wiersz w pętli (co dałoby po prostu dziwną połączoną liczbę całkowitą, gdybyś nie użył znak)
user151496
Najwyższa kolumna powinna zawierać literę (y) kolumny; więc masz rację - to powinno być po prostu ustawienie, $highestColumn = $sheet->getHighestColumn();a nie $highestColumn = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());jestem nieomylny ''
getHighestColumn()zwraca 255 za każdym razem. Zastąpienie go getHighestDataColumn()rozwiązuje problem. Tutaj jest więcej informacji: stackoverflow.com/questions/15903471/…
Martin Dzhonov
@ coder101 Cześć. Czy mógłbyś podać mi swój php Pg_Query, aby wstawić tablicę danych wiersza do bazy danych? Thankyou
Shieryn
12
Aby odczytać dane z microsoft excel 2007 przez codeigniter, wystarczy utworzyć funkcję pomocniczą excel_helper.php i dodać w:
require_once APPPATH.'libraries/phpexcel/PHPExcel.php';
require_once APPPATH.'libraries/phpexcel/PHPExcel/IOFactory.php';in controller add the following code to read spread sheet by active sheet//initialize php excel first
ob_end_clean();//define cachemethod
$cacheMethod =PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array('memoryCacheSize'=>'20MB');//set php excel settingsPHPExcel_Settings::setCacheStorageMethod(
$cacheMethod,$cacheSettings);
$arrayLabel = array("A","B","C","D","E");//=== set object reader
$objectReader =PHPExcel_IOFactory::createReader('Excel2007');
$objectReader->setReadDataOnly(true);
$objPHPExcel = $objectReader->load("./forms/test.xlsx");
$objWorksheet = $objPHPExcel->setActiveSheetIndexbyName('Sheet1');
$starting =1;
$end =3;for($i = $starting;$i<=$end; $i++){for($j=0;$j<count($arrayLabel);$j++){//== display each cell value
echo $objWorksheet->getCell($arrayLabel[$j].$i)->getValue();}}//or dump data
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
var_dump($sheetData);//see also the following link
http://blog.mayflower.de/561-Import-and-export-data-using-PHPExcel.html-----------importin another style around 5000 records ------
$this->benchmark->mark('code_start');//=== change php ini limits. =====
$cacheMethod =PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp;
$cacheSettings = array(' memoryCacheSize '=>'50MB');PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);//==== create excel object of reader
$objReader =PHPExcel_IOFactory::createReader('Excel2007');//$objReader->setReadDataOnly(true);//==== load forms tashkil where the file exists
$objPHPExcel = $objReader->load("./forms/5000records.xlsx");//==== set active sheet to read data
$worksheet = $objPHPExcel->setActiveSheetIndexbyName('Sheet1');
$highestRow = $worksheet->getHighestRow();// e.g. 10
$highestColumn = $worksheet->getHighestColumn();// e.g 'F'
$highestColumnIndex =PHPExcel_Cell::columnIndexFromString($highestColumn);
$nrColumns = ord($highestColumn)-64;
$worksheetTitle = $worksheet->getTitle();
echo "<br>The worksheet ".$worksheetTitle." has ";
echo $nrColumns .' columns (A-'. $highestColumn .') ';
echo ' and '. $highestRow .' row.';
echo '<br>Data: <table border="1"><tr>';//----- loop from all rows -----for($row =1; $row <= $highestRow;++ $row){
echo '<tr>';
echo "<td>".$row."</td>";//--- read each excel column for each row ----for($col =0; $col < $highestColumnIndex;++ $col){if($row ==1){// show column name with the title//----- get value ----
$cell = $worksheet->getCellByColumnAndRow($col, $row);
$val = $cell->getValue();//$dataType = PHPExcel_Cell_DataType::dataTypeForValue($val);
echo '<td>'. $val ."(".$row." X ".$col.")".'</td>';}else{if($col ==9){//----- get value ----
$cell = $worksheet->getCellByColumnAndRow($col, $row);
$val = $cell->getValue();//$dataType = PHPExcel_Cell_DataType::dataTypeForValue($val);
echo '<td>zone '. $val .'</td>';}elseif($col ==13){
$date =PHPExcel_Shared_Date::ExcelToPHPObject($worksheet->getCellByColumnAndRow($col, $row)->getValue())->format('Y-m-d');
echo '<td>'.dateprovider($date,'dr').'</td>';}else{//----- get value ----
$cell = $worksheet->getCellByColumnAndRow($col, $row);
$val = $cell->getValue();//$dataType = PHPExcel_Cell_DataType::dataTypeForValue($val);
echo '<td>'. $val .'</td>';}}}
echo '</tr>';}
echo '</table>';
$this->benchmark->mark('code_end');
echo "Total time:".$this->benchmark->elapsed_time('code_start','code_end');
$this->load->view("error");
Korzystając z biblioteki PHPExcel , zrobi to następujący kod.
require_once dirname(__FILE__).'/../Classes/PHPExcel/IOFactory.php';
$objReader =PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadDataOnly(true);//optional
$objPHPExcel = $objReader->load(__DIR__.'/YourExcelFile.xlsx');
$objWorksheet = $objPHPExcel->getActiveSheet();
$i=1;foreach($objWorksheet->getRowIterator()as $row){
$column_A_Value = $objPHPExcel->getActiveSheet()->getCell("A$i")->getValue();//column A//you can add your own columns B, C, D etc.//inset $column_A_Value value in DB query here
$i++;}
dzięki. Właściwie opublikowałem ten problem kilka miesięcy temu i sam miałem obejście tego problemu. ale na pewno skorzystam z twojej sugestii następnym razem, gdy będę pracował nad tą funkcją. dzięki jeszcze raz.
Odpowiedzi:
Wykorzystanie biblioteki PHPExcel do odczytu pliku Excel i przeniesienia danych do bazy danych
Wszystko więcej staje się bardzo zależne od Twojej bazy danych i tego, jak chcesz, aby dane w niej były uporządkowane
źródło
$highestColumn = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());
prostym$sheet->getHighestColumn()
. możesz mieć błąd w kodzie, gdy próbujesz pobrać indeks kolumny z ciągu - ALE spróbuj uzyskać do niego dostęp poprzez $ najwyższa kolumna. $ wiersz w pętli (co dałoby po prostu dziwną połączoną liczbę całkowitą, gdybyś nie użył znak)$highestColumn = $sheet->getHighestColumn();
a nie$highestColumn = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());
jestem nieomylny ''getHighestColumn()
zwraca 255 za każdym razem. Zastąpienie gogetHighestDataColumn()
rozwiązuje problem. Tutaj jest więcej informacji: stackoverflow.com/questions/15903471/…Aby odczytać dane z microsoft excel 2007 przez codeigniter, wystarczy utworzyć funkcję pomocniczą excel_helper.php i dodać w:
źródło
Korzystając z biblioteki PHPExcel , zrobi to następujący kod.
źródło
źródło
źródło
Oto bardzo aktualna odpowiedź na to pytanie z pliku: 07reader.php
źródło
Framework Inci, który możesz pobrać w następujący sposób:
źródło