phpexcel 一些基本设置总结

编辑

 

phpexcel 网页可能暂时无法连接,或者它已永久性地移动到了新网址 ERR_INVALID_RESPONSE 

php 相关的设置以及各种报错问题 

 

使用fromArray填充数据

fromArray定义在 C:\wamp\www\email_notice_qpy\Include\Library\Vendor\PHPExcel\PHPExcel\Worksheet.php中

如果想要修改起始单元格位置,可以使用startCell参数,注意,实参要跟形参一一对应

 下载excel时不想要刷新页面

function httpPost(URL, PARAMS, target="") {
    var temp = document.createElement("form");
    temp.action = URL;
    temp.target = target;
//   temp.target = "_blank";
    temp.method = "post";
    temp.style.display = "none";

    for (var x in PARAMS) {
        var opt = document.createElement("textarea");
        opt.name = PARAMS[x]['name'];
        opt.value = PARAMS[x]['value'];
        temp.appendChild(opt);
    }

    document.body.appendChild(temp);
    temp.submit();
    return temp;
}
    

function export_data(){
    if(!$("#s_product_id").val()){
        alert("Product can't be null!");
        return false;
    }
    url = "{:U('Admin/Ppa/export_excel/')}";
    conversion_data=$("#convart_data_form_id").serializeArray();
    httpPost(url, conversion_data, target="")
}

 

 读取excel

<?php
namespace Admin\Controller;
use Think\Controller;
class EngageController extends Controller {
    public function read_excel(){
        header("Content-type: text/html; charset=utf-8");
        
        // ob_clean();
        // ob_start();
        // set_time_limit(1000000);
        // ini_set('memory_limit','-1');
        set_time_limit(0);//设置不超时
        @ini_set('memory_limit', '512M');//设置PHP能使用的内存大小

        
        /** PHPExcel_IOFactory */
        vendor('PHPExcel.PHPExcel','','.php');
        vendor('PHPExcel.PHPExcel.IOFactory','','.php');
        // require_once './PHPExcel/IOFactory.php';
        
        $filename = './Uploads/VPU_PPA_model.xlsx';
        // Check prerequisites
        if (!file_exists($filename)) {
            exit("not found $filename.\n");
        }
         
        $reader = \PHPExcel_IOFactory::createReader('Excel2007'); //设置以Excel5格式(Excel97-2003工作簿)
        $PHPExcel = $reader->load($filename); // 载入excel文件
        echo "sheetCount: ".$PHPExcel->getSheetCount();
        
        $sheet = $PHPExcel->getSheet(0); // 读取第一個工作表
        $highestRow = $sheet->getHighestRow(); // 取得总行数
        $highestColumm = $sheet->getHighestColumn(); // 取得总列数
        $str = '';
        $str .= '<table border="1" cellspacing="0" bordercolor="#eeeeee" cellpadding="5" width="100%">';
        
        //按照excel表格格式输出A-Z列
        $str .= '<tr>';
            $str .= '<td></td>';
        for($column = 'A'; $column <= $highestColumm; $column++){
            $str .= '<td>' .$column. '</td>';
        }
        $str .= '</tr>';

        //按照excel表格的格式从1开始累计
        for ($row = 1; $row <= $highestRow; $row++){//行数是以第1行开始  
            $str .= '<tr>';
                $str .= '<td>' .$row. '</td>';
                //输出excel表格的内容
                for($column = 'A'; $column <= $highestColumm; $column++){
                    $str .= '<td>' .$sheet->getCell($column.$row)->getValue(). '</td>';
                }
            $str .= '</tr>';
        }
        $str .= '<table>';
        echo $str;
    }
}
?>
View Code

 

 

1.实例化

$objPHPExcel = new PHPExcel();  //实例化PHPExcel类库,相当于新建一个Excel表
$objSheet = $objPHPExcel->getActiveSheet();  //获取当前活动sheet
$objSheet->setTitle('sheet的名字');  //给当前的活动sheet起个名称

 3.页面设置

//设置打印 页面 方向与大小(此为横向)
$objSheet->getStyle('A6:G6')->applyFromArray($styleThinBlackBorderOutline);    
//方向
$objSheet->getPageSetup()->setOrientation(\PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE); 
//大小
$objSheet->getPageSetup()->setPaperSize(\PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4);

 

 

2.单元格相关

