首页 > 编程技术 > php

php中使用PHPExcel操作excel(xls)文件

发布时间:2016-11-25 15:39

PHPExcel是php的一个插件,它可以实现读取excel文件也就是xls文件了,下面我们就来看一个PHPExcel操作excel(xls)文件例子,希望能帮助到各位。

读取中文的xls、csv文件会有问题,网上找了下资料,发现PHPExcel类库好用,官网地址:http://phpexcel.codeplex.com/

1、读取xls文件内容

 代码如下 复制代码

<?php
    //向xls文件写入内容
    error_reporting(E_ALL);
    ini_set('display_errors', TRUE);   
    include 'Classes/PHPExcel.php';           
    include 'Classes/PHPExcel/IOFactory.php'; 
    //$data:xls文件内容正文
    //$title:xls文件内容标题
    //$filename:导出的文件名
    //$data和$title必须为utf-8码,否则会写入FALSE值
    function write_xls($data=array(), $title=array(), $filename='report'){
        $objPHPExcel = new PHPExcel();
        //设置文档属性,设置中文会产生乱码,待完善...
        // $objPHPExcel->getProperties()->setCreator("云舒")
                             // ->setLastModifiedBy("云舒")
                             // ->setTitle("产品URL导出")
                             // ->setSubject("产品URL导出")
                             // ->setDescription("产品URL导出")
                             // ->setKeywords("产品URL导出");
        $objPHPExcel->setActiveSheetIndex(0);
       
        $cols = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        //设置www.111cn.net标题
        for($i=0,$length=count($title); $i<$length; $i++) {
            //echo $cols{$i}.'1';
            $objPHPExcel->getActiveSheet()->setCellValue($cols{$i}.'1', $title[$i]);
        }
        //设置标题样式
        $titleCount = count($title);
        $r = $cols{0}.'1';
        $c = $cols{$titleCount}.'1';
        $objPHPExcel->getActiveSheet()->getStyle("$r:$c")->applyFromArray(
            array(
                'font'    => array(
                    'bold'      => true
                ),
                'alignment' => array(
                    'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_RIGHT,
                ),
                'borders' => array(
                    'top'     => array(
                        'style' => PHPExcel_Style_Border::BORDER_THIN
                    )
                ),
                'fill' => array(
                    'type'       => PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR,
                    'rotation'   => 90,
                    'startcolor' => array(
                        'argb' => 'FFA0A0A0'
                    ),
                    'endcolor'   => array(
                        'argb' => 'FFFFFFFF'
                    )
                )
            )
        );
       
        $i = 0;
        foreach($data as $d) {  //这里用foreach,支持关联数组和数字索引数组
            $j = 0;
            foreach($d as $v) {   //这里用foreach,支持关联数组和数字索引数组
                $objPHPExcel->getActiveSheet()->setCellValue($cols{$j}.($i+2), $v);
                $j++;
            }
       $i++;
        }
        // 生成2003excel格式的xls文件
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="'.$filename.'.xls"');
        header('Cache-Control: max-age=0');

        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        $objWriter->save('php://output');
    }
    $array = array(
        array(1111,'名称','品牌','商品名','http://www.baidu.com'),
        array(1111,'名称','品牌','商品名','http://www.baidu.com'),
        array(1111,'名称','品牌','商品名','http://www.baidu.com'),
        array(1111,'名称','品牌','商品名','http://www.baidu.com'),
        array(1111,'名称','品牌','商品名','http://www.baidu.com'),
    );
    write_xls($array,array('商品id','供应商名称','品牌','商品名','URL'),'report');
   
?>

2、向xls文件写内容

 代码如下 复制代码
<?php
    //获取数据库数据(mysqli预处理学习)
    $config = array(
        'DB_TYPE'=>'mysql',
        'DB_HOST'=>'localhost',
        'DB_NAME'=>'test',
        'DB_USER'=>'root',
        'DB_PWD'=>'root',
        'DB_PORT'=>'3306',
    );
    function getProductIdByName($name) {
        global $config;
        $id = false;
       
        $mysqli = new mysqli($config['DB_HOST'], $config['DB_USER'], $config['DB_PWD'], $config['DB_NAME']);
        if(mysqli_connect_error()) {   //兼容 < php5.2.9 OO way:$mysqli->connect_error
            die("连接失败,错误码:".mysqli_connect_errno()."错误信息:".mysqli_connect_error());
        }
        //设置连接数据库的编码,不要忘了设置
        $mysqli->set_charset("gbk");
        //中文字符的编码要与数据库一致,若没设置,结果为null
        $name = iconv("utf-8", "gbk//IGNORE", $name);
        if($mysqli_stmt = $mysqli->prepare("select id from 137_product where name like ?")) {
            $mysqli_stmt->bind_param("s", $name);
            $mysqli_stmt->execute();
            $mysqli_stmt->bind_result($id);
            $mysqli_stmt->fetch();
            $mysqli_stmt->close();
        }
        $mysqli->close();
        return $id;   //得到的是gbk码(同数据库编码)
    }  
    $id = getProductIdByName('%伊奈卫浴伊奈分体座便器%');
    var_dump($id);
