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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章