【经验】sae云平台上的phpExcel库的使用详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunxiaoyu94/article/details/50161929

项目背景:

采用新浪sae云平台作web开发,使用thinkphp框架,在后台通过php导入excel表格,并实现excel表格数据读写。

具体步骤:

上传excel表格至sae云平台
- sae机制介绍
SAE采用分布式架构设计, 应用代码将部署在多台前端服务器上, 每次访问请求可能到达不同服务器。 假设现在有A、B、C、D四台服务器。用户上传一张图片到A服务器,第二次访问请求可能到达B服务器,此时将无法获取保存在A服务器上的图片。

SAE使用MemcacheX、Storage等存储型服务代替传统IO操作,效率比传统IO读写操作高,有效解决因IO瓶颈导致程序性能低下的问题。

另外,很多网站被攻击都是因为服务器有写的权限,程序代码能被黑客修改,SAE禁止写操作,也提升了服务器的安全性。

所以SAE为了提升性能和安全,禁止本地IO写操作。开发者可以使用Storage,Memcache,KVDB等服务存储需写入的数据。

sae提供的一些上传文件的方法如下

public function upload() {
        if (!empty($_FILES)) {
            import("@.ORG.UploadFile");
            $config=array(
                'allowExts'=>array('jpg','gif','png','xlsx','xls'),
                'savePath'=>'./Public/upload/',
                'saveRule'=>'time',
            );
            $upload = new UploadFile($config);
            $upload->imageClassPath="@.ORG.Image";
            $upload->thumb=true;
            $upload->thumbMaxHeight=100;
            $upload->thumbMaxWidth=100;
            if (!$upload->upload()) {
                $this->error($upload->getErrorMsg());
            } else {
                $info = $upload->getUploadFileInfo();
                $this->assign('filename', $info[0]['savename']);
            }
        }
        $this->display();
    }
if (!empty($_FILES)) {
            import("@.ORG.UploadFile");
            $config=array(
                    'allowExts'=>array('xlsx','xls'),
                    'savePath'=>'./Public/upload/',
                    'saveRule'=>'time',
            );
            $upload = new UploadFile($config);
            if (!$upload->upload()) {
                $this->error($upload->getErrorMsg());
            } else {    
                ...
            }
            }

说明,基本与sae提供的示例方法一致,在else部分有我自己的业务逻辑,即如果相同则进行覆盖。

上传excel表格
在这里我尝试了很多种方法,最后选用了下面这种方法,这里要注意sae上传并读取文件的方法。注意使用前必须先下载php excel的库,如果使用thinkphp开发需放在extent的vendor目录下。

$s=new SaeStorage();
file_put_contents(SAE_TMP_PATH.'/upload.xlsx',$s->read('public','upload/'.$info[0]['savename']));
vendor('phpExcel.PHPExcel');
vendor("PHPExcel.PHPExcel.IOFactory");              $objPHPExcel=PHPExcel_IOFactory::load(SAE_TMP_PATH.'upload.xlsx');

思路就是使用saeStorage读取文件,存到sae_temp_path的临时路径下,再使用load方法将临时文件upload.xlsx获取到,就可以了

读取excel表格

上一步获得$objPHPExcel对象后,就变的和平常的web开发一样了,在这里介绍一些php excel读取时的常用函数,你可以使用循环读取的方法来获取表格中的数据

$objWorksheet = $objPHPExcel->getActiveSheet();//获取当前数据表对象
$highestColumn = $objWorksheet->getHighestColumn();//获取总列数(字符串)
$highestRow = $objWorksheet->getHighestRow();//获取总行数
$highestColumnIndex=PHPExcel_Cell::columnIndexFromString($highestColumn);//将总列数转换为数字
$value = $objWorksheet ->getCellByColumnAndRow($col,$row)->getValue();//获取单元格的值         

导出excel表格
导出excel依然和平常差不多,在这里继续介绍一些常用函数

$objPHPExcel->getProperties()->setCreator("sunzhiyu");//创建人          
$objPHPExcel->getProperties()->setLastModifiedBy("sunzhiyu");//最后修改人
$objPHPExcel->getProperties()->setTitle("php study");//标题
$objPHPExcel->getProperties()->setSubject("I love coding");//题目
$objPHPExcel->getProperties()->setDescription("I am a coder");//描述
$objPHPExcel->getProperties()->setKeywords("code");//关键字
$objPHPExcel->getProperties()->setCategory("excel file");//种类
$objPHPExcel->getActiveSheet()->mergeCells('A1:K1'); //合并单元格
$objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(22);//设置行高度,第一行高度为22
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(30);//设置列宽度,A列宽度为30
$objPHPExcel->getActiveSheet()->setCellValue('A1','编号');//设置内容
$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize('18');//设置字体大小
$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);//设置字体样式
$objPHPExcel->getActiveSheet()->getStyle(PHPExcel_Cell::stringFromColumnIndex(3).'2')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);//设置水平对齐方式
$objPHPExcel->getActiveSheet()->getStyle(PHPExcel_Cell::stringFromColumnIndex(3).'2')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);//设置垂直对齐方式
$objPHPExcel->getActiveSheet()->getStyle(PHPExcel_Cell::stringFromColumnIndex($i).'2')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);//设置边框
$objPHPExcel->getActiveSheet()->getStyle(PHPExcel_Cell::stringFromColumnIndex($i).'2')->getBorders()->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle(PHPExcel_Cell::stringFromColumnIndex($i).'2')->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle(PHPExcel_Cell::stringFromColumnIndex($i).'2')->getBorders()->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN); 
$objPHPExcel->getActiveSheet()->getStyle(PHPExcel_Cell::stringFromColumnIndex($i).'2')->getAlignment()->setWrapText(true);//设置单元格可换行
$objPHPExcel->getActiveSheet()->getStyle( 'A2:k2')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);$objPHPExcel->getActiveSheet()->getStyle( 'A2:k2')->getFill()->getStartColor()->setARGB('FF87CEFF');//设置背景填充
$objPHPExcel->getActiveSheet()->mergeCells(A1:K1);//合并单元格
$objPHPExcel->getActiveSheet()->setTitle('name');//设置sheet名称
$objPHPExcel->setActiveSheetIndex(0);//设置当前sheet

完成的下载流程如下,执行下列代码,即可下载excel表

    vendor("phpExcel.PHPExcel");
    $objPHPExcel = new PHPExcel();
    $objPHPExcel->getActiveSheet()->setTitle('name);//设置sheet名称
    $objPHPExcel->setActiveSheetIndex(0);//设置当前sheet
    $name = '下载好的表格';
    ob_end_clean();//清除缓冲区,避免乱码
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="'.$name.'.xls"');  //日期为文件名后缀
    header('Cache-Control: max-age=0');
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');  //excel5为xls格式,excel2007为xlsx格式
    $objWriter->save('php://output');

本期的介绍就到这里,希望大家一起享受编程的乐趣!

猜你喜欢

转载自blog.csdn.net/sunxiaoyu94/article/details/50161929
今日推荐