导出数据超出EXCEL行列本身限制时如何解决!!!

导出数据超出EXCEL行列本身限制时如何解决!!!,第1张

1、//导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入

import("OrgUtilPHPExcel");

import("OrgUtilPHPExcelWriterExcel5");

import("OrgUtilPHPExcelIOFactoryphp");

$date = date("Y_m_d",time());

$fileName = "_{$date}xls";

2、 //创建PHPExcel对象,注意,不能少了\

$objPHPExcel = new \PHPExcel();

$objProps = $objPHPExcel->getProperties();

3、//设置表头

$key = 0;

4、 //print_r($headArr);exit;

foreach($headArr as $v){

5、//注意,不能少了。将列数字转换为字母\

$colum = \PHPExcel_Cell::stringFromColumnIndex($key);

$objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum'1', $v);

$key += 1; }

$column = 2;

$objActSheet = $objPHPExcel->getActiveSheet();

foreach($data as $key => $rows){ //行写入 $span = 0;

foreach($rows as $keyName=>$value){// 列写入

$j = \PHPExcel_Cell::stringFromColumnIndex($span);

$objActSheet->setCellValue($j$column, $value);

$span++; }

$column++; }

$fileName = iconv("utf-8", "gb2312", $fileName);

7、//重命名表

$objPHPExcel->getActiveSheet()->setTitle($date);

8、//设置字体大小

$objPHPExcel->getDefaultStyle()->getFont()->setSize(14);

9、 //设置单元格宽度

$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(15);

10、 //设置默认行高

$objPHPExcel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(23);

11、//设置活动单指数到第一个表,所以Excel打开这是第一个表

$objPHPExcel->setActiveSheetIndex(0);

header('Content-Type: application/vndms-excel');

header("Content-Disposition: attachment;filename=\"$fileName\"");

header('Cache-Control: max-age=0');

$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

$objWriter->save('php://output'); //文件通过浏览器下载exit;}

php导出大量数据的Excel:

PHP从数据库分多次读取100万行记录,和分多次将100万行写入文本文件都没问题

Excel可以支持100万行记录,Excel 2003最大支持65536行,从2007版开始支持104万行了,目前2007的盗版应该比较普及了-_-! 问清楚客户是什么版本。

要导出excel的理由是非常充分和正确的,应该继续坚持。业务人员最熟悉的就是Excel,实在不熟悉现学现用也比别的快。只是要注意,当数据量达到10万行这个级别时,Excel的公式填充将会非常非常慢,如果再有LOOKUP()公式,基本上十分钟内处理CPU满载进程管理器杀不掉的状态,这时候其实xampp + phpmyadmin是一个易用性和性能都最平衡的选择

PHPExcel输出的是Excel XML格式,有个XML头和尾,中间是数据Body,需要将100万行都赋值给一个数组才可以调用PHPExcel->write(),这容易导致PHP执行超时或者内存超限,不妨调整一下phpini配置,把超时时间和内存限制都改到很大

如果是输出csv格式,那就太简单了,你的问题可能是没给字段内容加引号,加上引号再调用fputcsv试试?其实fputcsv做的事情特别简单,你甚至可以不管它,自己把CSV文件的每一行拼接好了之后用file_put_contents写入

工作中经常要遇到将xlsx文件中的部分内容导入到数据库。通常我们都是用PHPExcel来读取。

通过下面的方法我们可以很容易将一个excel表格读取成为php数组,之后就可以为所欲为了:

$input_file = "dataxlsx";

$objPHPExcel = PHPExcel_IOFactory::load($input_file);

$sheetData = $objPHPExcel->getSheet(0)->toArray(null, true, true, true);

如果文章到此结束,那价值就不大了。

很不幸的情况总是存在的,当dataxlsx有上万行,每一行又有很多列,每一列又有很长的字符串,并且有的还有颜色等效果时,用上面的方法经常发生的情况就是内存不足。

好吧,我们还有ini_set来加大内存,还可以用set_time_limit来设置较长的超时,如下:

set_time_limit(90);

ini_set("memory_limit", "1024M");

$input_file = "dataxlsx";

$objPHPExcel = PHPExcel_IOFactory::load($input_file);

$sheetData = $objPHPExcel->getSheet(0)->toArray(null, true, true, true);

但很负责任的说,这些都不是终极的方案。

我曾经试过将内存设置到了2G,超时设置到了90秒,也仍然读不出一个4000行的花花绿绿的表格。原因都出在toArray这个方法上,它会将处理的结果全保存到数组中,这种方式在处理简单表格时还是很方便的,但在处理大表格时,真的是很杯具。

我们的解决方案如下:

require 'lib/PHPExcelphp';

set_time_limit(90);

$input_file = "dataxlsx";

$objPHPExcel = PHPExcel_IOFactory::load($input_file);

// 读取规则

$sheet_read_arr = array();

$sheet_read_arr["sheet1"] = array("A","B","C","D","F");

$sheet_read_arr["sheet2"] = array("A","B","C","D","F");

// 循环所有的页

foreach ($sheet_read_arr as $key => $val)

{

$currentSheet = $objPHPExcel->getSheetByName($key);// 通过页名称取得当前页

$row_num = $currentSheet->getHighestRow();// 当前页行数

// 循环从第二行开始,第一行往往是表头

for ($i = 2; $i <</span>= $row_num; $i++)

{

$cell_values = array();

foreach ($val as $cell_val)

{

$address = $cell_val $i;// 单元格坐标

// 读取单元格内容

$cell_values[] = $currentSheet->getCell($address)->getFormattedValue();

}

// 看看数据

print_r($cell_values);

}

}

上面的方式算是较复杂的情况了,如果只是想将所有的单元格全读出来,用下面的方法就行了:

