文档章节

PHP导出Excel通过XML PHPExcelXML

 蜗牛奔跑
发布于 2015/06/17 13:42
字数 1453
阅读 12
收藏 0
点赞 0
评论 0

 最近在项目需要把数据导出表格,之前也做过类似的工作但没有去总结。在之前使用大名鼎鼎的Phpexcel(phpexcel.codeplex.com)导出表格,很强大功能很多,它也有很多优点,但也发现一些问题比如

  1. 功能太多太复杂,在导出中有很多用不到的功能

  2. 必须使用php zip扩展,本地没什么问题很多线上不支持zip扩展

  3. 还有一个比较大的问题就是占用内存太多,其中需要导出1万行数据活着更多就不给力了。

       尤其在第三个问题上不得不放弃使用PHPEXCEL选择使用xml导出(其实PHPEXCEL也是基于Microsoft's OpenXML 导出的具体细节没研究),同样也有一些问题 比如打开会有弹出框提示如下:

【原创】PHP导出Excel通过XML <wbr>PHPExcelXML

       对于这个问题的解决目前还没有其他办法解决 但可以通过另存为的办法解决。

通过XML导出最开始的想法来自于Yii的一个扩展http://www.yiiframework.com/extension/phpexcel,使用的时候发现功能太简单表格合并设置宽高等最基本的功能都不支持,并且编写格式复杂不够友好,于是打算再次基础上重新开发一个基于XML并且编写风格和PHPEXCEL尽量保持一致的导出方法 代称为PHPExcelXML。

       目前可以支持一下功能

       1.设置行列宽高,

       2.行列合并

       3.设置基本样式字体大小

       4.支持多sheet展示

       5.具有友好的编码风格

       6.支持1w行的数据导出 目前测试是30M以上(再多木有去测试)。

       目前发表在Yii论坛 当然不仅仅支持Yii 他是独立的 (http://www.yiiframework.com/forum/index.php?/topic/22365-extension-phpexcelxml)。代码转成图片贴出来的,以后将继续增加功能主要包括设置字体样式居中等功能以及尽量解决之前的弹出框问题。

鄙视一把新浪blog贴代码不好使,具体换个blog或者自己搭一个。下面是PHPExcelXML的测试代码

【原创】PHP导出Excel通过XML <wbr>PHPExcelXML


       具体代码贴一下 很可能注释都没了 可以直接去Yii上面去看代码也可以联系我 下面是贴图 点击可以放大~



源码:

<?php
/**
 *
 * XMLExcel Class file
 *
 * Simple excel generating from PHP5
 * reference opensource.org/licenses/mit-license.php
 *
 *
 * @author breeze <wfwq2008#gmail.com>
 * @category protected.extentions.xmlexcel
 * @package Extensions
 * @license breeze
 * @version 1.0
 */

/*
*使用
$xls = new XMLExcel('name');
        $sheet0 = $xls->getSheet(0);
        $sheet0->setSheetTitle('sheet1');
        $sheet0->setWidths('A:100,B:100');
        $sheet0->setMerge('A3:D3')->setCellValue('A3','呵呵');
        $sheet0->setHeight(3,40);
        $sheet0->setWidths("A:100,B:200");
        for($i=6;$i<12;$i++){
            $sheet0->setCellValue('A'.$i,'hello'.rand(1,10));
            $sheet0->setCellValue('C'.$i,'hello'.rand(1,10));
        }
        $xls->getSheet(1)->setSheetTitle('sheet2');
        for($i=6;$i<12;$i++){
            $xls->getSheet(1)->setCellValue('A'.$i,'hello'.rand(1,10));
            $xls->getSheet(1)->setCellValue('C'.$i,'hello'.rand(1,10));
        }
        $xls->setDefaultStyles();
        $xls->generateXMLs('test');*/


/**
 * generate XML to export excel
 *
 * 
 */
class XMLExcel{

    public $workSheet = array();
    public $encoding = 'utf-8';
    public $styles = '';
    /**
     * header of html to export excel
     * @var string
     */
    private $header = "<?xml version=\"1.0\" encoding=\"%s\"?\>\n<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:html=\"ht tp://ww w.w3.org/TR/REC-html40\">"; // please trim space

    /**
     * Footer (of document)
     * @var string
     */
    private $footer = "</Workbook>";
    
    private $sheets = "";

    public function getSheet($index = 0){
        if ( !isset($this->workSheet[$index])){
            $this->workSheet[$index] = new CreateExcel();
        }
        return $this->workSheet[$index];
    }
    /*
     * set default styles
     */
    public function setDefaultStyles($font='宋体',$size='12',$vertical='center'){
        $vertical = ucfirst($vertical);
        $this->styles = "\n<Styles>
<Style ss:ID=\"Default\" ss:Name=\"Normal\">
<Alignment ss:Vertical=\"{$vertical}\"/>
<Borders/>
<Font ss:FontName=\"{$font}\" x:CharSet=\"134\" ss:Size=\"{$size}\" ss:Color=\"#000000\"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
</Styles>
";
    }
    public function generateXMLs($name){
        
        header("Content-Type: application/vnd.ms-excel; charset=" . $this->encoding);
                header("Content-Disposition: inline; filename=\"" . $name . ".xls\"");

                $this->sheets =  stripslashes (sprintf($this->header, $this->encoding));
                $this->sheets  .= $this->styles;
        foreach($this->workSheet as $sheet){
            $this->sheets .=$sheet->generateXML();
        }
        $this->sheets .= $this->footer;
        echo $this->sheets;
    }
}
class CreateExcel{

    private $sheetTitle ;
    private $columns = array();
    private $units = array();

    private $defaultHeight;
    private $defaultWidth;

    private $height = array();
    
    /*
     *  设置Sheet Title
     */
    public function setSheetTitle($name){
        $this->sheetTitle = $name;
    }

    /*
     * 设置默认高度
     * @return void
     */
    public function setDefaultHeight($h){
        $this->defaultHeight = "ss:DefaultRowHeight=\"{$h}\"";
    }

    /*
     * 设置默认宽度
     */
    public function setDefaultWidth($w){
        $this->defaultWidth = "ss:DefaultColumnWidth=\"{$w}\"";
    }
    /*
     * 设置行高
     * @param $cell 1,2,3
     * @param $height
     * @return void
     */
    public function setHeight($cell,$height){
        $this->height[$cell] = "ss:Height=\"{$height}\"";
    }

    /*
     * @columns  string "A:100,B:200"
     *
     */
    public function setWidths($columns){
        $columns = explode(",",$columns);
        foreach($columns as $column){
            $value = explode(':',$column);
            $this->columns[$this->_toNumber($value[0])]=$value[1];
        }
    }

    public function setwidth($cell,$width){
        $this->columns[$cell]=$width;
    }

    /*
     * 纵向横向合并
     *
     * @param string "A3:D5"|"A3:D5,B3:E4"
     *
     * @return void
     */
    public function setMerges($merges){
        $merges = explode(",",$merges);
        foreach($merges as $merge){
            $this->setMerge($merge);
        }
        return $this;
    }

    public function setMerge($merge){
        $merge = explode(":",$merge);
        $cell1 = substr($merge[0],0,1);
        $row1  = substr($merge[0],1);
        $cell2 = substr($merge[1],0,1);
        $row2 = substr($merge[1],1);

        if($cell1.$row2 != $merge[0]) {
            $this->setMergeDown($merge[0].':'.$cell1.$row2);
        }
        if($cell2.$row1 != $merge[0]){
            $this->setMergeAcross($merge[0].':'.$cell2.$row1);
        }
        return $this;
    }

    /*
     * 纵向合并 多个
     *
     * @param string "A3:A5"|A3:A5,B3:B5
     *
     * @return void
     */
    public function setMergeDowns($mergeDowns){
        $mergeDowns = explode(",",$mergeDowns);
        foreach($mergeDowns as $mergeDown){
            $this->setMergeDown($mergeDown);
        }
        return $this;
    }

    public function setMergeDown($mergeDown){
        $units = explode(":",$mergeDown);
        if($units[0][0] != $units[1][0]){

        }

        $cell = $this->_toNumber($units[0][0]);
        $row = substr($units[0],1);
        $md = substr($units[1],1) - substr($units[0],1);
        if ($md <= 0){

        }
        $this->units[$row][$cell] = array('mergeDown'=>$md);
        return $this;
    }

    /*
     * 横向合并
     *
     * @param string "A3:D3"
     * @return void
     */
    public function setMergeAcrosses($mergeAcrosses){
        $mergeAcrosses = explode(",",$mergeAcrosses);
        foreach($mergeAcrosses as $mergeAcross){
            $this->setMergeAcross($mergeAcross);
        }
        return $this;
    }

    public function setMergeAcross($mergeAcross){
        $units = explode(":",$mergeAcross);
        if(substr($units[0],1) != substr($units[1],1)){

        }
        
        $row = $this->_toNumber($units[0][0]);
        $cell = substr($units[0],1);

        $ma = $this->_toNumber($units[1][0]) - $this->_toNumber($units[0][0]);
        if ($ma <= 0){

        }
        $this->units[$row][$cell] = array('mergeAcross'=>$ma);

        return $this;
    }
    /*
     * 设置单元内容
     *
     *@param $cell string A1
     *@param $value string 'value'
     */
    public function setCellValue($cell,$value){
        $row = substr($cell,1);
        $cell = $this->_toNumber($cell[0]);
        $this->units[$row][$cell] = array('data'=>$value);
    }

    private  function _setColumns(){
        $columns = '';
        foreach($this->columns as $k=>$v){
            $columns .= "\n<Column ss:Index=\"".$k."\" ss:AutoFitWidth=\"0\" ss:Width=\"{$v}\"/>";
        }
        return $columns;
    }
    /*
     * 字母转化为数字
     * @param $letter string
     */
    private function _toNumber($letter){
        return ord($letter) - 64;
    }

    /*
     * Generate Sheet
     */
    public function generateXML(){
        $lines = array();
        $sheetTitle = "\n<Worksheet ss:Name=\"" . $this->sheetTitle . "\">\n<Table {$this->defaultHeight} {$this->defaultWidth}>\n";
        array_push($lines,$sheetTitle);
        array_push($lines,$this->_setColumns());
        
        foreach($this->units as $row => $unit){
            $height = isset($this->height[$row])?$this->height[$row]:'';
            $line = "\n<Row ss:Index=\"{$row}\" {$height} >";
            foreach($unit as $cell=> $v){
                $mergeDown = isset($v['mergeDown']) ? 'ss:MergeDown="'.$v['mergeDown'].'"':'';
                $mergeAcross = isset($v['mergeAcross']) ? 'ss:MergeAcross="'.$v['mergeAcross'].'"':'';
                $data = isset($v['data']) ? $v['data']: '';
                $line .= "\n<Cell ss:Index=\"{$cell}\"  {$mergeAcross} {$mergeDown}><Data ss:Type=\"String\">{$data}</Data></Cell>";

            }
            $line .= "\n</Row>";
            array_push($lines,$line);
        }

        array_push($lines,"\n</Table>\n</Worksheet>\n");
        return join("",$lines);
    }

    private function displayError($error){
        echo $error;
        exit;
    }
}

?>





本文转载自:http://blog.sina.com.cn/s/blog_6776884e0100tjpy.html

共有 人打赏支持
粉丝 36
博文 596
码字总数 114025
作品 0
海淀
php的yii框架下安装使用phpexcel【备忘】

把从网上几位大神那里查到的资料整理了一下: 首先确保php环境支持phpexcel,在phpexcel官网(https://github.com/PHPOffice/PHPExcel)上可以看到环境需求为php5.2+、phpzip、phpxml、php_g...

路过暴风
2015/12/21
151
0
30 个 PHP 的 Excel 处理类

下面的 PHP Excel 处理类中,包含 Excel 读写、导入导出等相关的类,列表如下: PHP Excel Reader classes 1. Read Excel Spreadsheets using COM Umesh Rai (India) 2. Read Excel Binary .......

oschina
2014/12/09
6.2K
17
Excel组件Spire.XLS 教程:将Excel导出到XML和XML导入Excel

Spire.XLS for .NET是一个专业的.NET Excel组件,通过Spire.XLS for .NET我们能够将Excel快速导出到Office Open XML,或者仅仅通过三个步骤将Office Open XML导入Excel。 导出/导入功能如下所...

可乐瓶的小辣椒
2017/11/02
0
0
PHP导入Excel和导出数据为Excel文件

有时需要将Excel表格的数据导入到mysql数据库中,我们使用PHP的一个开源项目PHP-ExcelReader可以轻松实现Excel的导入。另外将mysql数据导出为Excel与本站上篇文章中导出CSV一样,只是将逗号分...

rin9958
2016/06/03
56
0
php导出数据到excel,防止身份证等数字字符格式变成科学计数的方法

php导出数据到excel,防止身份证等数字字符格式变成科学计数的方法 而关于php的也有,但是大多都是用phpExcel导出的方法或者spreadsheet等类或者控件之类的导出方法,而我所在维护的系统却用很...

net ljx
2011/11/21
0
0
laravel-admin 导出excel乱码问题

问题: laravel-admin 中顶部导出数据为csv格式,打开后直接乱码不知道如何解决,可能是字符集问题,代码里面默认是utf8格式修改为gbk依然乱码! 可以通过phpexcel导出数据,解决导出乱码的问...

daos
2017/12/10
0
0
Simple Groupware 0.5 版本发布

Simple Groupware 是一个完整的协同工作套件包。它采用PHP,XML,SQL,HTML,CSS和sgsML开发。Simple Groupware与其它同类型系统不同之处在于使用了新的编程语言sgsML。该语言能够实现快速开发W...

红薯
2009/01/07
153
0
php 导出excel问题

//导出类 _charset($fileName); header("Content-Type: application/vnd.ms-excel; charset=gbk"); header("Content-Disposition: inline; filename=""...

蜗牛奔跑
2015/08/24
291
4
请问如何Export多Worksheet的订单Excel XML

各位好 Magento内建的订单Export机制并不会导出订单的商品 想请教各位要如何导出每订单就一个Worksheet,而Worksheet内每一笔数据就是一个商品的相关信息 举例如下 Order #SKU...

Maro
2012/09/04
349
0
[转]Java大数据量导出Excel的问题

试共同条件: 数据总数为110011条,每条数据条数为19个字段。 电脑配置为:P4 2.67GHz,1G内存。 一、POI、JXL、FastExcel比较 POI、JXL、FastExcel均为java第三方开源导出Excel的开源项目。...

大冬
2011/07/28
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Crontab作业时间设置

今天,遇到这么一个题目,周一到周五的9:00-16:59之间,每隔两分钟将某个命令运行一次。给的答案是: */2 9-16 * * 1-5 /usr/sbin/somecommand dosomething 乍一看,这个答案不对,应...

大别阿郎
4分钟前
0
0
ES17-JAVA API文档管理

1.保存文档 可以通过json工具把java对象转换成json字符串进行保存,也可以通过内置的帮助类直接构建json格式 /** * 获取客户端 * * @return */public static TransportClie...

贾峰uk
5分钟前
0
0
Python代码规范和命名规范

前言 Python 学习之旅,先来看看 Python 的代码规范,让自己先有个意识,而且在往后的学习中慢慢养成习惯 一、简明概述 1、编码 如无特殊情况, 文件一律使用 UTF-8 编码 如无特殊情况, 文件头...

blackfoxya
7分钟前
0
0
联动滑动之一:NestScrollChild和NestedScrollingParent

NestScrollChild和NestedScrollingParent 吐槽一下开源中国竟然标题字数有限制 由于项目中使用了CoordinateLayout来解决联动以及实现炫酷的UI效果,那么必须就要研究一波源码了,毕竟知其然知...

JerryLin123
25分钟前
1
0
cloudera spark2.2 读写hbase

cloudera spark2.2 读写hbase 例子 host = 'bigdata-03,bigdata-05,bigdata-04'conf = { "hbase.zookeeper.quorum": host, "hbase.mapreduce.inputtable": "student1"}k......

osenlin
29分钟前
0
0
数据库规范化

转载自 一个小时学会MySQL数据库 地址:http://www.cnblogs.com/best/p/6517755.html 截取其中 1.4 部分 用于自己学习使用 感谢作者:张果 1.4、数据库规范化 经过一系列的步骤,我们现在终于...

十万猛虎下画山
30分钟前
0
0
ios逆向之工具篇

Reveal:查看任意app的UI结构 注:1.不越狱的手机,可以用Reveal来查看自己app的UI结构,不能查看其它app的结构。 2.越狱手机上可以查看任意app的UI结构。 IDA:反编译工具 从App Store下载的...

HeroHY
31分钟前
0
0
EOS区块链平台智能合约示例HelloWorld

我们将介绍一个使用EOS智能合约构建hello World的例子。 一般环境设置通过上一篇文章已经说明,这方面的问题大家可以看本博客上一篇文章,本文引用了官方EOS在Git上的示例。 运行nodeos 要通...

笔阁
33分钟前
1
0
Scrapy爬虫框架简单解析 

scrapy框架解析 Scrapy框架大致包括以下几个组件:Scrapy Engine、Spiders、Scheduler、Item Pipeline、Downloader; 组件 Scrapy Engine 这是框架的核心,负责控制数据流在整个系统的各个组...

zhujun2017
33分钟前
0
0
Vue之ref详解与实例

尽管存在 prop 和事件,有的时候你仍可能需要在 JavaScript 里直接访问一个子组件。为了达到这个目的,你可以通过 ref 特性为这个子组件赋予一个 ID 引用。ref可以加在父级组件上也可以加在子...

tianyawhl
41分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部