PHPExcel是用来操作Office Excel文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言。可以使用它来读取、写入不同格式的电子表格。
 
一、下载PHPExcel
http://phpexcel.codeplex.com/
如:PHPExcel_1.8.0_doc.zip
 
二、使用PHPExcel的要求
PHP版本高于5.2.0
开启php_zip扩展
开启php_xml扩展
开启php_gd2扩展
三、解压zip,把里面的classes里的文件拷贝一份放入phpexcel文件夹中。
 
四、PHPExcel中常用方法
//引入PHPExcel文件
require './phpexcel/PHPExcel.php';

//创建PHPExcel对象
$obj = new PHPExcel();

//写入excel操作

//创建excel写入对象
//第二个参数可以写'excel2007'
$writer = PHPExcel_IOFactory::createWriter($obj, 'Excel5');
//或如下方式
$writer = new PHPExcel_Writer_Excel5($obj);

//保存文件到本地
$writer->save('1.xls');

//浏览器输出
header('Content-Type: application/vnd.ms-execl');
header('Content-Disposition: attachment;filename="文件名.xls"');
header('Cache-Control: max-age=0');
$writer->save('php://output');

//文件名乱码的解决
$filename = iconv('utf-8', 'gbk', '中文.xls');
$writer->save($filename);

//内容乱码问题
使用浏览器输出时,header头部加上ob_end_clean();

//操作工作表(worksheet)

//创建工作表方法一
$sheet = new PHPExcel_Worksheet($obj, 'new sheet');
$obj->addSheet($sheet);

//创建工作表方法二
$obj->createSheet();

//设置当前工作表
$obj->setActiveSheetIndex(0);

//得到当前工作表对象
$curSheet = $obj->getActiveSheet();

//往工作表中插入数据

//设置单元格的值
$curSheet->setCellValue('A1', '10');
$curSheet->setCellValue('A2', '20');
$curSheet->setCellValue('A3', '=sum(A1:A2)');

//设置样式
//加粗
$curSheet->getStyle('A1')->getFont()->setBold(true);
//斜体
$curSheet->getStyle('A1')->getFont()->setItalic(true);
//字体颜色
$curSheet->getStyle('A1')->getFont()->
setColor(new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_DARKGREEN));
//字体
$curSheet->getStyle('A1')->getFont()->setName('宋体');
//字体大小
$curSheet->getStyle('A1')->getFont()->setSize(20);
//设置列宽
$curSheet->getColumnDimension('A')->setWidth(20);
$curSheet->getColumnDimension('A')->setAutoSize(true);
//设置行高
$curSheet->getRowDimension('1')->setRowHeight(20);
//设置边框
$curSheet->getStyle('A1')->getBorders()->getTop()
->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
//设置边框颜色
$curSheet->getStyle('A1')->getBorders()->getTop()->getColor()->setARGB('FF336600');
//设置填充色
$curSheet->getStyle('A1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$curSheet->getStyle('A1')->getFill()->getStartColor()->setARGB('FFFF0000');

//单元格的合并
$curSheet->mergeCells('A1:A3');
//多行多列合并
$curSheet->mergeCellsByColumnAndRow($col1,$row1,$col2,$row2);
//插入一行(在before之前插入$rowNums行)
$curSheet->insertNewRowBefore($before=1, $rowNums=1);
//删除行(从row开始删除$rowNums行)
$curSheet->removeRow($row=1,$rowNums=1);
//插入列(在before之前添加$colNums列)
$curSheet->insertNewColumnBefore($before='A', $colNums=1);
//删除列(从col开始删除$colNums列)
$curSheet->removeColumn($col='A', $colNums);

//插入图片
1、创建图片操作对象
$img = new PHPExcel_Worksheet_Drawing();
2、设置图片路径
$img->setPath(路径);
3、设置图片宽高
$img->setWidth();
$img->setHeight();
4、设置图片插入位置
$img->setCoordinates('A1');
5、设置图片偏移量
$img->setOffsetX(100);
6、设置图片倾斜
$img->setRotation(25);
7、添加到工作表
$img->setWorksheet($curSheet);

//读取excel操作

//创建excel读对象
$reader = PHPExcel_IOFactory::createReader('Excel5');
$reader = new PHPExcel_Reader_Excel5();
//得到excel操作对象
$excel = PHPExcel_IOFactory::load(excel路径);
$excel = $reader->load(excel路径);

//获取表的相应数据

//获取工作表数量
$excel->getSheetCount();

//获取工作表名
$excel->getSheetNames();

//根据表名切换当前工作表
$excel->setActiveSheetIndexByName();

//获取整个内容返回数组
$excel->getActiveSheet()->toArray();

//通过reader对象获取excel表的信息
$reader->listWorkSheetInfo(路径);
$reader->listWorkSheetNames(路径);

//获取当前工作表最大行数
$excel->getActiveSheet()->getHighestRow();
//获取当前工作表最大列数
$excel->getActiveSheet()->getHighestColumn();

//获取单个单元格内容
$curSheet->getCell('A1')->getValue();
五、如何循环读取excel中数据
<?php
require './phpexcel/PHPExcel.php';

$reader = PHPExcel_IOFactory::createReader('Excel5');
$excel = PHPExcel_IOFactory::load('./1.xls');
$curSheet = $excel->getActiveSheet();

$rows = $curSheet->getHighestRow();
$cols = $curSheet->getHighestColumn();

$data = array();
for($i = 1; $i <= $rows; ++$i) {
    $tmp = array();
    for($j = 'A'; $j <= $cols; ++$j) {
        $name = $j . $i;
        $cellData = $curSheet->getCell($name)->getValue();
        $tmp[] = $cellData;
    }
    $data[] = $tmp;
}

echo '<pre>';
print_r($data);
echo '</pre>';
六、如何导入大数据量的excel
1、为了测试,我们手动的创建一个数据量较大的xls文件
<?php
set_time_limit(0);
require './phpexcel/PHPExcel.php';

$start = microtime(true);
$excel = new PHPExcel();
$writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');
$curSheet = $excel->getActiveSheet();

$rows = 10000;
$cols = range('A', 'M');

for($i = 1; $i <= $rows; ++$i) {
    foreach($cols as $col) {
        $cellName = $col . $i;
        $curSheet->setCellValue($cellName, uniqid(mt_rand(), true));
    }
}

$writer->save('./data.xls');
$end = microtime(true);
echo $end - $start;
生成该文件大概花了17秒,大小约为10.2MB。
 
2、我们创建一个静态页面,用于上传该文件
<!DOCTYPE HTML>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>导入excel</title>
</head>
<body>
    <form action="import.php" method="post" enctype="multipart/form-data">
        xls文件:<input type="file" name="upfile" value="" />
        <input type="submit" value="导入" />
    </form>
</body>
</html>
3、通过生成sql语句把它写入到data.sql中,然后调用mysql命令导入sql文件
<?php
set_time_limit(60);
ini_set("memory_limit", "128M");

require './phpexcel/PHPExcel.php';

$start = microtime(true);

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;  
$cacheSettings = array();  
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

//上传的临时文件
$upfile = $_FILES['upfile']['tmp_name'];
$excel = PHPExcel_IOFactory::load($upfile);
$curSheet = $excel->getActiveSheet();

$db = mysql_connect('127.0.0.1', 'root', '');
mysql_select_db('test');
mysql_query('set names utf8');

//sql文件保存路径
$sqlFile = dirname(__FILE__) . '/data.sql';
$fp = fopen($sqlFile, 'ab+');

$rows = $curSheet->getHighestRow();
$cols = $curSheet->getHighestColumn();

//将列名转为列数
$cols = PHPExcel_Cell::columnIndexFromString($cols);

for($i = 1; $i <= $rows; ++$i) {
    $rowStr = "INSERT INTO `test` VALUES(NULL,";
    for($j = 0; $j < $cols; ++$j) {

        //将列数转换为列名
        $cellName = PHPExcel_Cell::stringFromColumnIndex($j) . $i;
        $cellValue = $curSheet->getCell($cellName)->getValue();
        $cellValue = iconv('GBK', 'UTF-8', $cellValue);
        $rowStr .= "'{$cellValue}',";
    }
    $rowStr = rtrim($rowStr, ",") . ");\r\n";
    fwrite($fp, $rowStr);
}
fclose($fp);

exec('D:\amp\mysql56\bin\mysql -utest -ptest test < ' . $sqlFile);

$end = microtime(true);
echo $end - $start;
1万行的xls数据导入数据库,用了36秒左右,当然php的内存还可以调大点。
posted on 2017-01-17 20:08  怀素真  阅读(693)  评论(0编辑  收藏  举报