$objSheet->setCellValue('A1','XXXXXX');  //设置单元格的值
$objPHPExcel->getActiveSheet()->setCellValue('C9', "=SUM(A9:B9)");
$objSheet->getStyle('A1')->getFont()->setName('宋体')->setSize(16)->setBold(true);  //设置单元格的字体,字体大小,是否加粗
$objSheet->mergeCells('A1:G1');  //合并单元格
$objSheet->unmergeCells('A1:H1');  //拆分单元格
$objSheet->setCellValue('A1',"咨询有限公司\n联系人:王小姐\nTEL:8888888\n");  //单元格内容自动根据要求换行,必须要用双引号
$objSheet->getStyle('A1')->getAlignment()->setWrapText(true);  //长度不够显示的时候 是否自动换行
$objSheet->getStyle('B')->getAlignment()->setWrapText(true);   //长度不够显示的时候 是否自动换行
$objSheet->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);   //水平居中
$objSheet->getStyle('A1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);   //垂直居中
$objSheet->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);  //向右居中
$objSheet->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY);  //向左居中
$objSheet->getStyle('A6:G6')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FF808080');  
//设置单元格背景颜色 $styleThinBlackBorderOutline = array( //设置单元格边框   'borders' => array(     'allborders' => array( //设置全部边框     'style' => \PHPExcel_Style_Border::BORDER_THIN, //粗的是thick,BORDER_THIN,BORDER_MEDIUM和BORDER_THICK。     'color' => array ('argb' => '000000'),     ),   ), ); $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setVisible(false); // 隐藏D列

1)设置单元格宽与高

$objPHPExcel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(20);  #设置单元格默认行高
$objPHPExcel->getActiveSheet()->getRowDimension('9')->setRowHeight(20);      #设置行高
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(20);       #设置单元格宽度
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);       #设置单元格自适应宽度
$objSheet->getDefaultStyle()->getAlignment()->setWrapText(true);   //长度不够显示的时候 是否自动换行

2)设置不同的数据

$objPHPExcel->getActiveSheet()->getCell('C2')->setValueExplicit('861391327543258', PHPExcel_Cell_DataType::TYPE_NUMERIC);  

// 日期
$objPHPExcel->getActiveSheet()->setCellValue('G2', '2008-12-31');   
$objPHPExcel->getActiveSheet()->getStyle('G2')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);
// 时间戳
$time = gmmktime(0,0,0,12,31,2008); // int(1230681600)
$objPHPExcel->getActiveSheet()->setCellValue('G3', PHPExcel_Shared_Date::PHPToExcel($time));
$objPHPExcel->getActiveSheet()->getStyle('G3')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);
// url
$objPHPExcel->getActiveSheet()->setCellValue('G11', 'blog.c1gstudio.com');
$objPHPExcel->getActiveSheet()->getCell('G11')->getHyperlink()->setUrl('http://blog.c1gstudio.com');
// 另一个sheet
$objPHPExcel->getActiveSheet()->setCellValue('G12', 'sheetb');
$objPHPExcel->getActiveSheet()->getCell('G12')->getHyperlink()->setUrl("sheet://'sheetb'!A1");

添加图片

3)设置行的折叠与展开

//后续再研究
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setOutlineLevel(1);
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setVisible(false);
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setOutlineLevel(1);
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setVisible(false);
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setCollapsed(true);

4)整体填充数据

         

 

 

4 phpexcel设置所有单元格为默认的水平垂直居中

$objPHPExcel->getDefaultStyle()->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$objPHPExcel->getDefaultStyle()->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);

5 phpexcel 设置excel单元格宽高

$objPHPExcel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(20);  #设置单元格行高
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(20);       #设置单元格宽度
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);       #设置单元格自适应宽度

 

6.冻结标题、固定某一行

//第一种方式
$objSheet->freezePane('A1');
$objSheet->freezePane('A2');
//第二种方式
$objSheet->freezePaneByColumnAndRow(8,4);
//(列,行)冻结的行数比你设置的要多一行(例 我需要设置的 是 3行 那么 参数就要写 4)

 

7.添加批注

参考:https://blog.csdn.net/PhperX/article/details/109742316

//下面的两种写法都可以,E1与A2代表excel的表格位置。
$objPHPExcel->getActiveSheet()->getComment('A1') ->getText()->createTextRun('批注内容');
$objPHPExcel->setActiveSheetIndex(0)->getComment( 'A2')->getText()->createTextRun('批注内容' );
//重点来了:
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
//createWriter()的第二个参数必须是 Excel2007 才可以,Excel5不支持。

导出后的带批注excel文件:

 

8.保护工作表

// 保护工作表
$objPHPExcel->getActiveSheet()->getProtection()->setPassword('PHPExcel');
$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true);
$objPHPExcel->getActiveSheet()->getProtection()->setSort(true);
$objPHPExcel->getActiveSheet()->getProtection()->setInsertRows(true);
$objPHPExcel->getActiveSheet()->getProtection()->setFormatCells(true);

 9.php7环境下使用PHPExcel导出表格报错:网页可能暂时无法连接,或者它已永久性地移动到了新网址

解决方法:

把 \PHPExcel\Calculation\Functions.php 第574行的break注释掉

10.PHPExcel报错:'break' not in the 'loop' or 'switch' context

ThinkPHP\Library\Vendor\phpexcel\PHPExcel\Calculation  LINE: 581

直接删除581行的 'break'即可!

 

11.PHPExcel exception: “Could not close zip file … ”报错

 报错原因: 

1.确认保存文件的目录是否存在,有没有写错。

2.权限问题。缺少对于保存的目录的写权限。

3.文件被其他应用程序占用。

