PHPexcel读取和写入操作

首页 编程分享 PHP丨JAVA丨OTHER 正文

袅袅牧童 原创 编程分享 2017-07-10 15:51:15

简介 总结下PHPEXCEL 常见的读取和写入数据的样例



读取:

<?php  
  1. /** 
  2.  * Created by PhpStorm. 
  3.  * User: Administrator 
  4.  * Date: 2017/4/11 
  5.  * Time: 15:15 
  6.  */  
  7. header("Content-Type:text/html;charset=utf-8");  
  8. include_once('../../ClassLibrary/PHPExcel-1.8/Classes/PHPExcel.php');  
  9.   
  10. error_reporting(E_ALL);  
  11. ini_set('display_errors', TRUE);  
  12. ini_set('display_startup_errors', TRUE);  
  13. //date_default_timezone_set('Europe/London');  
  14.   
  15.   
  16. $PHPExcel=new PHPExcel();  
  17. $filename = 'test.xlsx';  
  18. //如果excel文件后缀名为.xls,导入这个类  

  1. $exts = strtolower( pathinfo($filename, PATHINFO_EXTENSION) );

  1. if($exts == 'xls'){  
  2.     include_once('../../ClassLibrary/PHPExcel-1.8/Classes/PHPExcel/Reader/Excel5.php');  
  3.     $PHPReader=new \PHPExcel_Reader_Excel5();  
  4. }else if($exts == 'xlsx'){  
  5.     include_once('../../ClassLibrary/PHPExcel-1.8/Classes/PHPExcel/Reader/Excel2007.php');  
  6.     $PHPReader=new \PHPExcel_Reader_Excel2007();  
  7. }  
  8. //载入文件  
  9. $PHPExcel=$PHPReader->load($filename);  
  10. //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推  
  11.   
  12. $currentSheet=$PHPExcel->getSheet(0);  
  13. //获取总列数  
  14. $allColumn=$currentSheet->getHighestColumn();  
  15. //获取总行数  
  16. $allRow=$currentSheet->getHighestRow();  
  17. //循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始  
  18. for($currentRow=1;$currentRow<=$allRow;$currentRow++){  
  19.     //从哪列开始,A表示第一列  
  20.     for($currentColumn='A';$currentColumn<=$allColumn;$currentColumn++){  
  21.         //数据坐标  
  22.         $address=$currentColumn.$currentRow;  
  23.         //读取到的数据,保存到数组$arr中  
  24.         $data[$currentRow][$currentColumn]=$currentSheet->getCell($address)->getValue();  
  25.     }  
  26. }  
  27. echo "<pre>";  
  28. var_dump($data);  
  29. echo "</pre>";  


导出:

<?php  
  1. /**  
  2.  * Created by PhpStorm.  
  3.  * User: Administrator  
  4.  * Date: 2017/4/11  
  5.  * Time: 15:46  
  6.  */  
  7.   
  8. header("Content-Type:text/html;charset=utf-8");  
  9. include_once('../../ClassLibrary/PHPExcel-1.8/Classes/PHPExcel.php');  
  10.   
  11. error_reporting(E_ALL);  
  12. ini_set('display_errors', TRUE);  
  13. ini_set('display_startup_errors', TRUE);  
  14.   
  15. //创建对象  
  16. $excel = new PHPExcel();  
  17. //Excel表格式,这里简略写了8列  
  18. $letter = array('A','B','C','D','E','F','F','G');  
  19. //表头数组  
  20. $tableheader = array('学号','姓名','性别','年龄','班级');  
  21. //填充表头信息  
  22. for($i = 0;$i < count($tableheader);$i++) {  
  23.     $excel->getActiveSheet()->setCellValue("$letter[$i]1","$tableheader[$i]");  
  24. }  
  25.   
  26. //表格数组  
  27. $data = array(  
  28.     array('1','小王','男','20','100'),  
  29.     array('2','小李','男','20','101'),  
  30.     array('3','小张','女','20','102'),  
  31.     array('4','小赵','女','20','103')  
  32. );  
  33. //填充表格信息  
  34. for ($i = 2;$i <= count($data) + 1;$i++) {  
  35.     $j = 0;  
  36.     foreach ($data[$i - 2] as $key=>$value) {  
  37.         $excel->getActiveSheet()->setCellValue("$letter[$j]$i","$value");  
  38.         $j++;  
  39.     }  
  40. }  
  41.   
  42. //创建Excel输入对象  
  43. $write = new PHPExcel_Writer_Excel5($excel);  
  44. header("Pragma: public");  
  45. header("Expires: 0");  
  46. header("Cache-Control:must-revalidate, post-check=0pre-check=0");  
  47. header("Content-Type:application/force-download");  
  48. header("Content-Type:application/vnd.ms-execl");  
  49. header("Content-Type:application/octet-stream");  
  50. header("Content-Type:application/download");;  
  51. header('Content-Disposition:attachment;filename="testdata.xls"');  
  52. header("Content-Transfer-Encoding:binary");  

  1. $write->save('php://output');  