?>

OK...

我们工作中用到最多的就是查询或统计出两个时间差了,下面我就整理了了PHP计算两个时间的差几个例子,其实就可以统计秒 分 时 天 月 年哦,下面来看看例子。

两个时间之间月份差实例代码:

 代码如下 复制代码

$yourdate="2012-10-20";
$yourdate_unix=strtotime($yourdate);
echo (date("Y",$yourdate_unix)-date("Y"))*12+(date("m",$yourdate_unix)-date("m"));

例子1

 代码如下 复制代码

/*
    * 计算2个时间段的月份差
 * @param $st开始时间 $et结束时间(时间戳格式)
 * @return $total 返回的差值
   */
   function getMonthNum($st, $et)
   {
    $s_m = date('n', $st);
    $e_m = date('n', $et);
    $s_y = date('Y', $st);
    $e_y = date('Y', $et);
    $total = 13 - $s_m + ($e_y - $s_y - 1) * 12 + $e_m; //计算月份差
    return $total;
   }


例子2

 

 代码如下 复制代码

<?php
$one = strtotime('2011-05-08 07:02:40');//开始时间 时间戳
$tow = strtotime('2012-12-25 00:00:00');//结束时间 时间戳
$cle = $tow - $one; //得出时间戳差值

/* 这个只是提示
echo ceil($cle/60); //得出一共多少分钟
echo ceil($cle/3600); //得出一共多少小时
echo ceil($cle/3600/24); //得出一共多少天
*/
/*ceil()函数,即进一法取整*/
$d = cell($cle/3600/24);
$h = cell(($cle%(3600*24))/3600);  //%取余
$m = cell(($cle%(3600*24))/60);

echo "两个时间相差 $d 天 $h 小时 $m 分"
?>

例子3

 代码如下 复制代码

<?PHP

/*
*
*函数功能:计算两个以YYYY-MM-DD为格式的日期,相差几天
*
*/
function getChaBetweenTwoDate($date1,$date2){

    $Date_List_a1=explode("-",$date1);
    $Date_List_a2=explode("-",$date2);

    $d1=mktime(0,0,0,$Date_List_a1[1],$Date_List_a1[2],$Date_List_a1[0]);

    $d2=mktime(0,0,0,$Date_List_a2[1],$Date_List_a2[2],$Date_List_a2[0]);

    $Days=round(($d1-$d2)/3600/24);

    return $Days;
}

echo getChaBetweenTwoDate('2010-08-11','2010-08-16');
echo "<br>";
echo getChaBetweenTwoDate('2010-08-16','2010-08-11');
?>

例子4

 代码如下 复制代码

<?php
$startdate=”2010-12-11 11:40:00″;
$enddate=”2012-12-12 11:45:09″;
$date=floor((strtotime($enddate)-strtotime($startdate))/86400);
$hour=floor((strtotime($enddate)-strtotime($startdate))%86400/3600);
$minute=floor((strtotime($enddate)-strtotime($startdate))%86400/60);
$second=floor((strtotime($enddate)-strtotime($startdate))%86400%60);
echo $date.”天<br>”;
echo $hour.”小时<br>”;
echo $minute.”分钟<br>”;
echo $second.”秒<br>”;
?>

例子四是我最喜欢的一个可以计算到天小时秒哦,当然具体的还是需要根据自己的需要了。

下文是一道简单的PHP笔试题(进阶必备)了,如果你准备去面试的话不防进入来参考这道笔试题吧。

次,一个前辈发了一道PHP笔试给我,题目大致如下

 代码如下 复制代码
$arr = array('1','2','3');
 
foreach($arr as $key=>&$val){}
 
foreach($arr as $key=>$val){}
 
var_dump($arr);

问答案是什么?

看完我就懵了?根本不知道问题的考点在那里,看完两个foreach的区别在一个是取了地址,一个没有取地址,,这样会影响结果吗?

结果输出的结果居然是

 代码如下 复制代码

array(
  0 => string '1' (length=1)
  1 => string '2' (length=1)
  2 => &string '2' (length=1)
)

表示打印出来的数据为什么会这样?“3”去哪儿了?
造成这样的原因在于:&取地址符合。

 

用这种方式来说明foreach对数组的读取,比较直观。

然后循环就是指针的移动读取,而且由于是&取值,则直接读的是地址而是不简单的赋值。所以当第一个循环结束后。$val跟$arr[2]指的是同一个地址,所以$val值如果改变了,$arr['2']值也跟着改变了。

