`
yang2012php
  • 浏览: 51991 次
  • 性别: Icon_minigender_2
  • 来自: 济南
社区版块
存档分类
最新评论

PHPExcel使用中遇到的几个问题

    博客分类:
  • php
阅读更多

最近做项目,接触了几次PHPExcel,过程中遇到了几个问题,现对PHPExcel的一些常见用法和我遇到的问题及解决方法总结如下。(推荐还是要看一下PHPExcel官网的手册)

 

一、常见用法

    这个部分网站上有很多资料了,我这里不再一一罗列,只是将我用到的几个地方写了一下。

 

<?
//首先要导入phpexcel
require_once ($yourpath.'PHPExcel.php');
//创建phpexcel对象
$objPHPExcel = new PHPExcel ();
//设置属性
$objPHPExcel->getProperties ()->setCreator ( "Miss Yang" )
		->setLastModifiedBy ( "Miss Yang" )
		->setTitle ( "Office 2003 XLS Document" )
		->setSubject ( "Office 2003 XLS Document" )
		->setDescription ( "TrunkBow" )
		->setKeywords ( "TrunkBow" )
		->setCategory ( "TrunkBow" );
        
//设置当前的sheet索引,用于后续的内容操作。  
//缺省情况下,PHPExcel会自动创建第一个sheet被设置SheetIndex=0  
$objExcel->setActiveSheetIndex(0); 
$objActSheet = $objExcel->getActiveSheet();  
 
 //设置当前活动sheet的名称  
$objActSheet->setTitle('Sheet1');  

//设置单元格内容
 $objActSheet->setCellValue('A1', '字符串内容');  // 字符串内容  
 $objActSheet->setCellValue('A2', 26);            // 数值  
 $objActSheet->setCellValue('A3', true);          // 布尔值  
 $objActSheet->setCellValue('A4', '=SUM(A2:A2)'); // 公式   

//显式指定内容类型  
 $objActSheet->setCellValueExplicit('A5','8757584',PHPExcel_Cell_DataType::TYPE_STRING);

//设置单元格格式
$objActSheet ->getStyle ('A1' )
             ->getFont ()
             ->getColor()
             ->setARGB(PHPExcel_Style_Color::COLOR_RED);   
$objActSheet ->getStyle ('A1' )
             ->getFont ()
             ->setBold(true); 
$objActSheet ->getStyle ('A')
             ->getNumberFormat()
             ->setFormatCode ( PHPExcel_Style_NumberFormat::FORMAT_TEXT );
$objActSheet ->getColumnDimension ('A')
             ->setWidth(20); 
$objActSheet ->getColumnDimension ('B')
             ->setAutoSize(true); 
$activeSheet ->getColumnDimension('C')
             ->setVisible(false); 

//生成下拉列表框
$list = "item1,item2,item3";
$objValidation1 = $activeSheet->getCell('A1')->getDataValidation();
$objValidation1->setType( PHPExcel_Cell_DataValidation::TYPE_LIST )
               ->setErrorStyle(PHPExcel_Cell_DataValidation::STYLE_INFORMATION )
               ->setAllowBlank(false)
               ->setShowInputMessage(true)
               ->setShowErrorMessage(true)
               ->setShowDropDown(true)
               ->setErrorTitle('输入的值有误')
               ->setError('您输入的值不在下拉框列表内.')
               ->setPromptTitle('下拉选择框')
               ->setPrompt('请从下拉框中选择您需要的值!')
               ->setFormula1('"' . $list . '"');    

//下载输出
$filename = "testphp.xls";
$filename = iconv("utf-8", 'gbk', $filename);
$objWriter = PHPExcel_IOFactory::createWriter ( $objPHPExcel, 'Excel5' );
header ( 'Content-Type: application/vnd.ms-excel' );
header ( "Content-Disposition: attachment;filename=$filename" );
header ( 'Cache-Control: max-age=0' );
$objWriter->save ( 'php://output' );
exit(0);   

 

 

 

二、问题总结

1.单元格内容为长数字的,输出时,总是转成科学计数法。

 

    这个问题网上也有不少资料提到的,大多是说要修改几个地方的源码。但是我一直没找到对应的源码在哪里,可能是版本不同的原因。我是这样解决的:

 

//显示指定内容类型
 $objActSheet->setCellValueExplicit('A5','8757584',PHPExcel_Cell_DataType::TYPE_STRING); 

  

2.PHPExcel占用内存过大。

 

PHPExcel是一个很强大的处理ExcelPHP开源类,但是很大的一个问题就是它占用内存太大,从1.7.3开始,它支持设置cell的缓存方式,但是推荐使用目前稳定的版本1.7.6,因为之前的版本都会不同程度的存在bug

官网上是这么说的:PHPExcel平均下来使用1k/单元格的内存,因此大的文档会导致内存消耗的也很快。单元格缓存机制能够允许PHPExcel将内存中的小的单元格对象缓存在磁盘或者APCmemcache或者Wincache中,尽管会在读取数据上消耗一些时间,但是能够帮助你降低内存的消耗。默认情况下,PHPExcel依然将单元格对象保存在内存中,但是你可以自定义。你可以使用PHPExcel_Settings::setCacheStorageMethod()方法,将缓存方式作为参数传递给这个方法来设置缓存的方式。

  

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory; 
PHPExcel_Settings::setCacheStorageMethod($cacheMethod); 

 

 

setCacheStorageMethod()方法会返回一个BOOL型变量用于表示是否成功设置(比如,如果APC不能使用的时候,你设置使用APC缓存,将会返回false)。每一个worksheet都会有一个独立的缓存,当一个worksheet实例化时,就会根据设置或配置的缓存方式来自动创建。一旦你开始读取一个文件或者你已经创建了第一个worksheet,就不能在改变缓存的方式了。目前,有以下几种缓存方式可以使用:

1). PHPExcel_CachedObjectStorageFactory::cache_in_memory;

默认情况下,如果你不初始化任何缓存方式,PHPExcel将使用内存缓存的方式。

2).PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized;  

使用这种缓存方式,单元格会以序列化的方式保存在内存中,这是降低内存使用率性能比较高的一种方案。

3). PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;

与序列化的方式类似,这种方法在序列化之后,又进行gzip压缩之后再放入内存中,这回跟进一步降低内存的使用,但是读取和写入时会有一些慢。

4). PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;

当使用cache_to_discISAM这种方式时,所有的单元格将会保存在一个临时的磁盘文件中,只把他们的在文件中的位置保存在PHP的内存中,这会比任何一种缓存在内存中的方式都慢,但是能显著的降低内存的使用。临时磁盘文件在脚本运行结束是会自动删除。

5). PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;

      类似cache_to_discISAM这种方式,使用cache_to_phpTemp时,所有的单元格会还存在php://temp I/O流中,只把他们的位置保存在PHP的内存中。PHPphp://memory包裹器将数据保存在内存中,php://temp的行为类似,但是当存储的数据大小超过内存限制时,会将数据保存在临时文件中,默认的大小是1MB,但是你可以在初始化时修改它:

$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp; 
$cacheSettings = array( ' memoryCacheSize ' => '8MB' ); 
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); 

 

 

php://temp文件在脚本结束是会自动删除。

 

6). PHPExcel_CachedObjectStorageFactory::cache_to_apc;

当使用cach_to_apc时,单元格保存在APC中,只在内存中保存索引。APC缓存默认超时时间时600秒,对绝大多数应用是足够了,当然你也可以在初始化时进行修改:

 

 

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_APC; 
$cacheSettings = array( 'cacheTime' => 600 ); 
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);  

 

 

当脚本运行结束时,所有的数据都会从APC中清楚(忽略缓存时间),不能使用此机制作为持久缓存。

 

7).PHPExcel_CachedObjectStorageFactory::cache_to_memcache

        使用cache_to_memory时,单元格对象保存在memcache中,只在内存中保存索引。默认情况下,PHPExcel会在localhost和端口11211寻找memcache服务,超时时间600秒,如果你在其他服务器或其他端口运行memcache服务,可以在初始化时进行修改:

 

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_memcache; 
$cacheSettings = array( 'memcacheServer'=> 'localhost', 
                                       'memcachePort' => 11211, 
                                       'cacheTime' => 600 );  
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); 

  

       从初始化设置的形式上看,MS还不支持多台memcache服务器轮询的方式,比较遗憾。

 当脚本结束时,所有的数据都会从memcache清空(忽略缓存时间),不能使用该机制进行持久存储。

 

3.下拉列表的数据来源过长

 

 

    我们还是先来看手册是怎么说的:

   

It is important to remember that any string participating in an Excel formula is allowed to be maximum 255 characters (not bytes).

 

   

     当下拉列表的数据来源过长(more than 255 characters)时,该下拉列表会显示不正确(我遇到的情况是:该下拉列表显示了别的正常的下拉列表的数据来源).

以下是我的解决办法:

//解决下拉框数据来源字串长度过大:将每个来源字串分解到一个空闲的单元格中
$str_list = "item1,item2,item3,......" ;
$str_len = strlen($str_list);
if($str_len>=255){
        $str_list_arr = explode(',', $str_list); 
        if($str_list_arr) 
              foreach($str_list_arr as $i =>$d){
                     $c = "P".($i+1);
                     $activeSheet->setCellValue($c,$d); 
               } 
         $endcell = $c;
         $activeSheet->getColumnDimension('P')->setVisible(false); 
} 

$objValidation2 = $activeSheet->getCell("A1")->getDataValidation(); 
$objValidation2->setType( PHPExcel_Cell_DataValidation::TYPE_LIST ) 
                ->setErrorStyle( PHPExcel_Cell_DataValidation::STYLE_INFORMATION ) 
               ->setAllowBlank(true) 
               ->setShowInputMessage(true)
               ->setShowErrorMessage(true) 
               ->setShowDropDown(true)
               ->setErrorTitle('输入的值有误') 
               ->setError('您输入的值不在下拉框列表内.')
               ->setPromptTitle('下拉选择框')
               ->setPrompt('请从下拉框中选择您需要的值!');
if($str_len<255) 
       $objValidation2->setFormula1('"' . $str_list . '"'); 
else 
       $objValidation2->setFormula1("sheet1!P1:{$endcell}"); 

 

4.本地运行正常,服务器上PHPExcel不能运行

官网:

          The following software is required to develop using PHPExcel:

           » PHP version 5.2.0 or newer

           » PHP extension php_zip enabled *)

           » PHP extension php_xml enabled

           » PHP extension php_gd2 enabled (if not compiled in)

  另外,请检查iconv扩展是否正常,PHPExcel需要他的支持

 

 

 

0
1
分享到:
评论

相关推荐

    phpExcel1.7.5

    PHPExcel 由一系列相互协作的类组成,这些类主要分为几个部分:Reader、Writer、Worksheet、Cell、Style等。例如,Reader 类用于读取电子表格文件,Writer 类则负责创建和保存文件。每个部分都包含了多种特定格式的...

    PHPExcel_developer_documentation.doc

    - **常见问题**:官方文档提供了FAQ(常见问题解答)来解决你在使用过程中可能遇到的问题。 - **教程**:除了手册外,还有各种教程可以帮助你快速上手,包括基本操作和高级特性。 ### 2. 架构 (Architecture) **...

    phpexcel1.7.6

    在提供的压缩包中,我们发现以下几个关键文件: 1. **changelog.txt**:这个文件记录了PHPExcel自上一个版本以来的更新和改进,包括修复的bug、新增的功能以及性能优化等。它是了解软件发展历史和当前状态的重要...

    PHPExcel 1.8版本导出excel

    在“PHPExcel 1.8版本导出excel”这个主题中,我们可以深入探讨以下几个关键知识点: 1. **安装和配置**:首先,你需要下载并安装PHPExcel 1.8版本。这通常可以通过Composer(PHP的依赖管理工具)完成,添加相应的...

    PHPExcel 精简过的 只有1M 带例子的导出数据到Excel

    这个精简版的PHPExcel仅1MB大小,相较于原始的18MB版本,去除了不必要的文件,使得它更加轻便,适合在资源有限的环境中使用。这样的优化对于那些只需要基本功能的开发者来说是个很好的选择,因为它减少了服务器的...

    phpExcel,用于PHP读取和操作Excel文件

    在项目中使用phpExcel,首先需要通过Composer安装。在项目根目录下运行以下命令: ```bash composer require phpoffice/phpexcel ``` 安装完成后,可以通过`require`引入所需类库,例如: ```php require_once '...

    PHPExcel拿来即用

    在标题“PHPExcel拿来即用”中,我们可以理解到这个压缩包包含了一个可以直接在Laravel框架的ThinkPHP 5.0(TP5.0)环境中使用的PHPExcel版本,无需额外安装,简化了开发流程。 描述中提到,将PHPExcel放入TP5.0的`...

    利用PHPExcel实现Excel文件的写入和读取

    - PHPExcel已经被PHPExcel Team维护多年,社区积累了大量的经验和技巧,遇到问题可以先搜索一下,可能已有现成的解决方案。 总之,通过PHPExcel库,开发者能够非常方便地在PHP脚本中进行Excel文件的读写操作。这...

    phpoffice.zip

    PHPExcel库的核心功能主要体现在以下几个方面: 1. **文件格式支持**:PHPExcel支持多种Microsoft Office Excel文件格式,包括老版本的BIFF8 (xls) 和新版本的OpenXML (xlsx)。这使得它能够兼容不同用户的需求,...

    php 导出excel表数据

    总结来说,使用PHPExcel库导出包含中文数据的Excel表主要涉及以下几个步骤: 1. 引入库文件。 2. 创建和配置Spreadsheet对象。 3. 设置工作表和数据。 4. 确保使用支持中文的字体和UTF-8编码。 5. 输出或保存Excel...

    php生成excel表格

    这通常涉及到以下几个关键知识点: 1. **PHPExcel库**:PHPExcel是PHP中一个功能强大的库,能够读取和写入多种电子表格格式,包括Microsoft Excel的.BIFF(Binary Interchange File Format)和.OOXML(Open Office ...

    PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法

    这种情况下,可以通过几个步骤来解决这个问题,确保不降低PHP版本的前提下正常导出Excel文件。 首先,需要了解的是,PHP导出Excel通常会依赖于PHPExcel这样的第三方库,但老版本的PHPExcel已经很久没有更新,可能会...

    PHP实现的excel数据导入到MySQL数据库的程序包

    总结起来,这个“PHP实现的excel数据导入到MySQL数据库的程序包”涵盖了以下几个核心知识点: 1. PHP的文件操作:使用`PHPExcel`库读取Excel文件。 2. 数据处理:转换和清洗从Excel中读取的数据,使其符合MySQL...

    php生成excel几种方式_实例

    在PHP开发中,生成Excel文件是一项常见的需求,例如用于数据导出、报表生成等场景。在处理Excel文件时,确实...在开发过程中,不断学习和实践,积累经验,遇到问题时积极寻找解决方案,这样才能更好地应对各种挑战。

    php导入excel表格

    首先,我们需要了解的是PHP中的几个关键库,它们是处理Excel文件的核心工具。例如,PHPExcel是一个流行的库,它允许开发者用PHP读取、写入和操作多种Excel文件格式,包括BIFF(Microsoft Excel 97-2003)和OOXML...

    php使用excel_class.php操作Excel文件

    在描述中提到的“NULL”,可能是因为原始描述被省略或没有提供详细信息,但通常在处理Excel文件时,我们需要关注以下几个核心知识点: 1. **文件格式理解**:Excel文件有两种主要格式,`.xls`(旧版的BIFF格式)和`...

    php读写excel类

    首先,让我们了解一下PHPExcel,这是一个已经被弃用的库,但在许多项目中仍然被使用。它支持老版本的BIFF格式(Excel 97-2003)和较新的XML格式(Excel 2007+,也称为Open XML)。在使用PHPExcel时,如果文件过大,...

    Excel_class

    读取Excel数据的过程包括以下几个步骤: 1. 加载Excel文件:类会打开指定的文件,并加载工作表中的数据。 2. 遍历数据:通过逐行或逐列遍历Excel数据,将每个单元格的数据存储在内存中。 3. 数据处理:如果需要,...

    关于PHP内存溢出问题的解决方法

    回到初始的问题,当处理大量数据,如日志分析时,遇到内存溢出的情况,有以下几个有效的解决方法: 1. **调整内存限制**:使用`ini_set('memory_limit', '64M')`临时提高PHP脚本可使用的内存上限。不过要注意,在...

    PHP生成Excel报表并且修正编码格式错误事例带图

    代码示例通常会包含以下几个步骤: 1. **引入库**:首先,你需要引入所需的库文件,例如: ```php require 'vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\...

Global site tag (gtag.js) - Google Analytics