官方文档样例:

  1. 1.使用 PHPExcel_IOFactory 读取文件  

  1.     $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);          
  2. 2.使用一个特定的读取类,读取文件  
  3.     $objReader = new PHPExcel_Reader_Excel5();                    
  4.     objPHPExcel = $objReader->load($inputFileName);  
  5. 3.使用 PHPExcel_IOFactory 创建一个特定的读取类  
  6.     $objReader = PHPExcel_IOFactory::createReader($inputFileType);    
  7.     $objPHPExcel = $objReader->load($inputFileName);  
  8.     读取类型有:  
  9.         $inputFileType = 'Excel5';  
  10.         $inputFileType = 'Excel2007';  
  11.         $inputFileType = 'Excel2003XML';  
  12.         $inputFileType = 'OOCalc';  
  13.         $inputFileType = 'SYLK';  
  14.         $inputFileType = 'Gnumeric';  
  15.         $inputFileType = 'CSV';  
  16.   
  17.   
  18. 4.使用 PHPExcel_IOFactory 来鉴别文件应该使用哪一个读取类  
  19.     $inputFileType = PHPExcel_IOFactory::identify($inputFileName);  
  20.     $objReader = PHPExcel_IOFactory::createReader($inputFileType);  
  21.     $objPHPExcel = $objReader->load($inputFileName);  
  22. 5.只读去数据,忽略里面各种格式等(对于Excel读去,有很大优化)  
  23.     $objReader = PHPExcel_IOFactory::createReader($inputFileType);  
  24.     $objReader->setReadDataOnly(true);  
  25.     $objPHPExcel = $objReader->load($inputFileName);  
  26. 6.加载Excel所有的工作表  
  27.     $objReader = PHPExcel_IOFactory::createReader($inputFileType);  
  28.     $objReader->setLoadAllSheets();      // 加载所有的工作表  
  29.     $objPHPExcel = $objReader->load($inputFileName);  
  30.     $objPHPExcel->getSheetCount();       // 获取工作表的个数  
  31.     $objPHPExcel->getSheetNames();       // 获取所有工作表的名字数组  
  32. 7.加载单个的命名的工作表  
  33.     $sheetname = 'Data Sheet Id2';       // 单个工作表,传入字符串  
  34.     $objReader = PHPExcel_IOFactory::createReader($inputFileType);  
  35.     $objReader->setLoadSheetsOnly($sheetname);       // 加载单个工作表,传入工作表名字(例如:'Data Sheet Id2')  
  36.     $objPHPExcel = $objReader->load($inputFileName);  
  37. 8.加载多个命名的工作表  
  38.     $sheetnames = array('Data Sheet Id1', 'Data Sheet Id2');      // 多个工作表,传入数组  
  39.     $objReader = PHPExcel_IOFactory::createReader($inputFileType);  
  40.     $objReader->setLoadSheetsOnly($sheetnames);      // 加载多个工作表,传入工作表名字数组  
  41.     $objPHPExcel = $objReader->load($inputFileName);  
  42. 9.自定义一个读去过滤器  
  43.     class MyReadFilter implements PHPExcel_Reader_IReadFilter  
  44.     {  
  45.         public function readCell($column, $row, $worksheetName = '') {  
  46.   
  47.   
  48.             // 只读去1-7行&A-E列中的单元格  
  49.             if ($row >= 1 && $row <= 7) {  
  50.                 if (in_array($column,range('A','E'))) {  
  51.                     return true;  
  52.                 }  
  53.             }  
  54.             return false;  
  55.         }  
  56.     }  
  57.     $filterSubset = new MyReadFilter();  
  58.     $objReader = PHPExcel_IOFactory::createReader($inputFileType);  
  59.     $objReader->setReadFilter($filterSubset);        // 设置实例化的过滤器对象  
  60.     $objPHPExcel = $objReader->load($inputFileName);  
  61. 10.同样是自定义一个读去过滤器,但可配置读去的行和列范围  
  62.     class MyReadFilter implements PHPExcel_Reader_IReadFilter  
  63.     {  
  64.         private $_startRow = 0;     // 开始行  
  65.         private $_endRow = 0;       // 结束行  
  66.         private $_columns = array();    // 列跨度  
  67.         public function __construct($startRow, $endRow, $columns) {  
  68.             $this->_startRow = $startRow;  
  69.             $this->_endRow       = $endRow;  
  70.             $this->_columns      = $columns;  
  71.         }  
  72.         public function readCell($column, $row, $worksheetName = '') {  
  73.             if ($row >= $this->_startRow && $row <= $this->_endRow) {  
  74.                 if (in_array($column,$this->_columns)) {  
  75.                     return true;  
  76.                 }  
  77.             }  
  78.             return false;  
  79.         }  
  80.     }  
  81.     $filterSubset = new MyReadFilter(9,15,range('G','K'));  
  82.     $objReader = PHPExcel_IOFactory::createReader($inputFileType);  
  83.     $objReader->setReadFilter($filterSubset);        // 设置实例化的过滤器对象  
  84.     $objPHPExcel = $objReader->load($inputFileName);  
  85. 11.分块读取Excel,原理还是:自定义读取过滤器  
  86.     class chunkReadFilter implements PHPExcel_Reader_IReadFilter  
  87.     {  
  88.         private $_startRow = 0;     // 开始行  
  89.         private $_endRow = 0;       // 结束行  
  90.         public function __construct($startRow, $chunkSize) {    // 我们需要传递:开始行号&行跨度(来计算结束行号)  
  91.             $this->_startRow = $startRow;  
  92.             $this->_endRow       = $startRow + $chunkSize;  
  93.         }  
  94.         public function readCell($column, $row, $worksheetName = '') {  
  95.             if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {  
  96.                 return true;  
  97.             }  
  98.             return false;  
  99.         }  
  100.     }  
  101.     $objReader = PHPExcel_IOFactory::createReader($inputFileType);  
  102.     $chunkSize = 20;    // 定义每块读去的行数  
  103.   
  104.   
  105.     // 就可在一个循环中,多次读去块,而不用一次性将整个Excel表读入到内存中  
  106.     for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) {  
  107.         $chunkFilter = new chunkReadFilter($startRow, $chunkSize);  
  108.         $objReader->setReadFilter($chunkFilter); // 设置实例化的过滤器对象  
  109.         $objPHPExcel = $objReader->load($inputFileName);  
  110.         // 开始读取每行数据,并插入到数据库  
  111.     }  
  112. 12.分块读取Excel的第2个版本  
  113.     class chunkReadFilter implements PHPExcel_Reader_IReadFilter  
  114.     {  
  115.         private $_startRow = 0;     // 开始行  
  116.         private $_endRow = 0;       // 结束行  
  117.   
  118.   
  119.         // 定义了一个读去指定范围行的方法  
  120.         public function setRows($startRow, $chunkSize) {  
  121.             $this->_startRow = $startRow;  
  122.             $this->_endRow       = $startRow + $chunkSize;  
  123.         }  
  124.         public function readCell($column, $row, $worksheetName = '') {  
  125.             if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {  
  126.                 return true;  
  127.             }  
  128.             return false;  
  129.         }  
  130.     }  
  131.     $objReader = PHPExcel_IOFactory::createReader($inputFileType);  
  132.     $chunkSize = 20;    // 定义每块读去的行数  
  133.   
  134.   
  135.     // 在循环外部,实例化过滤器类,而不用循环内每次实例化(应该更优化)  
  136.     $chunkFilter = new chunkReadFilter();  
  137.     $objReader->setReadFilter($chunkFilter);  
  138.     for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) {  
  139.   
  140.   
  141.         // 循环内部,使用实例化的对象的方法,来调整读取的行范围即可  
  142.         $chunkFilter->setRows($startRow,$chunkSize);  
  143.         $objPHPExcel = $objReader->load($inputFileName);  
  144.     }  
  145. 13.读取多个CSV文件  
  146.     $inputFileNames = array('./sampleData/example1.csv','./sampleData/example2.csv');   // CSV文件数组  
  147.     $objReader = PHPExcel_IOFactory::createReader($inputFileType);  
  148.   
  149.   
  150.     /*  
  151.         说明下面是干啥的:  
  152.             1.先载入第一个CSV作为第一个工作表 | 设置工作表的标题  
  153.             2.依次将多个CSV再入到 objPHPExcel 对象中,依次追加到第N个工作表 | 设置工作表的标题  
  154.             3.获取Excel此时所有的标题,通过标题来依次获取工作表,然后对工作表进行操作!  
  155.      */  
  156.     $inputFileName = array_shift($inputFileNames);      // 第一个CSV文件  
  157.     $objPHPExcel = $objReader->load($inputFileName); // 读取第一个CSV文件  
  158.     $objPHPExcel->getActiveSheet()->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME)); // 设置标题  
  159.     foreach($inputFileNames as $sheet => $inputFileName) {  
  160.         $objReader->setSheetIndex($sheet+1); // 将工作表切换到下个工作表  
  161.         $objReader->loadIntoExisting($inputFileName,$objPHPExcel);       // 将下一个CSV文件,载入到已存在的PHPExcel对象中  
  162.         $objPHPExcel->getActiveSheet()->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME));     // 设置当前工作表的标题  
  163.     }  
  164.   
  165.   
  166.     // 循环所有的工作表名称  
  167.     $loadedSheetNames = $objPHPExcel->getSheetNames();  
  168.     foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {  
  169.         $objPHPExcel->setActiveSheetIndexByName($loadedSheetName);       // 通过 '工作表名称' 来设置当前工作表为激活状态  
  170.         // 接着对当前激活的工作表,进行读取、数据库写入  
  171.     }  
  172. 14.将一个大的CSV文件,按 '块' 分成多个工作表(结合了12&13的示例)  
  173.     class chunkReadFilter implements PHPExcel_Reader_IReadFilter  
  174.     {  
  175.         private $_startRow = 0;     // 开始行  
  176.         private $_endRow = 0;       // 结束行  
  177.   
  178.   
  179.         // 定义了一个读去指定范围行的方法  
  180.         public function setRows($startRow, $chunkSize) {  
  181.             $this->_startRow = $startRow;  
  182.             $this->_endRow       = $startRow + $chunkSize;  
  183.         }  
  184.         public function readCell($column, $row, $worksheetName = '') {  
  185.             if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {  
  186.                 return true;  
  187.             }  
  188.             return false;  
  189.         }  
  190.     }  
  191.     $objReader = PHPExcel_IOFactory::createReader($inputFileType);  
  192.     $chunkSize = 100;   // 定义每块读去的行数  
  193.   
  194.   
  195.     // 在循环外部,实例化过滤器类,而不用循环内每次实例化(应该更优化)  
  196.     $chunkFilter = new chunkReadFilter();  
  197.     $objReader->setReadFilter($chunkFilter)  
  198.               ->setContiguous(true);     // 这里出现了一个没见过的方法(先放着,忘记是干啥的了)  
  199.   
  200.   
  201.     $objPHPExcel = new PHPExcel();  
  202.     $sheet = 0;     // 第一个工作表下标  
  203.     for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) {  
  204.         $chunkFilter->setRows($startRow,$chunkSize);  
  205.         $objReader->setSheetIndex($sheet);       // 切换工作表  
  206.         $objReader->loadIntoExisting($inputFileName,$objPHPExcel);       // 将读取到的CSV块,载入到工作表  
  207.         $objPHPExcel->getActiveSheet()->setTitle('Country Data Id'.(++$sheet));        // 设置工作表标题  
  208.     }  
  209.   
  210.   
  211.     // 循环所有的工作表名称  
  212.     $loadedSheetNames = $objPHPExcel->getSheetNames();  
  213.     foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {  
  214.         $objPHPExcel->setActiveSheetIndexByName($loadedSheetName);       // 通过 '工作表名称' 来设置当前工作表为激活状态  
  215.         // 接着对当前激活的工作表,进行读取、数据库写入  
  216.     }  
  217.   
  218.   
  219. 15.使用 'Advanced Value Binder' 读取通过 'tab' 分隔值的文件  
  220.     PHPExcel_Cell::setValueBinder( new PHPExcel_Cell_AdvancedValueBinder() );       // 设置单元格  
  221.     $objReader = PHPExcel_IOFactory::createReader($inputFileType);  
  222.     $objReader->setDelimiter("\t");      // 设置分隔符为 '\t'(tab分隔)  
  223.     $objPHPExcel = $objReader->load($inputFileName);  
  224.     $objPHPExcel->getActiveSheet()->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME)); // 设置标题  
  225.     $loadedSheetNames = $objPHPExcel->getSheetNames();       // 获取所有工作表名称  
  226.   
  227.   
  228.     1)格式化输出  
  229.     foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {  
  230.         $objPHPExcel->setActiveSheetIndexByName($loadedSheetName);  
  231.         $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);    // 注意4个参数的区别  
  232.     }  
  233.     2)未格式化输出  
  234.     foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {  
  235.         $objPHPExcel->setActiveSheetIndexByName($loadedSheetName);  
  236.         $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,false,true);   // 注意4个参数的区别  
  237.     }  
  238.     3)单元格原生值  
  239.     foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {  
  240.         $objPHPExcel->setActiveSheetIndexByName($loadedSheetName);  
  241.         $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,false,false,true);  // 注意4个参数的区别  
  242.     }  
  243. 16.使用 'try/catch' 控制Excel加载时的异常  
  244.     try {  
  245.         $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);  
  246.     } catch(PHPExcel_Reader_Exception $e) {  
  247.         die('Error loading file "'.pathinfo($inputFileName,PATHINFO_BASENAME).'": '.$e->getMessage());  
  248.     }  
  249. 17.获取Excel的工作表名称列表  
  250.     $objReader = PHPExcel_IOFactory::createReader($inputFileType);  
  251.     $worksheetNames = $objReader->listWorksheetNames($inputFileName);        // 列出工作表名称  
  252.     foreach($worksheetNames as $worksheetName) {  
  253.         echo $worksheetName,'<br />';  
  254.     }  
  255. 18.不加载整个文件,或者Excel的工作表名称列表  
  256.     $objReader = PHPExcel_IOFactory::createReader($inputFileType);  
  257.     $worksheetData = $objReader->listWorksheetInfo($inputFileName);          // 列出工作表列表  
  258.     foreach ($worksheetData as $worksheet) {  
  259.         echo '<li>', $worksheet['worksheetName'], '<br />';  
  260.         echo 'Rows: ', $worksheet['totalRows'], ' Columns: ', $worksheet['totalColumns'], '<br />';  
  261.         echo 'Cell Range: A1:', $worksheet['lastColumnLetter'], $worksheet['totalRows'];  
  262.         echo '</li>';  
  263.     }  
  264. 19.全程,有一个方法:  
  265.     $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,false,false,true);  
  266.     getActiveSheet() - 获取当前激活的工作表  
  267.     toArray() - 将当前激活的工作表,解析全部放入数组中  

Tags:


本篇评论 —— 揽流光,涤眉霜,清露烈酒一口话苍茫。


    声明:参照站内规则,不文明言论将会删除,谢谢合作。


      最新评论




ABOUT ME

Blogger:袅袅牧童 | Arkin

Ido:PHP攻城狮

WeChat:nnmutong

Email:nnmutong@icloud.com

标签云