 |
สอบถามเรื่องการใช้งาน PHPExcel มีปัญหาในเรื่องของ charset ค่ะ |
|
 |
|
|
 |
 |
|
มีปัญหาเรื่องการออกรายงาน Excel ผ่าน Linux Server เป็นภาษาไทยค่ะ ซึ่งฐานข้อมูลยังเป็นการกำหนด Character Set แบบ TIS-620 อยู่ค่ะ เบื้องต้นลองใช้ iconv รวมทั้งกำหนด mysql_query("SET NAMES tis620") แล้วค่ะ
ลองทำตามกระทู้ของคุณ naskw ตามลิ้งค์นี้แล้ว ก็ยังเป็นปัญหาอยู่ คือพอเอาโค้ดขึ้นบน Server ภาษาก็จะอ่านไม่ออกเหมือนเดิม แต่พอเวลาเทสบนเครื่อง Localhost ก็ออกได้ตามปกติค่ะ
*อันนี้จะเป็นโค้ดไฟล์เทสค่ะ
Code (PHP)
<?php
header("Content-type: text/html; charset=tis-620");
/** Include PHPExcel */
require_once '../PHPexcel/Classes/PHPExcel.php';
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
//+ FONT SIZE
$objPHPExcel->getDefaultStyle()->getFont()->setSize(11);
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', 'Hello')
->setCellValue('B1', 'ภาษาไทย')
->setCellValue('C1', ''.iconv('TIS-620','UTF-8','ภาษาไทยทดสอบ').'')
->setCellValue('E1', 'ทดสอบภาษาไทย');
$objPHPExcel->setActiveSheetIndex()->setCellValue('A4', 'ทดสอบ');
$objPHPExcel->setActiveSheetIndex()->setCellValue('B4', ''.iconv('TIS-620','UTF-8','ทดสอบ').'');
// Rename sheet
$objPHPExcel->getActiveSheet()->setTitle('Demo01');
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
// Redirect output to a client’s web browser (Excel5)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="01demo.xls"');
header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');
// If you're serving to IE over SSL, then the following may be needed
header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header ('Pragma: public'); // HTTP/1.0
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;
?>
ผลที่กำหนด head เป็น tis-620 ที่รันผ่านเครื่อง localhost ถ้าไม่ใช้ iconv ภาษาไทยจะไม่ออกค่ะ

ส่วนอันนี้จะเป็นผลจาก server ค่ะ

รบกวนขอคำแนะนำหน่อยนะคะ ขอบคุณมากค่ะ
Tag : PHP, Excel (Excel.Application)
|
|
 |
 |
 |
 |
Date :
2016-03-17 10:10:45 |
By :
maimaiphnthp |
View :
4011 |
Reply :
8 |
|
 |
 |
 |
 |
|
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ปกติมันน่าจะรองรับแค่ UTF-8 นะครับ หรือไม่ลอง iconv() ให้เป็น TIS-620 ดูครับ
|
 |
 |
 |
 |
Date :
2016-03-17 11:29:25 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
บันทัดที่ 2 เปลี่ยนเป็น utf-8
ไฟล์ไทป์ ก็ต้องเป็น utf-8
ข้อมูลที่เป็น constant ไม่ต้องผ่าน iconv
ข้อมูลที่เอามาจาก database เป็น tis-620 ให้ผ่าน iconv
|
 |
 |
 |
 |
Date :
2016-03-17 12:54:55 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
หนูควรใช้ utf-8 นะ
แล้วไฟล์ php ก็ต้อง encode ด้วย utf-8 without bom ด้วย
จะได้ไม่มีปัญหา
|
 |
 |
 |
 |
Date :
2016-03-18 08:54:41 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 5 เขียนโดย : ห้ามตอบเกินวันละ 2 กระทู้ เมื่อวันที่ 2016-03-18 08:54:41
รายละเอียดของการตอบ ::
ลองแล้วนะคะพอเอาขึ้น server ก็ยังอ่านไม่ออกอยู่ดีอ่ะค่ะ
Code (PHP)
<?php
header("Content-type: text/html; charset=utf-8");
/** Include PHPExcel */
require_once '../PHPexcel/Classes/PHPExcel.php';
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
//+ FONT SIZE
$objPHPExcel->getDefaultStyle()->getFont()->setSize(11);
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', 'Hello')
->setCellValue('B1', 'ภาษาไทย')
->setCellValue('C1','ทดสอบภาษาไทย')
->setCellValue('D1', 'ทดสอบภาษาไทย');
$objPHPExcel->setActiveSheetIndex()->setCellValue('A4', 'ทดสอบ');
$objPHPExcel->setActiveSheetIndex()->setCellValue('B4', 'ทดสอบภาษาไทย');
// Rename sheet
$objPHPExcel->getActiveSheet()->setTitle('Demo01');
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
// Redirect output to a client’s web browser (Excel5)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="01demo.xls"');
header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');
// If you're serving to IE over SSL, then the following may be needed
header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header ('Pragma: public'); // HTTP/1.0
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;
?>
หนูลองเข้า Notepad++ แล้ว convert to utf-8 without bom แล้วก็ยังเป็นเหมือนเดิมเลยค่ะ

