使用PhpSpreadsheet做数据导出Excel时遇到长数字类型会被转化为科学计数表示,原本应该是以下正常数据

285BAA04-5A53-AC86-F4BE-1AEF1EC90E06.jpg

被自动转换成下面的显示方式,不能正常阅读。

D87F4E90-04A9-1511-AF18-F1E3919BA366.jpg

官方手册中提到可使用setCellValueExplicit,强制指定类型为字符串解决

$spreadsheet->getActiveSheet()->setCellValueExplicit('A1', '861390030802899', \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);

另外一种方法是在长数字前加上一个空格也可得到解决

完整示例

QQ截图20180322125012.jpg

public function actionExportDown()
    {
        $request = Yii::$app->request;
        $name = trim($request->get('name'));
        $start = intval($request->get('start'));
        $end = intval($request->get('end'));
        $product = intval($request->get('product'));
        $act = intval($request->get('act'));
        $uid = intval($request->get('uid'));
        $cscId = intval($request->get('cscId'));
        $attr = $request->get('attr');
        $fmt = trim($request->get('fmt'));
        $ext = in_array($fmt, ['csv', 'xlsx', 'xls']) ? '.' . $fmt : '.xlsx';
        $model = Dev::find();
        $model->alias('dev');
        if ($start > 0 && $end > 0 && $start < $end) {
            $model->andWhere(['between', 'id', $start, $end]);
        } elseif ($start > 0) {
            $model->andWhere('id>=:id', ['id' => $start]);
        } elseif ($end > 0) {
            $model->andWhere('id<=:id', ['id' => $end]);
        }
        if ($cscId) {
            $model->andWhere('csc_id=:csc_id', ['csc_id' => $cscId]);
        }
        if ($uid) {
            $model->andWhere('uid=:uid', ['uid' => $uid]);
        }
        if ($product) {
            $model->andWhere('product=:product', ['product' => $product]);
        }
        if ($act) {
            $model->andWhere('act=:act', ['act' => $act]);
        }
        $datalist = $model->limit(500)->orderBy('id DESC')->all();
        if (empty($attr)) {
            $attr = ['sn', 'sn_code', 'product'];
        }
        $az = range('A', 'Z');
        $attrNum = count($attr) - 1;
        $index = range('A', $az[$attrNum]);
        $spreadsheet = new Spreadsheet();
        $spreadsheet->setActiveSheetIndex(0);
        foreach ($attr as $key => $row) {
            if (in_array($row, array_keys($this->export))) {
                $cell = $this->export[$row];
                $attrs[] = $row;
                $i = $key + 1;
                $cellIndex = $index[$key] . '1';
                $spreadsheet->getActiveSheet()->setCellValue($cellIndex, $cell);
            }
        }
        foreach ($datalist as $key => $row) {
            foreach ($attrs as $akey => $attr) {
                if ($attr == 'qr') {
                    $cell = Url::toRoute(['/go/act', 'sn' => $row->sn, 'code' => $row->sn_code], true);
                } elseif ($attr == 'created_at') {
                    $cell = date('Y-m-d H:i:s', $row->$attr);
                } else {
                    $cell = $row->$attr;
                }
                $i = $key + 2;
                $cellIndex = $index[$akey] . $i;
                $spreadsheet->getActiveSheet()->setCellValueExplicit($cellIndex, $cell, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
            }
        }

        if ($fmt == 'csv') {
            $writer = IOFactory::createWriter($spreadsheet, 'Csv')->setDelimiter(',')->setEnclosure('"')->setUseBOM(true);
        } elseif ($fmt == 'xls') {
            $writer = IOFactory::createWriter($spreadsheet, 'Xls');
            $mime = 'application/vnd.ms-excel';
        } else {
            $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
            $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
        }
        $filename = $name ? $name : date('ymd_Hi_s') . Utils::randStr(6, 6);
        Yii::$app->response->setDownloadHeaders($filename . $ext, $mime)->send();
        $writer->save("php://output");
    }