使用phpExcel类导出excel文件相关问题总结

使用phpExcel类导出excel文件相关问题总结

Autor:xiaoqingtime:2011-04-22

总结一下最近使用phpexcel类导出excel 文件时遇到的问题,主要包括三大类:

  1.导出时提示找不到文件怎么办?

  2.导出excel时中文出现乱码的问题。

  3.导出数据量大时,提示内存超过最大值或者运行时间超时的问题。

先看下phpexcel常用的方法总结(摘录自zeal_blog:http://www.zeali.net/entry/556

[php] view plain copy
  1. <?     
  2.   
  3. /**   
  4.  
  5.  * 如果使用 Excel5 ,输出的内容应该是GBK编码。  
  6.  
  7.  */    
  8.   
  9. require_once 'PHPExcel.php';     
  10.   
  11. //require_once 'PHPExcel/Writer/Excel5.php';    // 用于其他低版本xls    
  12.   
  13. //require_once 'PHPExcel/Writer/Excel2007.php'; // 用于 excel-2007 格式    
  14.   
  15. $table = new PHPExcel();    
  16.   
  17. //设置当前的sheet索引,用于后续的内容操作。    
  18.   
  19. //一般只有在使用多个sheet的时候才需要显示调用。    
  20.   
  21. //缺省情况下,PHPExcel会自动创建第一个sheet被设置SheetIndex=0    
  22.   
  23. $table->setActiveSheetIndex(0);    
  24.   
  25. //设置当前活动sheet的名称    
  26.   
  27. $table->setActiveSheetIndex(0)->setTitle('test_title');    
  28.   
  29. $ohjActSheet=$table->setActiveSheetIndex(0);    
  30.   
  31. //设置单元格内容    
  32.   
  33. //由PHPExcel根据传入内容自动判断单元格内容类型    
  34.   
  35. $objActSheet->setCellValue('A1''字符串内容');  // 字符串内容    
  36.   
  37. $objActSheet->setCellValue('A2', 26);            // 数值    
  38.   
  39. $objActSheet->setCellValue('A3', true);          // 布尔值    
  40.   
  41. $objActSheet->setCellValue('A4''=SUM(A2:A2)'); // 公式    
  42.   
  43. //显式指定内容类型    
  44.   
  45. $objActSheet->setCellValueExplicit('A5''847475847857487584',     
  46.   
  47.  PHPExcel_Cell_DataType::TYPE_STRING);    
  48.   
  49. //合并单元格    
  50.   
  51. $objActSheet->mergeCells('B1:C22');    
  52.   
  53. //分离单元格    
  54.   
  55. $objActSheet->unmergeCells('B1:C22');    
  56.   
  57. //设置单元格样式    
  58.   
  59. $objActSheet->getColumnDimension('B')->setAutoSize(true);    
  60.   
  61. $objActSheet->getColumnDimension('A')->setWidth(30);    
  62.   
  63. $objStyleA5 = $objActSheet->getStyle('A5');  
  64.   
  65. //设置字体    
  66.   
  67. $objFontA5 = $objStyleA5->getFont();    
  68.   
  69. $objFontA5->setName('Courier New');    
  70.   
  71. $objFontA5->setSize(10);    
  72.   
  73. $objFontA5->setBold(true);    
  74.   
  75. $objFontA5->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);    
  76.   
  77. $objFontA5->getColor()->setARGB('FF999999');      
  78.   
  79. //设置对齐方式    
  80.   
  81. $objAlignA5 = $objStyleA5->getAlignment();    
  82.   
  83. $objAlignA5->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT); //水平   
  84.   
  85. $objAlignA5->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);  //垂直  
  86.   
  87. //设置边框    
  88.   
  89. $objBorderA5 = $objStyleA5->getBorders();    
  90.   
  91. $objBorderA5->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);    
  92.   
  93. $objBorderA5->getTop()->getColor()->setARGB('FFFF0000'); // color    
  94.   
  95. $objBorderA5->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);    
  96.   
  97. $objBorderA5->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);    
  98.   
  99. $objBorderA5->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);    
  100.   
  101.    
  102.   
  103. //添加一个新的worksheet    
  104.   
  105. $table->createSheet();    
  106.   
  107. $table->getSheet(1)->setTitle('测试2');    
  108.   
  109. //保护单元格    
  110.   
  111. $table->getSheet(1)->getProtection()->setSheet(true);    
  112.   
  113. $table->getSheet(1)->protectCells('A1:C22''PHPExcel');    
  114.   
  115. //$objWriter->save($outputFileName);    
  116.   
  117. //header("Content-Type: application/octet-stream");    
  118.   
  119. //header('Content-Disposition:inline;filename="'.$outputFileName.'"');    
  120.   
  121. //header("Cache-Control: must-revalidate, post-check=0, pre-check=0");    
  122.   
  123. //header("Pragma: no-cache");    
  124.   
  125. //$objWriter->save('php://output');    
  126.   
  127. ?>   


使用时常见的问题总结:

1.关于提示找不到文件的问题:

原因可能有:缓冲区没有打开或者mb_overlod_func函数没有关闭,解决这个问题的最好办法是把php.inidisplay_errors打开,下载文件,打开后会提示相应错误信息。若是后者,则需要打开php.ini文件,找到mbsrtring.func_overload=7将其隐掉。

若能正常导出excel但是没有数据,则一般是程序错误(没有取到数据或数据没赋值)

2.导出excel时出现乱码的问题,这个问题网上的答案很多。主要的解决方案有:

  (1).乱码原因:客户使用的中文版Windows系统平台,而Windows平台的文件名编码为  gb2312(gbk),而我们网页编码为了跟进现存潮流 一般都采用utf-8(国际化)编码,这时当我们:header("Content-Disposition: inline; filename=\"" . $filename . ".xls-:special:1:-")时就会出现乱码,假如你的网页编码就是gb2312那就不用考虑编码问题了(否则转码了反而会出现乱码)

  解决办法:对$filename转码,执行:iconv('utf-8", "gb2312", $filename)。假如你的环境不支持iconv函数可以换别的函数,只要能将$filename的编码转为gbk就行。

(2):输出文件的时候加上相应的头信息:

Header('content-Type:application/vnd.ms-excel;charset=utf-8');

(3).如果以上方法还是出现乱码,则可能是输出缓冲区中有其他多余的内容,在php文件中设置excel内容之间清理一下输出缓冲区吧:<php ob_clean();>

以上三步基本可以涵盖到多数excel乱码的问题。

3.导出大数据时提示错误

打开php.ini文件中的display_errors,查看具体错误信息:一般情况下有两类:

(1).runtime 超过了maxium time,这个时候可能的原因是文件中出现了死循环或者大循环。检查源码看是否有死循环。建议不要在循环体中设置excel格式,占据的时间超多。经初步测试,在循环体中设置3-4个格式,则大约1500条数据时就会出现运行超时的问题。因此尽量把设置格式的代码放置到循环体外。如果还有问题,则有两种方法:修改ini文件,把time_limit=0;远程不能修改ini文件则需要在程序中添加set_time_limit(0);

(2).memory size of ....bytes exhausted这是典型的内存不够用的情况。如可以修改php.ini文件则找到memory_limit = 32M将其改为memory_limit = 64M或者更大128M.如是远程不能修改php.ini文件,则需要在代码中修改:@ini_set('memory_limit','128M');

你可能感兴趣的:(使用phpExcel类导出excel文件相关问题总结)