|
 |
 |
 |
 |
Date :
2016-03-18 09:23:41 |
By :
maimaiphnthp |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (PHP)
<?php
namespace App\Libraries;
use Excel;
class MsExcel {
public static function export($filename, $dataset) {
Excel::create($filename, function($excel) use($dataset) {
foreach ($dataset as $datatable) {
$excel->sheet($datatable['SheetName'], function($sheet) use($datatable) {
self::pageSetup($sheet, $datatable['Format']);
self::title($sheet, $datatable['Title'], count($datatable['Header']));
self::header($sheet, $datatable['Header']);
self::fillData($sheet, $datatable['Data']);
self::home($sheet);
});
}
$excel->setActiveSheetIndex(0);
})->export('xlsx');
}
protected static function pageSetup($sheet, $format) {
$sheet->setOrientation('landscape');
$sheet->setPageMargin(0.5);
$sheet->setFontFamily('Microsoft Sans Serif');
$sheet->setFontSize(10);
$sheet->setColumnFormat($format);
}
protected static function title($sheet, $title, $merge) {
$column = self::stringFromColumnIndex($merge) . '1';
$sheet->mergeCells('A1:' . $column);
$sheet->cell('A1', $title);
$sheet->cell('A1', function($cell) {
$cell->setAlignment('center');
$cell->setFontWeight('bold');
});
}
protected static function header($sheet, $header) {
$col = 1;
foreach ($header as $name) {
$column = self::stringFromColumnIndex($col) . '3';
$sheet->cell($column, $name);
$sheet->cell($column, function($cell) {
$cell->setBorder('thin', 'thin', 'thin', 'thin');
$cell->setBackground('#f2f5a9');
$cell->setAlignment('center');
});
$col++;
}
}
protected static function fillData($sheet, $data) {
$row = 4;
foreach ($data as $datarow) {
$col = 1;
foreach ($datarow as $value) {
$column = self::stringFromColumnIndex($col) . $row;
$sheet->setBorder($column, 'thin');
$sheet->cell($column, $value);
$col++;
}
$row++;
}
}
protected static function home($sheet) {
$sheet->cell('A1', function($cell) {
$cell->setBorder('none', 'none', 'none', 'none');
});
}
protected static function stringFromColumnIndex($num) {
$numeric = ($num - 1) % 26;
$letter = chr(65 + $numeric);
$num2 = intval(($num - 1) / 26);
if ($num2 > 0) {
return getNameFromNumber($num2) . $letter;
}
else {
return $letter;
}
}
}
Code (PHP)
$date = new DateTime("$year-$month-01");
$filename = 'usage-statistic-' . strtolower($date->format('F')) . '-' . $date->format('Y');
$dbs = Statistic::getLoginLog($year, $month);
$usages = [];
foreach($dbs as $db) {
$usage = [$db->RowNumber,
$db->Account,
$db->Display,
(new DateTime($db->LoginDate))->format('d/m/Y H:i:s'),
$db->IpAddress,
$db->Platform,
$db->Browser
];
array_push($usages, $usage);
}
$datatable = ['SheetName' => 'Usage Session',
'Format' => [
'A' => '#.',
'D' => '[$-en-US]d-mmm-yyyy;@'
],
'Title' => 'Usage Session ' . $date->format('F Y'),
'Header' => ['#',
'Acount',
'Name',
'Date',
'IP Address',
'Platform',
'Browser'
],
'Data' => $usages
];
MsExcel::export($filename, [$datatable]);
|
 |
 |
 |
 |
Date :
2016-03-18 09:38:08 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (PHP)
$str = 'ภาษาไทย';
$str = html_entity_decode($str,ENT_QUOTES,'UTF-8');
...ตอบช้าไปสี่ปีเอง........ 
|
 |
 |
 |
 |
Date :
2020-04-08 09:34:05 |
By :
meawmill |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|