phpexcel 自動欄寬的問題

阿潘
foreach($title as $key => $value){
$objPHPExcel->getActiveSheet()->getColumnDimension(chr($i))->setAutoSize(true);
}

我把每個欄位都自動欄寬了,但是碰到中文就無法使用,有人遇到這種問題嗎?

eva3223
您好啊
最近也在用phpexcel……小小研究了一個星期……
就在剛剛放棄了……(也許是小弟太弱了……)

餵中文進去沒辦法出現……
如果是直接給中文的話是可以
如:$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A1', '您好')
這樣是可以,但是如果您好存在變數裡的話……是不行(小弟自行測試的結論)
爬文的結果是寫入時不支援中文(在下列分享的第一篇)………

分享一下找到的資料……
http://blog.roodo.com/taikobo0/archives/5625521.html

http://hi.baidu.com/phpdb/blog/item/e8a9e982ef3a68b46c811981.html

http://bayu.freelancer.web.id/2010/07/16/phpexcel-advanced-read-write-excel-made-simple/

還有一些……但是在寫入的部份比較有用的就是這幾篇……


有機會可以討論一下關於phpexcel

謝謝。


阿潘
可是我存在陣列就可以咧~

$title=array('Designer','Client','Product Class');
$i=65;
foreach($title as $key => $value){
//echo $value."<br />";

$objPHPExcel->getActiveSheet()->setCellValue(chr($i)."1", $value);

$objPHPExcel->getActiveSheet()->getColumnDimension(chr($i))->setAutoSize(true);

$i++;

}
你試看看摟~


阿潘
我忘了寫中文進去,我是可以的~
eva3223
恩恩

還沒試到陣列……

小弟測的方法是
$name= $row_Recordset3['name'];

setCellValue('A1', "$name")

這樣$name的中文字就出不來了


小弟之後也會用陣列的說……

但在中文字就卡關了……
eva3223
小弟試了用陣列存中文字……中文字也是出不來……
eva3223
$title=array(iconv("Big5","utf-8","再一次"),'test','phpexcel');
$i=65;
foreach($title as $key => $value){
//echo $value."<br />";

$objPHPExcel->getActiveSheet()->setCellValue(chr($i)."1", $value);

$objPHPExcel->getActiveSheet()->getColumnDimension(chr($i))->setAutoSize(true);

$i++;

}
用了iconv去轉了以後中文出現!!

可以試試……

中文出現在接下來就是挑戰迴圈

再次燃起用phpexcel可能

謝謝。
阿潘
if(chr($i)=="I"){
$objPHPExcel->getActiveSheet()->getColumnDimension(chr($i))->setWidth(16); //設定寬16pt
}else{
$objPHPExcel->getActiveSheet()->getColumnDimension(chr($i))->setAutoSize(true);
}

我欄寬最後就只自己設定了
eva3223
恩恩

回的有點偏了

不好意思

那依您的欄寬設定方式後…

中文字就會正常出現了?

目前還是跟phpexcel奮鬥

請您不要見怪。

還請您多請教。

