Ik had hetzelfde probleem met een project, ik was op zoek naar een PHP Class om Excel te lezen als PHP Array
.
Ik had het geluk dat ik 'SimpleXLSX' Class
vond. Het kan uitstekend omgaan met excel-gegevens, maar ... maar ... ohh !! maar.... :(
Ik heb me gerealiseerd dat er een probleem is met het veld Datum lezen van Excel
. In excel-waarden zag er goed uit, maar toen we waren
proberen om ze te importeren, de datumwaarden krijgen verschillende. Enige tijd kregen we soms enkele correcte waarden, alleen een aantal en soms een float-waarde.
We waren op zoek naar oplossing '
WAAROM HET GEBEURT, WAAROM PHP NIET CORRECTE DATUM KRIJGT VAN EXCEL
'
Toen vonden we na het goggles de reden:
@Bron: xls-datum in PHP lezen
Volgens Excel-formaat 41397 is 2013-05-03 Excel-winkels datums en
keer als een getal dat het aantal dagen sinds 1900-januari-0 weergeeft,
plus een fractioneel deel van een 24-urendag: ddddd.tttttt. Dit is
een seriële datum of seriële datum-tijd genoemd.
@bron: Excel-datumconversie met PHP Excel
Converteer Excel-datum naar Unix-datum en converteer vervolgens Unix-datum naar PHP-datum
Dus maakte ik een kleine hulpklasse om Excel Date te lezen voor gebruik in PHP. Ik hoop dat het iemand zal helpen en goggling en inspanningen zal verminderen.
Here is my code to Read Excel as PHP Array()
and Parse Excel Date as PHP Date
Voor beginners:
- Download
SimpleXLSX.php
uit de gegeven voorbeeldcode
- Excel-gegevens (veld/waarde) converteren in PHP-array()
- Excel-datum converteren naar PHP
- Nu .. Ja !! Excel-gegevens zijn klaar als een PHP-array om naar toe te gaan
MySQL-tabel ...
Dit is PHP-code:
<?php
/*
EXCEL DATA EXAMPLE:
----------------------------
ID Consumer_Date Delivery_Date Date_of_Dispatch Gift_Date_Created Active_Date Approved_Date
536 -No-Data- 9-Nov-15 7-Nov-15 -No-Data- 10/31/2015 12:00:00 AM 4/11/2015 10:21
537 -No-Data- -No-Data- 7-Nov-15 -No-Data- 10/23/2015 12:00:00 AM 3/11/2015 16:24
*/
/*
EXCEL DATA IN PHP ARRAY FORMAT
-------------------------------
Array
(
[0] => Array
(
[ID] => 536
[Consumer_Date] => -No-Data-
[Delivery_Date] => 42317
[Date_of_Dispatch] => 42315
[Gift_Date_Created] => -No-Data-
[Active_Date] => 10/31/2015 12:00:00 AM
[Approved_Date] => 42105.431574074
)
[1] => Array
(
[ID] => 537
[Consumer_Date] => -No-Data-
[Delivery_Date] => -No-Data-
[Date_of_Dispatch] => 42315
[Gift_Date_Created] => -No-Data-
[Active_Date] => 10/23/2015 12:00:00 AM
[Approved_Date] => 42074.683958333
)
)
*/
/* ----------------- */
/* Excel_Date_Parser.php */
/* ----------------- */
// Numbers of days between January 1, 1900 and 1970 (including 19 leap years)
define("MIN_DATES_DIFF", 25569);
// Numbers of second in a day:
define("SEC_IN_DAY", 86400);
/** Set default timezone (will throw a notice otherwise) */
date_default_timezone_set('Asia/Kolkata');
/**
* Class Excel_Date_Parser
*
* SetDateString($excel_date_value) : send excel date column value
* GetDateString(): get your PHP date in Y-m-d format (MySQL)
*/
class Excel_Date_Parser
{
/**
* Send Excel Date String Value Here
* @param [type] $date_from_excel [description]
* @return instance Excel_Date_Parser
*/
public function SetDateString($date_from_excel) {
$this->date_from_excel = $date_from_excel;
return $this;
}
/**
* Set Date Format Here, default is "Y-m-d"
* @param string $set_format_date [description]
*/
public function SetDateFormat($set_format_date = "Y-m-d") {
$this->set_format_date = $set_format_date;
}
/**
* Get what format is set
*/
public function GetDateFormat() {
return $this->set_format_date;
}
/**
* Return PHP date according to Set Format from Excel Date
* @return string PHP date
*/
public function GetDateString() {
//if value is valid date string
if (strtotime($this->date_from_excel)) {
/**
* Excel stores dates and times as a number representing the number of days since 1900-Jan-0,
* plus a fractional portion of a 24 hour day: ddddd.tttttt.
* This is called a serial date, or serial date-time.
*
* @source: https://stackoverflow.com/questions/17808750/reading-xls-date-in-php
*/
if (is_float($this->date_from_excel)) {
//date format 2015-25-12
$this->SetDateFormat("Y-d-m");
$this->date_from_excel = date($this->GetDateFormat() , (mktime(0, 0, -1, 1, $this->date_from_excel, 1900)));
}
else {
//date format 2015-12-25
$this->SetDateFormat();
//return converted date string in PHP format date format 2015-12-25
$this->date_from_excel = date($this->GetDateFormat() , strtotime($this->date_from_excel));
}
}
/**
* Excel stores dates and times as a number representing the number of days since 1900-Jan-0,
* plus a fractional portion of a 24 hour day: ddddd.tttttt .
* This is called a serial date, or serial date-time.
*
* According to excel format 41397 is 2013-05-03
* @source: https://stackoverflow.com/questions/17808750/reading-xls-date-in-php
*/
else if (is_integer($this->date_from_excel)) {
$this->SetDateFormat();
$this->date_from_excel = gmdate($this->GetDateFormat() , (($this->date_from_excel - MIN_DATES_DIFF) * SEC_IN_DAY));
}
//return real value
else {
$this->date_from_excel = $this->date_from_excel;
}
//return date
return $this->date_from_excel;
}
}
/* ----------------- */
/* Excel_Reader.php */
/* ----------------- */
/* Show errors */
error_reporting(1);
/* display error */
ini_set('display_errors', 1);
/**
* Using class SimpleXLSX
*
* Big Thanks!!!! to Sergey Shuchkin, Who made Excel Reader Class
*
* This class can be used to parse and retrieve data from Excel XLS spreadsheet files.
* It can parse a given Excel XLS file by extracting its contents files and parsing the
* contained xml spreadsheet file.
*
* The class provides functions to retrieve data for the spreadsheet worksheets, rows and cells.
*
* @link: http://www.phpclasses.org/package/6279-PHP-Parse-and-retrieve-data-from-Excel-XLS-files.html
* @author: Sergey Shuchkin
* @download: http://www.phpclasses.org/browse/download/zip/package/6279/name/simple-xlsx-2013-10-13.zip
*/
require_once 'SimpleXLSX.php';
/* Adding my class Excel_Date_Parser */
require_once 'Excel_Date_Parser.php';
/**
* [toPhpDate description]
* @param [type] $array [description]
*/
function toPhpDate($array) {
//create class object
$ed = new Excel_Date_Parser();
//parse array and set
$array['Consumer_Date'] = $ed->SetDateString($array['Consumer_Date'])->GetDateString();
$array['Delivery_Date'] = $ed->SetDateString($array['Delivery_Date'])->GetDateString();
$array['Date_of_Dispatch'] = $ed->SetDateString($array['Date_of_Dispatch'])->GetDateString();
$array['Gift_Date_Created'] = $ed->SetDateString($array['Gift_Date_Created'])->GetDateString();
$array['Active_Date'] = $ed->SetDateString($array['Active_Date'])->GetDateString();
$array['Approved_Date'] = $ed->SetDateString($array['Approved_Date'])->GetDateString();
//return PHP array
return $array;
}
// make xls object
$xlsx = new SimpleXLSX('Sony_RedemptionFormat 8-Dec-15.xlsx');
// get excel data as array
$Excel_Array_Data = $xlsx->rows();
// Get Column Name
$Excel_Column = $Excel_Array_Data[0];
// Remove Column Name From Array
unset($Excel_Array_Data[0]);
// Rest Data is Excel Data without Column
$Excel_Data = $Excel_Array_Data;
// Combine array for inserting in database
foreach ($Excel_Array_Data as $key => $Excel_Data) {
$insert_data[] = array_combine($Excel_Column, $Excel_Data);
}
// show array data
echo "", print_r($insert_data, true);
// update array excel date
$insert_data = array_map('toPhpDate', $insert_data);
// show array data after update date
echo "", print_r($insert_data, true);
Ik hoop dat deze code iemand zal helpen. Ik worstelde hetzelfde probleem Dus ik heb dit kleine script gemaakt om anderen tijd te besparen.
Happy PHPING !!!! :)