Thinkphp5中使用PHPExcel

安装

  • 项目所在目录:
    uiste:tp5.0 uiste$ composer require phpexcel/phpexcel

简单上手

  1. 实例化对象
    $objPHPExcel = new \PHPExcel();

  2. 获取活动sheet,设置sheet名字

    1
    2
    $objSheet = $objPHPExcel->getActiveSheet(); 
    $objSheet ->setTitle("demo");//可以给sheet设置名称为"demo"
  3. 然后就是在表格中写入数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //数据量大的时候使用第一种方法
    $objSheet->setCellValue("A1","姓名")->setCellValue("B1","分数");
    $objSheet->setCellValue("A2","张三")->setCellValue("B2","100");
    //数据量小的时候使用第二种方法
    $array = array(
    array(),
    array('姓名','分数'),
    array('张三','60'),
    array('李四','61'),
    array('王五','62'),
    );
    $objSheet -> fromArray($array);//数据较大时,不建议使用此方法,建议使用setCellValue()
  4. 保存写入的数据

    1
    2
    $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');//生成一个Excel2007文件  
    $objWriter->save('/Users/uiste/www/tp5.0/public/test.xlsx');//保存文件

在浏览器上输出Excel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$filename = 'student.xls';
$type = 'Excel2007';
$objPHPExcel = new \PHPExcel();
for ($i=0; $i <= 1; $i++) {
// 如果sheet大于0 则创建一个新的sheet
if ($i>0) {
$objPHPExcel->createSheet();
}
$objPHPExcel->setActiveSheetIndex($i);//把当前创建的sheet设置为活动sheet
$objSheet = $objPHPExcel->getActiveSheet();//获得当前活动Sheet
$objSheet->setTitle("student" . $i);
if($i==0){
$student = Db::name('student')->where(['sex'=>10])->select();
}else{
$student = DB::name('student')->where('sex != 10')->select();
}
$objSheet->setCellValue('A1','序号')
->setCellValue('B1','姓名')
->setCellValue('C1','年龄')
->setCellValue('D1','性别')
->setCellValue('E1','创建时间')
->setCellValue('F1','更新时间');
$j = 2; // 从第二行开始写入
foreach ($student as $key => $value) {
$objSheet->setCellValue('A'.$j,$value['id'])
->setCellValue('B'.$j,$value['name'])
->setCellValue('C'.$j,$value['age'])
->setCellValue('D'.$j,$value['sex'])
->setCellValue('E'.$j,$value['created_at'])
->setCellValue('F'.$j,$value['updated_at']);
$j++;
}
}
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5');//生成excel文件
//$objWriter->save($dir."/export_1.xls");//保存文件
if($type=="Excel5"){
header('Content-Type: application/vnd.ms-excel');//告诉浏览器将要输出excel03文件
}else{
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');//告诉浏览器数据excel07文件
}
header('Content-Disposition: attachment;filename="'.$filename.'"');//告诉浏览器将输出文件的名称
header('Cache-Control: max-age=0');//禁止缓存
$objWriter->save("php://output");

读取指定Excel文件中的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
header("Content-Type:text/html;charset=utf-8");
$filename=ROOT_PATH . 'public' . DS . "test.xlsx"; // 读取文件
$sheetName=array("demo"); //只加载指定的sheet
$rowStart = 1; //指定开始读取的行数

$fileType=\PHPExcel_IOFactory::identify($filename);//自动获取文件的类型提供给phpexcel用
$objReader=\PHPExcel_IOFactory::createReader($fileType);//获取文件读取操作对象

$objReader->setLoadSheetsOnly($sheetName);//只加载指定的sheet
$objPHPExcel=$objReader->load($filename);//加载文件
/* 数据量小的时候使用 */
/**$sheetCount=$objPHPExcel->getSheetCount();//获取excel文件里有多少个sheet
for($i=0;$i<$sheetCount;$i++){
$data=$objPHPExcel->getSheet($i)->toArray();//读取每个sheet里的数据 全部放入到数组中
print_r($data);
}**/

/* 数据量大的时候使用 */
foreach($objPHPExcel->getWorksheetIterator() as $sheet){//循环取sheet
foreach($sheet->getRowIterator() as $row){//逐行处理
if($row->getRowIndex()<$rowStart){
continue;
}
foreach($row->getCellIterator() as $cell){//逐列读取
$data=$cell->getValue();//获取单元格数据
echo $data." ";
}
echo '<br/>';
}
echo '<br/>';
}
exit;

小案例-POST发送读取文件数据发送到服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
public function operate()
{
$filename=ROOT_PATH . 'public' . DS . "test.xlsx"; // 读取文件
$sheetName=array('工作表2'); //只加载指定的sheet
$rowStart = 1; //指定开始读取的行数
$url = 'http://www.test.com/history/study4/MVC_1/index.php?c=products&a=add';
$receive = ['proname','proguige','proprice','proamount','proimages','proweb']; // 定义接收方的数据下标
// 第一步读取文件
if (!$data = $this->_fileRead($filename, $sheetName, $rowStart)) {
echo '无法读取文件中的数据!!!';
}
// dump($data);die;
// 第二步发送数据请求
foreach ($data as $sheet) { // 工作表
foreach ($sheet as $key1 => $rows) { // 工作表行
if (count($rows) != count($receive)) {
echo '表中数据列数与要发送的字段数不一致请核实!!!';die;
}
$row = array();
foreach ($rows as $key => $cell) { //单元格
$row[$receive[$key]] = $cell;
}
if (!empty($row)) {
// $url = "http://localhost/web_services.php";
// $post_data = array ("username" => "bob","key" => "12345");
$post_data = $row;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// post数据
curl_setopt($ch, CURLOPT_POST, 1);// post的变量
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);

//打印获得的数据
if ($output) {
echo '第 ' . $key1+1 . ' 行录入成功!!!' . '<br/>';
}else{
echo '第 ' . $key1+1 . ' 行录入失败!!!' . '<br/>';
}
}
}
}
echo '录入完成 , 哈哈哈<br>';
}

public function _fileRead($filename, $sheetName = ['sheet1'], $rowStart = 1)
{
header("Content-Type:text/html;charset=utf-8");

$fileType=\PHPExcel_IOFactory::identify($filename);//自动获取文件的类型提供给phpexcel用
$objReader=\PHPExcel_IOFactory::createReader($fileType);//获取文件读取操作对象

$objReader->setLoadSheetsOnly($sheetName);//只加载指定的sheet
$objPHPExcel=$objReader->load($filename);//加载文件
/* 数据量小的时候使用 */
$sheetCount=$objPHPExcel->getSheetCount();//获取excel文件里有多少个sheet
$data = array();
for($i=0;$i<$sheetCount;$i++){
$data[$sheetName[$i]]=$objPHPExcel->getSheet($i)->toArray();//读取每个sheet里的数据 全部放入到数组中
}
return $data;

/* 数据量大的时候使用 */
// $data = array();
// foreach($objPHPExcel->getWorksheetIterator() as $sheet){//循环取sheet
// foreach($sheet->getRowIterator() as $row){//逐行处理
// if($row->getRowIndex()<$rowStart){
// continue;
// }
// foreach($row->getCellIterator() as $cell){//逐列读取
// $data=$cell->getValue();//获取单元格数据
// echo $data." ";
// }
// echo '<br/>';
// }
// echo '<br/>';
// }
exit;
}

相关文章
PHPExcel的使用