謝謝。
阿潘
if(isset($_POST["download"])&& $_POST["download"]!=""){

error_reporting(E_ALL);

date_default_timezone_set('Asia/Taipei');

/** PHPExcel */
require_once 'Classes/PHPExcel.php';
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();

// Set properties
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
							 ->setLastModifiedBy("Maarten Balliauw")
							 ->setTitle("Office 2007 XLSX Test Document")
							 ->setSubject("Office 2007 XLSX Test Document")
							 ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
							 ->setKeywords("office 2007 openxml php")
							 ->setCategory("Test result file");


// Add some data
/*$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A1', 'Designer')
            ->setCellValue('B1', 'Client')
            ->setCellValue('A3', 'Product Class')
            ->setCellValue('A4', 'Model NAME');*/

// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);

// Rename sheet

$title=array('Designer','Client','Product Class','Product Stage','Model NAME','Product Description','Project Code','Initial Date','Pm工號/姓名','S/W RD','Status','Remark');



$objPHPExcel->getActiveSheet()->setTitle('Simple');

$row=2;

do {
	$objPHPExcel->getActiveSheet()->setCellValue("A".$row, $row_Recordset4['Designer']);
	$objPHPExcel->getActiveSheet()->setCellValue("B".$row, $row_Recordset4['Client']);
	$objPHPExcel->getActiveSheet()->setCellValue("C".$row, $row_Recordset4['ProductClass']);
	$objPHPExcel->getActiveSheet()->setCellValue("D".$row, $row_Recordset4['ProductStage']);
	$objPHPExcel->getActiveSheet()->setCellValue("E".$row, $row_Recordset4['ModelName']);
	$objPHPExcel->getActiveSheet()->setCellValue("F".$row, $row_Recordset4['Description']);
	$objPHPExcel->getActiveSheet()->setCellValue("G".$row, $row_Recordset4['ProjectCode']);
	$objPHPExcel->getActiveSheet()->setCellValue("H".$row, $row_Recordset4['InitialDate']);
	$objPHPExcel->getActiveSheet()->setCellValue("I".$row, $row_Recordset4['PmName']);
	$objPHPExcel->getActiveSheet()->setCellValue("J".$row, $row_Recordset4['RD']);
	$objPHPExcel->getActiveSheet()->setCellValue("K".$row, $row_Recordset4['STATUS']);
	$objPHPExcel->getActiveSheet()->setCellValue("L".$row, $row_Recordset4['Remark']);
	//$objPHPExcel->getActiveSheet()->setCellValue(chr($i).$row, $value);
	$row++;
	
} while ($row_Recordset4 = mysql_fetch_assoc($Recordset4));

$i=65;
foreach($title as $key => $value){
    //echo $value."<br />";
	
	$objPHPExcel->getActiveSheet()->setCellValue(chr($i)."1", $value);
	
	if(chr($i)=="I"){
		$objPHPExcel->getActiveSheet()->getColumnDimension(chr($i))->setWidth(20); 
	}else if(chr($i)=="L"){
		$objPHPExcel->getActiveSheet()->getColumnDimension(chr($i))->setWidth(26); 
	}else{
		$objPHPExcel->getActiveSheet()->getColumnDimension(chr($i))->setAutoSize(true);
	}
	
	$i++;
	
}

// Redirect output to a client’s web browser (Excel5)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="工作報告.xls"');
header('Cache-Control: max-age=0');



$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;


中文顯示完全可以出現, 欄寬還是要自己設定.
陳怡其
我試了很久,終於找到可行的方法。
1. 必須先知道整欄的資料裡面,最多的英文或數字的個數(中文字要當作2個英文字)。
我的方法:
function getTextLen($text){
//目前測試的結果,好像利用mb_strlen($str,"utf-8")判斷1個中文字 = strlen($str)判斷3個字數
//所以$n2-$n1之後要除以2才是中文字的字數($nc), 然後用$n1-$nc就可以得到英文字字數($ne)
//如果以一個中文字字寬=2個英文字的字寬來處哩,總共應該有 $nc*2+$ne 個字寬
$result = 0;
$str = trim($text);
$n1 = mb_strlen($str,"utf-8");
$n2 = strlen($str);
$nc = ($n2-$n1)/2;
$ne = $n1-$nc;
//echo "中文字:".$nc.", 英文字:".$ne."\n";
$result = $nc*2+$ne;
return $result;
}
2. 在最後一列新增一個由空字串組合的儲存格內容
$temp = "";
for($i=0;$i<$v;$i++){
$temp .= " ";
}
$objPHPExcel->setActiveSheetIndex($ref_SheetIndex)->setCellValue($k.$Row_no,$temp); //$k.$Row_no表示儲存格的位置
3. 這樣該欄就可以有一個儲存格可以正確顯示英文數字的內容(空字串),用來判斷【自動欄寬】
$objPHPExcel->getActiveSheet($ref_SheetIndex)->getColumnDimension($k)->setAutoSize(true);
回到頂部