4.保存的文件名如果有中文的话注意编码问题。

5.磁盘容量满了。

6.如果保存为xlsx的格式无法成功的话,可以尝试保存成xls格式。

 

12.导出excel文件后打不开,提示“文件格式或文件扩展名无效,请确定文件未损坏,并且文件扩展名与文件的格式匹配”

来自:https://www.cnblogs.com/imustun/p/9156851.html

原因:

1.发送header()头之前,不知道又啥特殊字符输出(可能是BOM,也可能是其他),导致php报错!然后将报错内容输出到了Excel
2.极大可能是:文件BOM头问题,生成的Excel文件头部添加了BOM头!

解决方案:

1.在输出Excel前,缓冲区中处理BOM头(可能是其他字符)

ob_end_clean();

ob_start();

在header()函数调用之前,清楚之前的错误输出!

参考:https://blog.csdn.net/liu857279611/article/details/51534450

  • ob_get_contents() --- 返回输出缓冲区的内容
  • ob_flush() --- 冲刷出(送出)输出缓冲区中的内容
  • ob_clean() --- 清空(擦掉)输出缓冲区
  • ob_end_flush() --- 冲刷出(送出)输出缓冲区内容并关闭缓冲
  • ob_end_clean() --- 清空(擦除)缓冲区并关闭输出缓冲
  • flush() --- 刷新输出缓冲    

通常是ob_flush();flush()同时一起使用
使用ob_start()把输出那同输出到缓冲区,而不是到浏览器。然后用ob_get_contents得到缓冲区的数据。

ob_start()在服务器打开一个缓冲区来保存所有的输出。所以在任何时候使用echo ,输出都将被加入缓冲区中,直到程序运行结束或者使用ob_flush()来结束。然后在服务器中缓冲区的内容才会发送到浏览器,由浏览器来解析显示。

函数ob_end_clean 会清除缓冲区的内容,并将缓冲区关闭,但不会输出内容。
此时得用一个函数ob_get_contents()在ob_end_clean()前面来获得缓冲区的内容。
这样的话, 能将在执行ob_end_clean()前把内容保存到一个变量中,然后在ob_end_clean()后面对这个变量做操作。

 

2.有人第一步过后,问题未解决。通过ob_get_contents()查看导出内容,并未发现BOM头。

再就是应用了框架,返回的静态页输出成了excel文件。

试了以上方法后,还是没有问题,最后查看导出的文件内容,意识到是跳转到静态页导致的。

加上 exit($contents); 后问题解决。

 

13.php 文件下载 出现下载文件内容乱码损坏的解决方法

参考:https://www.jb51.net/article/97441.htm

public function download(){
  $upload=M('upload');
  $data=$upload->find($_GET['id']);
 
  if(empty($data)){
      header('HTTP/1.0 404 Not Found');
      header('Location: .');
  }else{
      $path='./public/Uploads/'.$data['savename'];
      header("Content-Type:".$data['type']);
      header('Content-Disposition: attachment; filename="'.$data['name'].'"');
      header('Content-Length:'.$data['size']);
      ob_clean();
      flush();
      readfile($path);
  }
}

ob_clean();
flush();这个是关键。用了这两函数,图片正常打开,文字也不乱码。

14.Class 'ZipArchive' not found

1)查看php是否安装了zip拓展   php -m

2)安装zip模块    sudo apt-get install php7.0-zip (可以先查看php版本)

 

phpexcel 合并单元格后的动态行高

思路参考:https://www.it1352.com/1745868.html,如下所示:

You can also do it like this

  1. Merge cells you want, for example: A7:C7
  2. Copy context of it to one cell for instance Z7
  3. Set the width of the merged cells to Z7
  4. Apply Wrap Text to the Z7
  5. Make Z7 not visible

脚本实现:

$objActSheet->getColumnDimension('A')->setWidth(26);
        for($i=1;$i<14;$i++){
            $objActSheet->getColumnDimension($col_name[$i])->setWidth(17);
        }
        $objActSheet->getColumnDimension('Z')->setWidth(43);
        $objActSheet->getStyle('A:Z')->getAlignment()->setWrapText(true); //Adaptive line feed
......
$objActSheet->setCellValue('Z'.$current_row,$val);
$objActSheet->getColumnDimension('Z')->setVisible(false);
......

 

 

PHPExcel 如何只获取 1 个单元格值

$objPHPExcel->getActiveSheet()->getCell('B8')->getValue();
// Get cell B8
$objPHPExcel->getActiveSheet()->getCellByColumnAndRow(1, 8)->getValue();
// Get cell B8
$objPHPExcel->getActiveSheet()->getCellByColumnAndRow(1, 8)->getCalculatedValue();
 
   
   
   
   
   
   

 

 

 

 

参考:https://blog.csdn.net/zyj_15067066062/article/details/81485781

https://blog.csdn.net/lampsunny/article/details/79012173

posted @ 2023-01-30 13:41  声声慢43  阅读(193)  评论(0编辑  收藏  举报