ThinkPHP8导出Excel单元格为下拉选择框

说明

本文章是基于上一篇ThinkPHP8 导出Excel数据表格文章的完善版,上一篇仅导出为文本框,此处增加下拉框。

其他内容与上一章不变,此处展示不同内容。

更改

1.头部数组修改

增加type类型,text为文本框,select为下拉框,具体其他需求自行扩展。

['key' => 'field', 'title' => '内容', 'type' => 'text'],
['key' => 'date', 'title' => '日期', 'type' => 'select'],

2.设置内容方法修改

仅需要替换该方法即可,具体内容可根据业务场景自行修改。

/**
     * @notes 设置单元格值
     * @param array $data 数据
     * @param array $header 表头数据
     * @param string|int $startRow 默认第二行开始
     * @return object
     */
    public function setContent(array $data, array $header, string|int $startRow = 2): object
    {
        //  获取总列数
        $column = $this->getColumn(count($header));
        $totalColumn = count($data);
        //  遍历数据
        foreach ($data as $key => $value) {
            //  遍历表头
            for ($i = 0; $i < count($header); $i++) {
                //  获取单元格名称
                $columnName = $column[$i] . ($key + $startRow);
                $columnType = $header[$i]['type'];
                $columnValue = $value[$header[$i]['key']] ?? '';
                //  设置单元格数据
                switch ($columnType) {
                    case 'text':
                        $this->sheet->getActiveSheet()->setCellValue($columnName, $columnValue);
                        break;
                    case 'select':
                        $objValidation = $this->sheet->getActiveSheet()->getCell($columnName)->getDataValidation();
                        $objValidation->setType(DataValidation::TYPE_LIST)
                            ->setErrorStyle(DataValidation::STYLE_INFORMATION)
                            ->setAllowBlank(false)
                            ->setShowInputMessage(true)
                            ->setShowErrorMessage(true)
                            ->setShowDropDown(true)
                            ->setErrorTitle('输入的值有误')
                            ->setError('您输入的值不在下拉框列表内.')
                            ->setPromptTitle('')
                            ->setPrompt('')
                            ->setFormula1('"' . $columnValue . '"');
                        break;
                    default:
                        $this->sheet->getActiveSheet()->setCellValue($columnName, $value[$header[$i]['key']] ?? '');
                }
                //  设置单元格自适应宽度
                $this->sheet->getActiveSheet()->getColumnDimension($column[$i])->setAutoSize(true);
                //  设置单元格自适应高度
                $this->sheet->getActiveSheet()->getRowDimension($key + $startRow)->setRowHeight(24);
            }
            unset($data[$key]);
        }
        $startColumn = $column[0] . $startRow;
        $endColumn = $column[count($column) - 1] . $totalColumn + $startRow - 1;
        //  设置字体大小及加粗
        $this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getFont()->setBold(false)->setSize(11);
        //  设置单元格水平居中
        $this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
        //  设置单元格垂直居中
        $this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
        //  设置单元格边框
        $this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
        return $this->sheet;
    }

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值