如果,你运行一下如下代码

 代码如下 复制代码
$arr = array('1','2','3');
 
foreach($arr as $key=>&$val){}
 
foreach($arr as $key=>$val){
 var_dump($arr);
}
var_dump($arr);

你就能看到变化的过程。和得到之前结果的原因

 

php 获取文章内容的第一张图片方法非常的简单,我们最常用的是使用了正则了,下面与一聚教程小伙伴一起来看看吧。

以下是关于选取文章中第一张图片的代码:

 代码如下 复制代码

$obj=M("News");
$info=$obj->where('id=1')->find();
//方法1*********

$soContent = $info['content'];
$soImages = '~<img [^>]* />~';
preg_match_all( $soImages, $soContent, $thePics );
$allPics = count($thePics[0]);
preg_match('/<img.+src=\"?(.+\.(jpg|gif|bmp|bnp|png))\"?.+>/i',$thePics[0][0],$match);
dump($thePics);
if( $allPics> 0 ){
    echo "<img" width=100% src='".$match[1]."' title='".$match[1]."'>";//获取的图片名称
}
else {
    echo "没有图片";
}
//**************

$soContent = $info['content'];
$soImages = '~<img [^>]* />~';
preg_match_all( $soImages, $soContent, $thePics );
$allPics = count($thePics[0]);
dump($thePics);
if( $allPics> 0 ){
    echo $thePics[0][0]; //获取的整个Img属性
} else {
    echo "没有图片";
}
//**************

$soImages = '~<img [^>]* />~';
$str=$info['content'];
preg_match_all($soImages,$str,$ereg);//正则表达式把图片的整个都获取出来了
$img=$ereg[0][0];//图片
$p="#src=('|\")(.*)('|\")#isU";//正则表达式
preg_match_all ($p, $img, $img1);
   $img_path =$img1[2][0];//获取第一张图片路径
if(!$img_path){
    $img_path="images/nopic.jpg";
} //如果新闻中不存在图片,用默认的nopic.jpg替换 */
echo $img_path;
//*************88

$str=$info['content'];
preg_match_all("/<img.*\>/isU",$str,$ereg);//正则表达式把图片的整个都获取出来了
$img=$ereg[0][0];//图片
$p="#src=('|\")(.*)('|\")#isU";//正则表达式
preg_match_all ($p, $img, $img1);
   $img_path =$img1[2][0];//获取第一张图片路径
if(!$img_path){
    $img_path="images/nopic.jpg";
} //如果新闻中不存在图片,用默认的nopic.jpg替换 */
echo $img_path;

ZipArchive是php自带的一个压缩与解压缩函数了,今天理所当然的情况中使用new ZipArchive来创建zip文件时碰到提示Fatal error: Class ZipArchive not found in错误,下面一聚教程小伙伴就此问题来看看排除办法。

测试代码如下

 代码如下 复制代码

//PHP解压缩文件(zip)
function unzip_file($file, $destination){
$zip = new ZipArchive() ;
//打开压缩文件
if ($zip->open($file) !== TRUE) {
die ('Could not open archive');
}
//创建文件
$zip->extractTo($destination);
$zip->close();
echo '成功';
}
unzip_file("htdocs.zip","wenjianming");

执行时发现

Fatal error: Class 'ZipArchive' not found in E:wwwqqdown.php on line 63

看这个不是未定义了,所以小编百度搜索一下,如下如下解说

在Windows下的解决办法是:

1、在php.ini文件中,将extension=php_zip.dll前面的分号“;”去除;

重启Apache服务器,我们再试发现可以了

补充如果是linux系统参考下面方法

在Linux下没有php_zip.dll这个文件

需要重新编译一下php的zip模块。具体安装方法如下:

 代码如下 复制代码

cd /usr/src
wget http://pecl.php.net/get/zip
tar -zxvf zip
cd zip-1.x.x
phpize
./configure
make
sudo make instal

其中, 在最后使用make install命令的时候,可能需要用到root的权限,所以建议使用sudo来运行。安装完之后,屏幕上会提示zip.so的位置。然后将其记录下来,如:/usr/local/lib/php/extensions/zip.so。

2、使用root权限修改php.ini(通常可能会在/usr/local/lib/文件夹下,不过视当初安装php而定,可以通过phpinfo()来查看):

增加extension = /usr/local/lib/php/extensions/zip.so,然后同样在php.ini文件中,将 zlib.output_compression = Off 改为 zlib.output_compression = On ;

3、最后别忘了重启一下Apache:apachectl restart;

注意:关于网站有一些朋友说zlib.output_compression = Off 改为 zlib.output_compression = On ; 我在windows下没有操作在php.ini文件中也没有看到但这样确实是可以生成或解压文件哦。

标签:[!--infotagslink--]

您可能感兴趣的文章: