phpspreadsheet 导出多个工作表

  • Post author:
  • Post category:php


phpspreadsheet 导出多个工作表

因为有多组数据导出,所以要新建多张工作表

实现效果

主要创建方式有两种

//方式1 $spreadsheet->createSheet();

//方式2 Create a new worksheet called “My Data”

$myWorkSheet = new \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet, ‘My Data’);//与下面的配合使用

$spreadsheet->addSheet($myWorkSheet, 0);//将“My Data”工作表作为电子表格对象中的第一个工作表附加

代码如下

参考文档:

Worksheets – PhpSpreadsheet Documentation

优化后的代码

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

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117


public


function export(){




$name=


'每日统计'


.date(


"Y-m-d H-i-s"


,time());




// $data=[['aa','aa','cc','dd','ee'],['bb','bb','cc','dd','ee']];




// ?工地考勤




$data[


'kaoqin'


] = Db::name(


'pt_gd_gdrz rz'


)




->field(


"DATE_FORMAT(FROM_UNIXTIME(ctime),'%Y-%m-%d') as date,u.name,rz.title,rz.content"


)




->


where


([


'p.appid'


=>session(


'pt_res.appid'


)])




->


join


(


'zf_pt_post p'


,


'p.id=rz.gd_id'


)




->


join


(


'zf_user u'


,


'rz.openid = u.openid'


)




->whereTime(


'ctime'


,


'today'


)




->


select


();





工地打卡




$data[


'daka'


] = Db::name(


'pt_gd_gddk rz'


)




->field(


"DATE_FORMAT(FROM_UNIXTIME(ctime),'%Y-%m-%d') as date,u.name,p.title"


)




->


where


([


'p.appid'


=>session(


'pt_res.appid'


)])




->


join


(


'zf_pt_post p'


,


'p.id=rz.gd_id'


)




->


join


(


'zf_user u'


,


'rz.openid = u.openid'


)




->whereTime(


'ctime'


,


'today'


)




->


select


();




// 新用户




$data[


'yonghu'


] = Db::name(


'user'


)->


where


([


'appid'


=>session(


'pt_res.appid'


)])->field(


"DATE_FORMAT(FROM_UNIXTIME(create_time),'%Y-%m-%d %H:%i:%s') as date,name"


)




->whereTime(


'create_time'


,


'today'


)




->


select


();




// 预约




$data[


'yuyue'


] = Db::name(


'yuyue y'


)




->field(


"DATE_FORMAT(FROM_UNIXTIME(ctime),'%Y-%m-%d') as date,u.name,y.phone"


)




->


where


([


'u.appid'


=>session(


'pt_res.appid'


)])




->whereTime(


'ctime'


,


'today'


)




->


join


(


'zf_user u'


,


'u.id=y.uid'


)




->


select


();




//设置表头:




$head[


'kaoqin'


] = [


'时间'


,


'姓名'


,


'标题'


,


'内容'


];




//数据中对应的字段,用于读取相应数据:




$keys[


'kaoqin'


] = [


'date'


,


'name'


,


'title'


,


'content'


];




$count[


'kaoqin'


] = count($head[


'kaoqin'


]);


//计算表头数量




$spreadsheet =


new


Spreadsheet();




$sheet = $spreadsheet->getActiveSheet()->setTitle(


'工地考勤'


);




for


($i = 65; $i < $count[


'kaoqin'


] + 65; $i++) {


//数字转字母从65开始,循环设置表头:




$sheet->setCellValue(strtoupper(chr($i)) .


'1'


, $head[


'kaoqin'


][$i - 65]);




}




/*--------------开始从数据库提取信息插入Excel表中------------------*/




foreach


($data[


'kaoqin'


]


as


$key => $item) {


//循环设置单元格:




//$key+2,因为第一行是表头,所以写到表格时   从第二行开始写




for


($i = 65; $i < $count[


'kaoqin'


] + 65; $i++) {


//数字转字母从65开始:




$sheet->setCellValue(strtoupper(chr($i)) . ($key + 2), $item[$keys[


'kaoqin'


][$i - 65]]);




$spreadsheet->getActiveSheet()->getColumnDimension(strtoupper(chr($i)))->setWidth(20);


//固定列宽




}




}




//工地打卡




//方式2 Create a new worksheet called "My Data"




$myWorkSheet[


'daka'


] =


new


\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet,


'工地打卡'


);


//与下面的配合使用




$spreadsheet->addSheet($myWorkSheet[


'daka'


], 0);


//将“My Data”工作表作为电子表格对象中的第一个工作表附加




$head[


'daka'


] = [


'时间'


,


'姓名'


,


'标题'


];




//数据中对应的字段,用于读取相应数据:




