Yii框架文件上傳與寫入(Excel表格) 跨服務器

1、在vendor下引入phpoffice文件,其中包括PHPExcel類
PHPExcel類下載地址:https://github.com/PHPOffice/PHPExcel
如圖:
在這裏插入圖片描述
2、修改PHPExcel文件下的Autoloader.php
將register方法全部替換成如下:

    public static function register()
    {
        // 修改後的方法
        $functions = spl_autoload_functions();
        foreach ( $functions as  $function)
            spl_autoload_unregister($function);
        $functions = array_merge(array(array('PHPExcel_Autoloader','Load')),$functions);
        foreach ( $functions as $function)
            $x = spl_autoload_register($function);
        return $x;
    }

 3、在入口文件index.php 中引入PHPExcel類

require(__DIR__ . '/../../vendor/phpoffice/PHPExcel.class.php');

4、因爲是跨服務器上傳,所以採用的是curl傳送

具體方法見詳情:https://mp.csdn.net/postedit/103956716

5、方法一:導入excel表格

$objPHPExcel = new PHPExcel(); 
$objPHPExcelReader = \PHPExcel_IOFactory::load($filePath);
$excel_array=$objPHPExcelReader->getsheet(0)->toArray();   //轉換爲數組格式,獲取到表格中的所有數據

方法二:讀取文件內容

//$filePath 是文件上傳路徑
$filePath = str_replace('\\','/',$filePath);
$handle = fopen($filePath,'r');
if(!$handle){
	return  '文件打開失敗';
}
$i = 0;
$j = 0;
$line = 0;$offset = 0;
$arr = [];
while($data = fgetcsv($handle)){
	//小於偏移量則不讀取,但$i仍然需要自增
	if($i < $offset && $offset){
		$i++;
		continue;
	}
	//大於讀取行數則退出
	if($i > $line && $line){
		break;
	}

	foreach ($data as $key => $value) {
		$content = iconv("gbk","utf-8//IGNORE",$value);//轉化編碼
		$arr[$j][] = $content;
	}
	$i++;
	$j++;
}
//$arr 是文件中所有數據

6、方法一:導出數據到excel表格

public function exportData()
{
	$data = Yii::$app->db->createCommand("select name,sex,age from test limit 50")->queryAll();  //$data 是要操作的數據
	$objectPHPExcel = new PHPExcel();
	$objectPHPExcel->setActiveSheetIndex()->setCellValue('A1', '姓名');
	$objectPHPExcel->setActiveSheetIndex()->setCellValue('B1', '性別');
	$objectPHPExcel->setActiveSheetIndex()->setCellValue('C1', '年齡');

	$n = 2;
	foreach ($data as $v){
		$objectPHPExcel->getActiveSheet()->setCellValue('A'.($n) ,$v['name']);
		$objectPHPExcel->getActiveSheet()->setCellValue('B'.($n) ,$v['sex']);
		$objectPHPExcel->getActiveSheet()->setCellValue('C'.($n) ,$v['age']);
		$n = $n +1;
	}
	ob_end_clean();
	ob_start();
	header('Content-Type : application/vnd.ms-excel');
	//設置輸出文件名及格式
	header('Content-Disposition:attachment;filename="學生明細'.date("YmdHis").'.xls"');
	//導出.xls格式的話使用Excel5,若是想導出.xlsx需要使用Excel2007
	$objWriter= \PHPExcel_IOFactory::createWriter($objectPHPExcel,'Excel5');
	$objWriter->save('php://output');
	ob_end_flush();

	//清空數據緩存
	unset($data);
}

方法二: 寫入文件

public function exportData()
{
	$fp = fopen($exportUrl, 'w'); //$exportUrl爲文件寫入路徑
	//只有一列數據
    $fp = fopen($res_path, 'w');
    foreach ($row as $k => $v) {
    fwrite($fp, $v);
	    if ($v != end($row)) {
		   fwrite($fp, "\r\n");
	   }
	}
	fclose($fp);


	//一列以上數據
	$headList = ['姓名','性別','年齡'];
	//輸出Excel列名信息
	foreach ($headList as $key => $value) {
		//CSV的Excel支持GBK編碼,一定要轉換,否則亂碼
		$headList[$key] = iconv('utf-8', 'gbk', $value);
	}

	//將數據通過fputcsv寫到文件句柄
	fputcsv($fp, $headList);
	//計數器
	$num = 0;
	//每隔$limit行,刷新一下輸出buffer,不要太大,也不要太小
	$limit = 100000;
	//逐行取出數據,不浪費內存
	$count = count($dataList);
	for ($i = 0; $i < $count; $i++) {
		$num++;
		//刷新一下輸出buffer,防止由於數據過多造成問題
		if ($limit == $num) {
			ob_flush();
			flush();
			$num = 0;
		}
		$row = $dataList[$i];
		foreach ($row as $key => $value) {
			$row[$key] = iconv('utf-8', 'gbk', $value);
		}
		fputcsv($fp, $row);
	}
}

 

發佈了31 篇原創文章 · 獲贊 9 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章