PHP ไม่สามารถอ่านไฟล์ Excel ที่ชื้อไฟล์เป็นภาษาไทยได้ค่ะ รบกวนบอกวิธีด้วยค่ะ
ตั้งชื่อไฟล์เป็นภาษาอังกฤษ หรือตัวเลขครับ จะได้ไม่มีปัญหาเรื่องการเข้าถึงไฟล์
Date :
2016-06-28 11:24:11
By :
arm8957
ภาษาไทยจะมีปัญหาครับ หรือจะใช้วิธี rename เป็นวันที่เวลาที่ upload เอกสารดูครับ
Date :
2016-06-28 11:42:01
By :
stepartz
แก้ได้ยังไงครับ อธิบายคร่าว ๆ เพิ่มเติมไว้ครับ อนาคตเผื่อใครเขามาค้นเจอ จะได้เป็นแนวทางครับ
Date :
2016-06-29 09:01:04
By :
apisitp
แก้ไขโดยการ rename ชื้อไฟล์ excel เป็นอย่างอื่นที่ไม่ใช่ภาษาไทย แล้วเอาไป upload ใส่โฟเดออื่นไว้ก่อน แล้วก็ไปเรียกมาใช้เหมือนเดิมค่ะ
(โฟเดอร์นั้นต้องเปิดให้สามารถแก้ไขได้ด้วย)
โค้ที่เพิ่มไปค่ะ
- สร้างไฟล์ใหม่เอาไว้อัพโหลดไฟล์ excel
Code (PHP)
<?php
if(isset($_POST["upload_file"]))
{
if($_FILES["excel_file"]["name"] != '')
{
$all_ext = array("xls", "xlsx");
$ext = end(explode(".", $_FILES["excel_file"]["name"]));
if(in_array($ext, $all_ext)){
$name = md5(rand()).'.'.$ext;
$path = "fileNewName/" . $name;
move_uploaded_file($_FILES["excel_file"]["tmp_name"], $path);
header("Location:http://localhost:81/PHPExcelReader%20(2)/PHPExcelReadToSQL.php?file-name=".$name."");
}else{
echo '<script>alert("Please select image file .xls or .xlsx")</script>';
}
}else{
echo '<script>alert("Please select file")</script>';
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> How to upload Excel to database </title>
</head>
<body>
<div align = "center">
<h1> How to upload Excel to database </h1>
<form method="post" action="" enctype="multipart/form-data">
<input type="file" name="excel_file" />
<input type="submit" name="upload_file" value="Upload Image" />
</form>
</div>
</body>
</html>
- จากนั้นไปเพิ่มโค้ดในไฟล์ที่ได้มาจากลิงค์ดังนี้
Code (PHP)
$name = $_GET["file-name"];
//echo $name."<br>";
$path = "fileNewName/".$name;
$inputFileName = $path; //ใส่ชื่อไฟล์ excel
Date :
2016-06-29 11:29:46
By :
Phatsanan
1. ไฟล์ excel ในคอลัมภ์ "วันที" ได้จัดรูปแบบ cell ไว้อย่างไรครับ
2. ฟิลด์ "date" ในตารางข้อมูล กำหนดรูปแบบเป็นแบบไหนครับ
สำหรับผมจะยึดการกำหนดข้อ 2 ในฟิลด์ที่จะเก็บ "วัน" จะกำหนดไว้เป็น Type: date ก่อน รูปแบบที่นำเข้าต้องเป็น 000-00-00 คือ ปปปป-ดด-วว จากนั้นผมจะกลับไปดูที่ไฟล์ excel ว่าได้สร้างรูปแบบวันที่ไว้แบบไหน
แต่ถ้ารูปแบบที่ต้องการเก็บเป็น 6/8/2016 ก็คงต้องจัดการไฟล์ excel ให้เป็นชนิด text ครับ
ลองพิจารณาที่รูปแบบ cell ของ excel ว่าเป็นแบบไหน และจะจัดเก็บในตารางข้อมูลแบบไหน ต้องให้สอดคล้องกัน
Date :
2016-06-29 13:35:13
By :
apisitp
ตอบความคิดเห็นที่ : 13 เขียนโดย : apisitp เมื่อวันที่ 2016-06-29 13:35:13
รายละเอียดของการตอบ ::
ที่สงสัยคือ จะทำยังงัยให้ array ไปเก็บค่าวันที่ให้อยู่ในรูปแบบของ string เหมือนคอลัมอื่นๆ ต้องทำยังงัยค่ะ เพราะที่เข้าใจ
(ไม่รู้ถูกเปล่า >< ) คือถ้า array ไปเก็บวันที่มาแบบ string ก็จะได้ แบบสีเหลือง อ่ะค่ะ
array(17) {
[0]=>
array(17) {
["Cust-Read-Meter"]=>
string(7) "@remote"
["No"]=>
float(2420)
["Date"]=>
float(42529)
["CT#"]=>
float(145338)
["Entity"]=>
string(7) "0102251"
["Cust-no"]=>
string(6) "163451"
["Name"]=>
string(89) "บริษัท เพชรเจริญรุ่งเรือง จำกัด"
["Lst-Bill"]=>
float(42501)
["Nxt-Bill"]=>
float(42533)
["CT-End"]=>
float(43597)
["Line-no"]=>
float(1)
["Serial-no"]=>
string(11) "E335M350134"
["Tambol"]=>
string(33) "บ้านคลองสวน"
["Terr"]=>
string(4) "BBK1"
["Bl!Day"]=>
float(12)
["Bl!Cyc"]=>
float(1)
["Remark ปัญหาที่ไม่สามารถเรียกข้อมูล @remote ได้ [Help desk]"]=>
NULL
}
Date :
2016-06-29 14:00:00
By :
Phatsanan
ถ้าตอบคำถามใน คห.13 ก่อน ก็จะได้ช่วยคิดต่อครับ คือมันมองไม่ออกว่า ไฟล์ excel มันตั้งอะไรไว้แบบไหน และ ฐานข้อมูลออกแบบอะไรไว้
พอคำถามไม่ได้คำตอบไปต่อไม่ถูกครับ
และการแก้ปัญหาบางครั้ง การอำนวยความสะดวกให้ user เป็นเรื่องที่ดี แต่บางเรื่องก็ควรให้ user จัดการบ้าง ในกรณีนี้ผมมองว่าถ้าไหล์ Excel มันคือตัวหลัก มันมันปัญหา ต้องให้ user เป็นคนแก้ไขไฟล์ก่อน upload ครับ ถ้าเราจะไปทำความต้องการทั้งหมดมันก็ยากต่อ code
แต่สุดท้ายจะแก้ปัญหา ตอบ คำถามตาม คห.13 ให้ตรงครับ แต่ถ้าทราบอยู่แล้วก็ขออภัยด้วย
ส่วน ตย.ไฟล์ array ใน คห.14 ผมก็ไม่รู้ว่าอะไรมันคืออะไร ผมก็ไม่รู้จะแก้อะไรได้ ถ้าจะแก้ก็คงต้องไล่ code กันยาว แต่ผมว่าตาม คห.13 น่าจะตอบโจทย์ปัญหาครั้งนี้ได้แล้วนะครับ
ปล.ผมไม่เคยใช้ Excel to mysql ผมเลยจะไม่ไปอ่าน code อ่านแล้วไม่ได้ใช้เครียดเปล่า ๆ จะดูแค่ดูผ่าน ๆ ว่าเขาสอนอะไร เขียนอะไรไว้ ส่วนผมใช้วิธี csv to mysql โดยเขียนคู่มือ สอนคนใช้งานว่าให้ทำแบบไหน ยกภาระให้ผู้ใช้งานบ้างครับ
#Edit1- ถ้าดูจากค่า array ที่ให้มา ที่ Date ไม่ส่งค่ามาเป็นสตริงก็เพราะ ไฟล์ Excel ในคอลัมภ็ Date มันถูกมองเป็น "ตัวเลข" มันก็เลขส่งค่าเป็น float ผมถึงบอกว่าใน ไฟล์ Excel คอลัมภ์ตั้งรูปแบบ cell ชนิดของ cell เป็นอะไร มันแก้จากตรงนั้นก็น่าจะหายครับ
ประวัติการแก้ไข 2016-06-29 15:17:27
Date :
2016-06-29 15:10:03
By :
apisitp
ตอบความคิดเห็นที่ : 15 เขียนโดย : apisitp เมื่อวันที่ 2016-06-29 15:10:03
รายละเอียดของการตอบ ::
ได้แล้วค่ะ ต้องขอบคุณ คุณกล้า สำหรับ Type: date ก็เลยลองมั้วๆ เอาค่ะ
แก้โค้โดยใส่อันนี้เข้าไป
if($columnHeading=="Date"){
$dateNumber=$dataRow[$row][$columnKey];
$dateTime = new DateTime("1899-12-30 + $dateNumber days");
$dateString=$dateTime->format("d/m/Y");
$namedDataArray[$r][$columnHeading] = $dateString;
}else {
$namedDataArray[$r][$columnHeading] = $dataRow[$row][$columnKey];
}
}
}
}
โค้ดทั้งมหมด
Code (PHP)
<?php
/** PHPExcel */
require_once 'Classes/PHPExcel.php';
/** PHPExcel_IOFactory - Reader */
include 'Classes/PHPExcel/IOFactory.php';
$inputFileName = "test.xlsx";
$inputFileType = PHPExcel_IOFactory::identify($inputFileName);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($inputFileName);
/*
// for No header
$objWorksheet = $objPHPExcel->setActiveSheetIndex(0);
$highestRow = $objWorksheet->getHighestRow();
$highestColumn = $objWorksheet->getHighestColumn();
$r = -1;
$namedDataArray = array();
for ($row = 1; $row <= $highestRow; ++$row) {
$dataRow = $objWorksheet->rangeToArray('A'.$row.':'.$highestColumn.$row,null, true, true, true);
if ((isset($dataRow[$row]['A'])) && ($dataRow[$row]['A'] > '')) {
++$r;
$namedDataArray[$r] = $dataRow[$row];
}
}
*/
$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) {
if($columnHeading=="Date"){
$dateNumber=$dataRow[$row][$columnKey];
$dateTime = new DateTime("1899-12-30 + $dateNumber days");
$dateString=$dateTime->format("d/m/Y");
$namedDataArray[$r][$columnHeading] = $dateString;
}else {
$namedDataArray[$r][$columnHeading] = $dataRow[$row][$columnKey];
}
}
}
}
//echo '<pre>';
//var_dump($namedDataArray);
//echo '</pre><hr />';
?>
<table width="500" border="1">
<tr>
<td>CustomerID</td>
<td>Name</td>
<td>Email</td>
<td>CountryCode</td>
<td>Budget</td>
<td>Date</td>
</tr>
<?php
foreach ($namedDataArray as $result) {
?>
<tr>
<td><?=$result["CustomerID"];?></td>
<td><?=$result["Name"];?></td>
<td><?=$result["Email"];?></td>
<td><?=$result["CountryCode"];?></td>
<td><?=$result["Budget"];?></td>
<td><?=$result["Date"];?></td>
</tr>
<?php
}
?>
</table>
พอใส่ไป array ก็เป็นแบบนี้เลย
["Date"]=>
string(10) "08/06/2016"
Date :
2016-06-29 17:29:15
By :
Phatsanan
Date :
2016-06-29 17:49:14
By :
arm8957
เยี่ยมเลยครับ
Date :
2016-06-30 09:52:31
By :
apisitp
Load balance : Server 00