服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - PHP教程 - 利用PHPExcel导出excel文件的方法详解

利用PHPExcel导出excel文件的方法详解

2022-11-14 15:31camellia PHP教程

PHPExcel是一款非常强大的PHP操作EXCEL库,使用PHPExcel可以帮助我们简单、高效实现从Excel读取Excel的数据和导出数据到Excel。本文为大家介绍了PHPExcel导出excel文件的用法,需要的可以参考一下

最近工作中需要用到phpexcel导出excel表格。自动存储在固定位置。

之前导出excel使用header原生导出。

但是这种方法,我没有找到可以自动存储的功能。

如果你知道,请在下方留言,一起学习下。

先说一下header导出。

我这里使用的是thinkphp3.2框架.

?
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
/**
     * 导出excel表格
     */
    public function actionPutExcel()
    {
        $admin = M('admin');
        $dbbacklist = $admin->select();
        $title = ["序号","用户名","密码","登陆时间"];
        exportexcel($dbbacklist,$title);
    }  
 
/** 导出数据为excel表格
   * @param $data    一个二维数组,结构如同从数据库查出来的数组
   * @param $title   excel的第一行标题,一个数组,如果为空则没有标题
   * @param $filename 下载的文件名
   */
function exportexcel($data=array(),$title=array(),$filename='report'){
    ob_end_clean();   
    ob_start();
    header("Content-type:application/octet-stream");
    header("Accept-Ranges:bytes");
    header("Content-type:application/vnd.ms-excel");
    header("Content-Disposition:attachment;filename=".$filename.".xls");
    header("Pragma: no-cache");
    header("Expires: 0");
    //导出xls 开始    
    if (!empty($title)){        
        foreach ($title as $k => $v) {
            $title[$k]=iconv("UTF-8", "GB2312",$v);
        }      
        $title= implode("   ", $title);
        echo "$title
";   
    }    
    if (!empty($data)){        
        foreach($data as $key=>$val){
            foreach ($val as $ck => $cv) {                
                $data[$key][$ck]=iconv("UTF-8", "GB2312", $cv);            
            }            
            $data[$key]=implode("   ", $data[$key]);
        }       
        echo implode("
",$data);    
    }
}

这个没啥说的,一共三个参数。传对了就可以了。

Phpexcel导出excel

官网

官方给出的下载地址

放到你能引到的地方。

我这里使用的是laravel5.8框架

?
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/**
 * @name: 导出excel
 * @author: camellia
 * @date: 2021-03-08
 * @param:  $data   array   导出数据
 * @param:  $filename   string  文件名称
 * @param:  $tabhead    array   单个表格头部
 * @param:  $rowwidth   array   单个表格每行宽度
 * @param:  $setHeader  bool    是否设置表头
 * @param:  $saveFile   bool    是否保存文件
 * @param:  $sheetNameList  array  
 */
public function create_xls($data, $filename, $tabhead = [], $rowwidth = [],$setHeader=true,$sheetNameList=[],$saveFile=false)
{
    ini_set('max_execution_time', '0');
    $filename = str_replace('.xls', '', $filename) . '.xls';
    $phpexcel = new \PHPExcel();
    $phpexcel->getProperties()
    ->setCreator("Maarten Balliauw")
    ->setLastModifiedBy("Maarten Balliauw")
    ->setTitle("Office 2007 XLSX Test Document")
    ->setSubject("Office 2007 XLSX Test Document")
    ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
    ->setKeywords("office 2007 openxml php")
    ->setCategory("Test result file");
 
    $arrayLevel = $this->getArrayLevel($data);
    if($arrayLevel > 2)
    {
        foreach($data as $key => $item)
        {
            //创建一个新的工作空间(sheet)
            $phpexcel->createSheet();
            $phpexcel->setactivesheetindex($key);
            // 设置sheet title
            $phpexcel->getActiveSheet()->setTitle($sheetNameList[$key]);
            // 获取当前选中sheet对象
            $objActSheet = $phpexcel->getActiveSheet();
            if($setHeader)
            {
                $i = 1;
                if($tabhead)
                {
                    // 设置头部
                    foreach ($tabhead as $key => $val)
                    {
                        $phpexcel->getActiveSheet()->setCellValue($key, $val);
                    }
                    // 文件内容插入表中
                    $i = 2;
                }
                /*设置宽度*/
                foreach ($rowwidth as $key => $val)
                {
                    $phpexcel->getActiveSheet()->getColumnDimension($key)->setWidth($val);
                }
            }
            else
            {
                $i = 1;
            }
            foreach ($item as $value)
            {
                /* excel文件内容 */
                $j = 'A';
                foreach ($value as $value2)
                {
                    $objActSheet->setCellValue($j . $i, $value2);
                    $j++;
                }
                $i++;
            }
        }
    }
    else
    {
        $phpexcel->getActiveSheet()->setTitle('Sheet1');
        $phpexcel->setActiveSheetIndex(0);
        $objActSheet = $phpexcel->getActiveSheet();
        if($setHeader)
        {
            // 设置头部
            foreach ($tabhead as $key => $val)
            {
                $phpexcel->getActiveSheet()->setCellValue($key, $val);
            }
            /*设置宽度*/
            foreach ($rowwidth as $key => $val)
            {
                $phpexcel->getActiveSheet()->getColumnDimension($key)->setWidth($val);
            }
            // 文件内容插入表中
            $i = 2;
        }
        else
        {
            $i = 1;
        }
        foreach ($data as $value)
        {
            /* excel文件内容 */
            $j = 'A';
            foreach ($value as $value2)
            {
                $objActSheet->setCellValue($j . $i, $value2);
                $j++;
            }
            $i++;
        }
    }
 
    // $phpexcel->getActiveSheet()->fromArray($data);
 
    header('Content-Type: application/vnd.ms-excel');
    header("Content-Disposition: attachment;filename=$filename");
    header('Cache-Control: max-age=0');
    header('Cache-Control: max-age=1');
    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
    header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
    header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
    header('Pragma: public'); // HTTP/1.0
    $objwriter = \PHPExcel_IOFactory::createWriter($phpexcel, 'Excel5');
    if($saveFile)
    {
        $objwriter->save('/usr/share/nginx/html/xxxx/xxxxx/xxxxxx/' . $filename); //这是自动存储到指定位置
        $url = getenv('APP_URL'). "/xxxxx/xxxx/xxxxxx/". $filename;
        return $url;
    }
    else
    {
        $objwriter->save('php://output'); //这是输出浏览器
        exit;
    }
}
/**
 * 返回数组的维度
 * @author: camellia
 * @date: 2021-03-08
 * @param  [array] $arr [要判断的数组]
 * @return [number]      [纬度数字]
 */
public function getArrayLevel($arr)
{
    $al = array(0);
    function aL($arr, &$al, $level = 0)
    {
        if (is_array($arr)) {
            $level++;
            $al[] = $level;
            foreach ($arr as $v) {
                aL($v, $al, $level);
            }
        }
    }
    aL($arr, $al);
    return max($al);
}

上边的例子是我自己在用的。重要的地方基本上都有注释。对应的参数方法的注释中都有说明,对应的传参就可以了。

Phpexcel导出excel表格功能相对多样化。但速度也相对慢一点。

在功能没有太多需求的情况下。还是用header好一点,主要是快,数据量大的情况下,提现尤为明显。

有个问题需要注意一下。每个单元格中如果数字太长就显示为科学计数了。

解决方法很简单:

在数字字符串前加一个空格使之成为字符串

就是这样:

?
1
2
$num = 123456789987456;
$str = ''.$num;

直接给$num加引号使之成为字符串这个方法是否可行。我没试过,有兴趣可以试试。

就是这样:

?
1
$num = string($num);

导出基本上就是这些了。

到此这篇关于利用PHPExcel导出excel文件的方法详解的文章就介绍到这了,更多相关PHPExcel导出excel文件内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7125960246073229348

延伸 · 阅读

精彩推荐