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文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)