在之前有写过一篇文章讲述了使用PHP快速生成excel表格文件并下载,这种方式生成Excel文件,生成速度很快,但是有缺点是:
1.单纯的生成Excel文件,生成的文件没有样式,单元格属性(填充色,宽度,高度,边框颜色…)不能自定义;
2.生成的文件虽然可以打开,但是兼容性很差,每次打开,都会报一个警告:

今天使用一个第三方的SDK(PHPExcel)实现Excel文件的导入和导出。

准备工作:
1.下载PHPExcel的SDK,下载地址:https://github.com/PHPOffice/PHPExcel

2.将SDK解压之后的Class文件拷贝到自己的项目。

一.Excel文件读取

  1. function excelToArray(){
  2. require_once dirname(__FILE__) . \'/Lib/Classes/PHPExcel/IOFactory.php\';
  3. //加载excel文件
  4. $filename = dirname(__FILE__).\'/result.xlsx\';
  5. $objPHPExcelReader = PHPExcel_IOFactory::load($filename);
  6. $sheet = $objPHPExcelReader->getSheet(0); // 读取第一个工作表(编号从 0 开始)
  7. $highestRow = $sheet->getHighestRow(); // 取得总行数
  8. $highestColumn = $sheet->getHighestColumn(); // 取得总列数
  9. $arr = array(\'A\',\'B\',\'C\',\'D\',\'E\',\'F\',\'G\',\'H\',\'I\',\'J\',\'K\',\'L\',\'M\', \'N\',\'O\',\'P\',\'Q\',\'R\',\'S\',\'T\',\'U\',\'V\',\'W\',\'X\',\'Y\',\'Z\');
  10. // 一次读取一列
  11. $res_arr = array();
  12. for ($row = 2; $row <= $highestRow; $row++) {
  13. $row_arr = array();
  14. for ($column = 0; $arr[$column] != \'F\'; $column++) {
  15. $val = $sheet->getCellByColumnAndRow($column, $row)->getValue();
  16. $row_arr[] = $val;
  17. }
  18. $res_arr[] = $row_arr;
  19. }
  20. return $res_arr;
  21. }

或者:

  1. function excelToArray(){
  2. require_once dirname(__FILE__) . \'/Lib/Classes/PHPExcel/IOFactory.php\';
  3. //加载excel文件
  4. $filename = dirname(__FILE__).\'/result.xlsx\';
  5. $objPHPExcelReader = PHPExcel_IOFactory::load($filename);
  6. $reader = $objPHPExcelReader->getWorksheetIterator();
  7. //循环读取sheet
  8. foreach($reader as $sheet) {
  9. //读取表内容
  10. $content = $sheet->getRowIterator();
  11. //逐行处理
  12. $res_arr = array();
  13. foreach($content as $key => $items) {
  14. $rows = $items->getRowIndex(); //
  15. $columns = $items->getCellIterator(); //
  16. $row_arr = array();
  17. //确定从哪一行开始读取
  18. if($rows < 2){
  19. continue;
  20. }
  21. //逐列读取
  22. foreach($columns as $head => $cell) {
  23. //获取cell中数据
  24. $data = $cell->getValue();
  25. $row_arr[] = $data;
  26. }
  27. $res_arr[] = $row_arr;
  28. }
  29. }
  30. return $res_arr;
  31. }

两种方法均可将表格数据转化为数组,然后哦再进行相关的操作就简单了。

 

二.Excel文件导出

 

  1. /**
  2. * 创建(导出)Excel数据表格
  3. * @param array $list 要导出的数组格式的数据
  4. * @param string $filename 导出的Excel表格数据表的文件名
  5. * @param array $indexKey $list数组中与Excel表格表头$header中每个项目对应的字段的名字(key值)
  6. * @param array $startRow 第一条数据在Excel表格中起始行
  7. * @param [bool] $excel2007 是否生成Excel2007(.xlsx)以上兼容的数据表
  8. * 比如: $indexKey与$list数组对应关系如下:
  9. * $indexKey = array(\'id\',\'username\',\'sex\',\'age\');
  10. * $list = array(array(\'id\'=>1,\'username\'=>\'YQJ\',\'sex\'=>\'男\',\'age\'=>24));
  11. */
  12. function exportExcel($list,$filename,$indexKey,$startRow=1,$excel2007=false){
  13. //文件引入
  14. require_once APP_ROOT.\'/Api/excel/PHPExcel.php\';
  15. require_once APP_ROOT.\'/Api/excel/PHPExcel/Writer/Excel2007.php\';
  16. if(empty($filename)) $filename = time();
  17. if( !is_array($indexKey)) return false;
  18. $header_arr = array(\'A\',\'B\',\'C\',\'D\',\'E\',\'F\',\'G\',\'H\',\'I\',\'J\',\'K\',\'L\',\'M\', \'N\',\'O\',\'P\',\'Q\',\'R\',\'S\',\'T\',\'U\',\'V\',\'W\',\'X\',\'Y\',\'Z\');
  19. //初始化PHPExcel()
  20. $objPHPExcel = new PHPExcel();
  21. //设置保存版本格式
  22. if($excel2007){
  23. $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
  24. $filename = $filename.\'.xlsx\';
  25. }else{
  26. $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
  27. $filename = $filename.\'.xls\';
  28. }
  29. //接下来就是写数据到表格里面去
  30. $objActSheet = $objPHPExcel->getActiveSheet();
  31. //$startRow = 1;
  32. foreach ($list as $row) {
  33. foreach ($indexKey as $key => $value){
  34. //这里是设置单元格的内容
  35. $objActSheet->setCellValue($header_arr[$key].$startRow,$row[$value]);
  36. }
  37. $startRow++;
  38. }
  39. // 下载这个表格,在浏览器输出
  40. header("Pragma: public");
  41. header("Expires: 0");
  42. header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
  43. header("Content-Type:application/force-download");
  44. header("Content-Type:application/vnd.ms-execl");
  45. header("Content-Type:application/octet-stream");
  46. header("Content-Type:application/download");;
  47. header(\'Content-Disposition:attachment;filename=\'.$filename.\'\');
  48. header("Content-Transfer-Encoding:binary");
  49. $objWriter->save(\'php://output\');
  50. }

导出文件,还可以设置模板

  1. function exportExcel($list,$filename,$indexKey=array()){
  2. require_once dirname(__FILE__) . \'/Lib/Classes/PHPExcel/IOFactory.php\';
  3. require_once dirname(__FILE__) . \'/Lib/Classes/PHPExcel.php\';
  4. require_once dirname(__FILE__) . \'/Lib/Classes/PHPExcel/Writer/Excel2007.php\';
  5. $header_arr = array(\'A\',\'B\',\'C\',\'D\',\'E\',\'F\',\'G\',\'H\',\'I\',\'J\',\'K\',\'L\',\'M\', \'N\',\'O\',\'P\',\'Q\',\'R\',\'S\',\'T\',\'U\',\'V\',\'W\',\'X\',\'Y\',\'Z\');
  6. //$objPHPExcel = new PHPExcel(); //初始化PHPExcel(),不使用模板
  7. $template = dirname(__FILE__).\'/template.xls\'; //使用模板
  8. $objPHPExcel = PHPExcel_IOFactory::load($template); //加载excel文件,设置模板
  9. $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel); //设置保存版本格式
  10. //接下来就是写数据到表格里面去
  11. $objActSheet = $objPHPExcel->getActiveSheet();
  12. $objActSheet->setCellValue(\'A2\', "活动名称:江南极客");
  13. $objActSheet->setCellValue(\'C2\', "导出时间:".date(\'Y-m-d H:i:s\'));
  14. $i = 4;
  15. foreach ($list as $row) {
  16. foreach ($indexKey as $key => $value){
  17. //这里是设置单元格的内容
  18. $objActSheet->setCellValue($header_arr[$key].$i,$row[$value]);
  19. }
  20. $i++;
  21. }
  22. // 1.保存至本地Excel表格
  23. //$objWriter->save($filename.\'.xls\');
  24. // 2.接下来当然是下载这个表格了,在浏览器输出就好了
  25. header("Pragma: public");
  26. header("Expires: 0");
  27. header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
  28. header("Content-Type:application/force-download");
  29. header("Content-Type:application/vnd.ms-execl");
  30. header("Content-Type:application/octet-stream");
  31. header("Content-Type:application/download");;
  32. header(\'Content-Disposition:attachment;filename="\'.$filename.\'.xls"\');
  33. header("Content-Transfer-Encoding:binary");
  34. $objWriter->save(\'php://output\');
  35. }

先弄一个excel模板

然后使用该模板导出数据

除此之外还可以对表格属性做很多自定义。感兴趣的自己看看吧!

 

转: https://blog.csdn.net/a8240357/article/details/80758222

 

版权声明:本文为fps2tao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/fps2tao/p/10723109.html