$keys[


'daka'


] = [


'date'


,


'name'


,


'title'


];




$count[


'daka'


] = count($head[


'daka'


]);


//计算表头数量




for


($i = 65; $i < $count[


'daka'


] + 65; $i++) {


//数字转字母从65开始,循环设置表头:




$myWorkSheet[


'daka'


]->setCellValue(strtoupper(chr($i)) .


'1'


, $head[


'daka'


][$i - 65]);




}




/*--------------开始从数据库提取信息插入Excel表中------------------*/




foreach


($data[


'daka'


]


as


$key => $item) {


//循环设置单元格:




//$key+2,因为第一行是表头,所以写到表格时   从第二行开始写




for


($i = 65; $i < $count[


'daka'


] + 65; $i++) {


//数字转字母从65开始:




$myWorkSheet[


'daka'


]->setCellValue(strtoupper(chr($i)) . ($key + 2), $item[$keys[


'daka'


][$i - 65]]);




$spreadsheet->getActiveSheet()->getColumnDimension(strtoupper(chr($i)))->setWidth(20);


//固定列宽




}




}




// 新用户




//方式2 Create a new worksheet called "My Data"




$myWorkSheet[


'yonghu'


] =


new


\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet,


'新用户'


);


//与下面的配合使用




$spreadsheet->addSheet($myWorkSheet[


'yonghu'


], 0);


//将“My Data”工作表作为电子表格对象中的第一个工作表附加




$head[


'yonghu'


] = [


'时间'


,


'姓名'


];




//数据中对应的字段,用于读取相应数据:




$keys[


'yonghu'


] = [


'date'


,


'name'


];




$count[


'yonghu'


] = count($head[


'yonghu'


]);


//计算表头数量




for


($i = 65; $i < $count[


'yonghu'


] + 65; $i++) {


//数字转字母从65开始,循环设置表头:




$myWorkSheet[


'yonghu'


]->setCellValue(strtoupper(chr($i)) .


'1'


, $head[


'yonghu'


][$i - 65]);




}




/*--------------开始从数据库提取信息插入Excel表中------------------*/




foreach


($data[


'yonghu'


]


as


$key => $item) {


//循环设置单元格:




//$key+2,因为第一行是表头,所以写到表格时   从第二行开始写




for


($i = 65; $i < $count[


'yonghu'


] + 65; $i++) {


//数字转字母从65开始:




$myWorkSheet[


'yonghu'


]->setCellValue(strtoupper(chr($i)) . ($key + 2), $item[$keys[


'yonghu'


][$i - 65]]);




$spreadsheet->getActiveSheet()->getColumnDimension(strtoupper(chr($i)))->setWidth(20);


//固定列宽




}




}




// 预约




//方式2 Create a new worksheet called "My Data"




$myWorkSheet[


'yuyue'


] =


new


\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet,


'预约'


);


//与下面的配合使用




$spreadsheet->addSheet($myWorkSheet[


'yuyue'


], 0);


//将“My Data”工作表作为电子表格对象中的第一个工作表附加




$head[


'yuyue'


] = [


'时间'


,


'姓名'


,


'电话'


];




//数据中对应的字段,用于读取相应数据:




$keys[


'yuyue'


] = [


'date'


,


'name'


,


'phone'


];




$count[


'yuyue'


] = count($head[


'yuyue'


]);


//计算表头数量




for


($i = 65; $i < $count[


'yuyue'


] + 65; $i++) {


//数字转字母从65开始,循环设置表头:




$myWorkSheet[


'yuyue'


]->setCellValue(strtoupper(chr($i)) .


'1'


, $head[


'yuyue'


][$i - 65]);




}




/*--------------开始从数据库提取信息插入Excel表中------------------*/




foreach


($data[


'yuyue'


]


as


$key => $item) {


//循环设置单元格:




//$key+2,因为第一行是表头,所以写到表格时   从第二行开始写




for


($i = 65; $i < $count[


'yuyue'


] + 65; $i++) {


//数字转字母从65开始:




$myWorkSheet[


'yuyue'


]->setCellValue(strtoupper(chr($i)) . ($key + 2), $item[$keys[


'yuyue'


][$i - 65]]);




$spreadsheet->getActiveSheet()->getColumnDimension(strtoupper(chr($i)))->setWidth(20);


//固定列宽




}




}




header(


'Content-Type: application/vnd.ms-excel'


);




header(


'Content-Disposition: attachment;filename="'


. $name .


'.xlsx"'


);




header(


'Cache-Control: max-age=0'


);




$writer =


new


Xlsx($spreadsheet);




$writer->save(


'php://output'


);




//删除清空:




$spreadsheet->disconnectWorksheets();




unset($spreadsheet);




exit;




}



版权声明:本文为qq_32421489原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。