Composer 地址: https://packagist.org/packages/phpoffice/phpexcel

GitHub 地址: https://github.com/PHPOffice/PHPExcel 
 
原始地址: https://archive.codeplex.com/?p=phpexcel

?
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
  
#1. 引入 phpExcel composer包
composer require "phpoffice/phpexcel"
 
 
#2. 解析excel为数组,直接使用此方法即可
//---------------------------------------------内容如下     begin
    /**
     * * Excel解析为数组
     *
     * @param $filePath     要解析的excel文件url
     * @return array        解析完成返回数据数组
     * @throws \Exception
     */
    function excelUpload($filePath)
    {
 
        $PHPReader = new \PHPExcel_Reader_Excel2007();
 
        if (!$PHPReader->canRead($filePath)) {
            $PHPReader = new \PHPExcel_Reader_Excel5();
            if (!$PHPReader->canRead($filePath)) {
                throw new \Exception("Excel解析错误,提供有效的excel");
            }
        }
 
        $excel_data = [];
 
        // 加载excel文件
        $PHPExcel = $PHPReader->load($filePath);
        // 读取excel文件中的第一个工作表
        $currentSheet = $PHPExcel->getSheet(0);
        // 取得最大的列号
        $allColumn = $currentSheet->getHighestColumn();
        // 取得一共有多少行
        $allRow = $currentSheet->getHighestRow();
 
        // 从第二行开始输出,因为excel表中第一行为列名
        for ($currentRow = 1; $currentRow <= $allRow; $currentRow++) {
 
            $currentColumnBool = true;
            $currentColumnInt = 0;
            echo "\n\r";
            while ($currentColumnBool) {
                $currentColumn = IntToChr($currentColumnInt);
                $val = $currentSheet->getCellByColumnAndRow($currentColumnInt, $currentRow)->getValue();
                //对象强制转换字符串
                if ($val instanceof \PHPExcel_RichText) $val = $val->__toString();
 
                if ($currentRow == 1) {
                    $excel_keys[$currentColumn] = $val;
 
                } elseif ($currentColumn <= $currentColumnInt) {
                    if (!empty($excel_keys[$currentColumn]) && !empty($val)) {
                        $excel_data[$currentRow][$excel_keys[$currentColumn]] = $val;
                    else {
                        $excel_data[$currentRow][$excel_keys[$currentColumn]] = null;
                    }
                }
 
                $currentColumnBool = $currentColumn == $allColumn ? false true;
                $currentColumnInt++;
            }
 
        }
 
        return $excel_data;
 
    }
 
 
    /**
     * 数字转字母 (类似于Excel列标)
     *
     * @param Int $index 索引值
     * @param Int $start 字母起始值
     * @return String 返回字母
     */
    function IntToChr($index, $start = 65)
    {
 
        $str = '';
        if (floor($index / 26) > 0) {
            $str .= IntToChr(floor($index / 26) - 1);
        }
 
        return $str . chr($index % 26 + $start);
 
    }
 
 
//---------------------------------------------内容如下     bend
 
 
 
#3. 导出excel
//---------------------------------------------内容如下     begin
    /**
     * 导出excel
     *
     * @param   array $titles        excel第一行(标头)       ['name'=>'姓名','age'=>'年龄',...]
     * @param   array $contentData   数组组成的内容(二维数组)  [1=>['name'=>'小明','age'=>'10'],2=>['name'=>'小小','age'=>'11'],3=>['name'=>'小二','age'=>'8']]
     * @param   string $fileName     导出时生成文件名称
     *
     */
    function excelDownload($titles, $contentData, $fileName = 'fileName')
    {
 
        $xlsObj = new \PHPExcel();
        //设置当前本的值
        //$xlsObj->setActiveSheetIndex(0);/*可有可无*/
        //设置单元格列为文本
        //$xlsObj->getActiveSheet()->getStyle('M')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_TEXT);
        //第一行加粗
        $xlsObj->setActiveSheetIndex(0)->getStyle('1')->applyFromArray(
            [
                'font' => ['bold' => true],
                'alignment' => ['horizontal' => \PHPExcel_Style_Alignment::HORIZONTAL_CENTER]
            ]
        );
        //第一行加背景颜色
        $firstLine = IntToChr(count($titles) - 1);
        $xlsObj->getActiveSheet()->getStyle("A1:{$firstLine}1")->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
        $xlsObj->getActiveSheet()->getStyle("A1:{$firstLine}1")->getFill()->getStartColor()->setARGB('A5E0FF');
 
        $row = 1;
        $line = 0;
 
        //遍历数据
        if (!empty($titles)) {
            foreach ($titles as $title) {
                $lineLetter = IntToChr($line);
                //设置列宽
                $xlsObj->setActiveSheetIndex()->getColumnDimension($lineLetter)->setWidth(mb_strwidth($title) + 5);
                //设置单元格列属性为文本
                $xlsObj->getActiveSheet()->getStyle($lineLetter)->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_TEXT);
                $xlsObj->setActiveSheetIndex()->setCellValueByColumnAndRow($line, $row, $title);
                $line++;
            }
        }
 
        if (!empty($contentData)) {
            foreach ($contentData as $contractVal) {
                $line = 0;
                $row++;
                foreach ($titles as $titles_key => $titles_val) {
                    $xlsObj->setActiveSheetIndex()->setCellValueByColumnAndRow($line, $row, $contractVal->$titles_key??'');
                    $line++;
                }
            }
        }
        $xlsObj = \PHPExcel_IOFactory:: createWriter($xlsObj, 'Excel2007');
        //通知客户端下载文件
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="' . $fileName . '_' . date('dMy') . '.xlsx"');
        header('Cache-Control: max-age=0');
        $xlsObj->save('php://output');
 
    }
 
 
    /**
     * 数字转字母 (类似于Excel列标) 如已引入此方法,则无需再次引入
     *
     * @param Int $index 索引值
     * @param Int $start 字母起始值
     * @return String 返回字母
     */
    function IntToChr($index, $start = 65)
    {
 
        $str = '';
        if (floor($index / 26) > 0) {
            $str .= IntToChr(floor($index / 26) - 1);
        }
 
        return $str . chr($index % 26 + $start);
 
    }
//---------------------------------------------内容如下     end
 
  
---------------------------------------------------------------------------------------------
不忘初心 方得始终!

唯有志存高远,方能风行天下。

道之所存,虽千万人吾往矣! 情之所钟,虽千万里吾念矣~

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。