require 'lib/PHPExcelphp';

set_time_limit(90);

$input_file = "dataxlsx";

$objPHPExcel = PHPExcel_IOFactory::load($input_file);

$sheet_count = $objPHPExcel->getSheetCount();

for ($s = 0; $s <</span> $sheet_count; $s++)

{

$currentSheet = $objPHPExcel->getSheet($s);// 当前页

$row_num = $currentSheet->getHighestRow();// 当前页行数

$col_max = $currentSheet->getHighestColumn(); // 当前页最大列号

// 循环从第二行开始,第一行往往是表头

for($i = 2; $i <</span>= $row_num; $i++)

{

$cell_values = array();

for($j = 'A'; $j <</span> $col_max; $j++)

{

$address = $j $i; // 单元格坐标

$cell_values[] = $currentSheet->getCell($address)->getFormattedValue();

}

// 看看数据

print_r($cell_values);

}

}

我们可以将上面的print_r地方改成组拼sql语句并写入文件,然后用mysql导入,当然也可以直接连接数据库向表中插入记录,这就随意了。

public function insert_excel(){

     set_time_limit(0);

   require_once '/data/excel/PHPExcelphp';

       $objReader = PHPExcel_IOFactory::createReader('Excel5');

       $objReader->setReadDataOnly(true);

       $objPHPExcel = $objReader->load("/Public/Book1xls");

       $objWorksheet = $objPHPExcel->getSheet(0);

       $highestRow = $objWorksheet->getHighestRow();

       $highestColumn = $objWorksheet->getHighestColumn();

       $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);

       $excelData = array();

   //注意列数和行数的起始位置

       for ($row = 2; $row <= $highestRow;$row++){

           for ($col=0;$col<$highestColumnIndex;$col++) {

               $excelData[$row][]=(string)$objWorksheet->getCellByColumnAndRow($col,$row)->getValue();

           }

       } 

$map = M('map_info');

//获取该地图的;

foreach($excelData as $key => $val){

//此处需要对自定义的字段序列map_map_customcid

$result = curl_get('> }

上面是导入数据

public function export_excel(){

$map_info = D("MapInfo");

        $mid = intval($_GET["mid"]);

        $mapinformation = M("map_info");

        

$search_type = $_REQUEST['search_type'];

$keywords = t($_REQUEST['keywords']);

$status = $_REQUEST['status'];

if(!empty($status) || $status === '0'){

$where['status'] = $status;

$map['status'] = $status;

}

$where['uid'] = $this->uid;

$where['is_del'] = 0;

if(empty($search_type) && !empty($_REQUEST['keywords'])){

$map['search_type'] = $search_type;

$map['keywords'] = $keywords;

$_search_where['title']  = array('like',"%"$keywords"%");

$_search_where['contents']  = array('like',"%"$keywords"%");

$_search_where['_logic'] = 'or';

$where['_complex'] = $_search_where;

}elseif(!empty($search_type) && !empty($_REQUEST['keywords'])){

$map['search_type'] = $search_type;

$map['keywords'] = $keywords;

$where[$search_type] = array('like',"%"$keywords"%");;

}

$map = D('Map');

if($mid){

$where['mid'] = $mid;

$excel_title = $map->where("mid=$mid") -> getField('title');

$map_info_field = "title,contents,map_info";

}else{

$excel_title = "我的全部地图数据";

$map_info_field = "title,contents,mid";

}

$info_list = $map_info -> getAllMapInfo($mid,$where,$map_info_field);

header("Content-type:application/vndms-excel");

header("Content-Disposition:filename="$excel_title"-"date("Ymd",time())"xls");

echo iconv('utf-8', 'gb2312', '标题'); echo  "\t";

echo iconv('utf-8', 'gb2312', '简介'); echo  "\t";

if(!$mid){

echo iconv('utf-8', 'gb2312', '地图名称'); echo  "\t";

}else{

$custom_list = D('MapCustom') -> getCustomList($mid);

foreach($custom_list as $k =>$v){

if($v['title']){

echo iconv('utf-8', 'gb2312', $v['title']); echo  "\t";

}

}

}

echo "\n";

$order = array("'•'","'\r\n'", "'\n'", "'\r'","'\s+'");//正则匹配回车,换行,空格

$replace = array('','','','','');

foreach($info_list as $key => $val){

echo mb_convert_encoding(preg_replace($order,$replace,strip_tags($val['title']) ) ,'gb2312', 'utf-8'); echo  "\t";

echo mb_convert_encoding(preg_replace($order,$replace,strip_tags($val['contents']) ) ,'gb2312', 'utf-8'); echo  "\t";

if(!$mid){

$map_title = $map->where("mid="$val['mid'])->getField('title');

echo iconv('utf-8', 'gb2312', preg_replace($order,$replace,$map_title) ); echo "\t";

echo "\n";

}else{

foreach($custom_list as $ke => $va){

echo iconv('utf-8', 'gb2312', preg_replace($order,$replace, strip_tags( $val['map_info'][$va['cid']] ) ) ); echo  "\t";

}

echo "\n";

}

}

}

PHPEXCEL类最好自己下载,我只是提交一个文件而已

虽然有Excel *** 作类,不建议使用。php *** 作excel本来就很不地道,表格复杂点就出错,特别是在linux系统上就更麻烦了。

CSV是通用格式,你可以用excel另存为csv格式,再交给php处理。php有专门的fgetcsv()来读取csv中的数据。

以上就是关于导出数据超出EXCEL行列本身限制时如何解决!!!全部的内容,包括:导出数据超出EXCEL行列本身限制时如何解决!!!、PHPexcel导入数据求教,10列数据以上无数据输出是为什么、如何用PHPExcel读取超大excel文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9733254.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存