maatwebsite/Excel 3.0 导出 Excel 如何设置长数字为文本

use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
.
.
.
public function columnFormats(): array
{
    return [
        'A' =>NumberFormat::FORMAT_TEXT ,
    ];
}

file
我尝试用这样的方式导出 无法将身份证正确导出 ,被转换成科学计数法

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

我这里是 'C','D', 'H' 这几列是超过15位数字,自动转换为了科学计数法,所以直接绑定这几列即可。

use PhpOffice\PhpSpreadsheet\Cell\Cell;
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder;
use Maatwebsite\Excel\Concerns\WithCustomValueBinder;

class ExpertMonthFinanceExport extends DefaultValueBinder implements WithCustomValueBinder

{
    public function bindValue(Cell $cell, $value)
    {
        $column = $cell->getColumn();
        if (in_array( $column, ['C','D', 'H'])) {
            $cell->setValueExplicit($value, DataType::TYPE_STRING);
            return true;
        }
        return parent::bindValue($cell, $value);
    }
}
3年前 评论
chaishuai 1年前
storefee (作者) 1年前
chaishuai 1年前
讨论数量: 18

我这里是 'C','D', 'H' 这几列是超过15位数字,自动转换为了科学计数法,所以直接绑定这几列即可。

use PhpOffice\PhpSpreadsheet\Cell\Cell;
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder;
use Maatwebsite\Excel\Concerns\WithCustomValueBinder;

class ExpertMonthFinanceExport extends DefaultValueBinder implements WithCustomValueBinder

{
    public function bindValue(Cell $cell, $value)
    {
        $column = $cell->getColumn();
        if (in_array( $column, ['C','D', 'H'])) {
            $cell->setValueExplicit($value, DataType::TYPE_STRING);
            return true;
        }
        return parent::bindValue($cell, $value);
    }
}
3年前 评论
chaishuai 1年前
storefee (作者) 1年前
chaishuai 1年前
  • 1)就是在导出的时候加上一个单引号字符,这个方法我不太满意
  • 2)就是到导出的时候先加上特殊字符,我这边使用的是'ZWF', 然后通过registerEvents方法再做去除
  public function registerEvents(): array
    {
        return [
            AfterSheet::class => function (AfterSheet $event) {
                $columns = ['A','B','C','V']; //替换的列
                for ($i = 1; $i <= $event->sheet->getHighestRow(); $i++) {
                    foreach ($columns as $column) {
                        $event->sheet->setCellValueExplicit($column . $i,
                            ltrim($event->sheet->getCell($column . $i), 'ZWF'),
                            DataType::TYPE_STRING);
                    }
                }
            },
        ];
    }
  • 3) 个人建议再去看下最新版是否已经修复这个问题
4年前 评论
Epona

@springlee 这个和代码无关的,正常 Excel里面 位数很多的数字自动会显示成科学计数法,你说的第一种才是正解,在数字前面加个单引号,Excel会显示为文本

4年前 评论
woowli 4年前

我也遇到这个问题,已经解决。
说是Excel问题的,请不要误导别人。
官方手册解决方案:https://docs.laravel-excel.com/3.1/exports...

4年前 评论
wanghan 3年前
Ad_jiang (作者) 3年前

建议的做法就是楼上说的第一种,加一个符号,因为变成科学计数法是 EXCEL 自动进行转化的,和你程序没有一毛钱关系

4年前 评论
Ad_jiang 4年前

在末尾加了一个空格的字符串,是可以成功的,不过导出的结果中后面跟了一个空格 :joy:

4年前 评论

前后拼接 "\t" 输出后就可以正常显示数字

4年前 评论
wuwuwuwu 4年前

我这里是 'C','D', 'H' 这几列是超过15位数字,自动转换为了科学计数法,所以直接绑定这几列即可。

use PhpOffice\PhpSpreadsheet\Cell\Cell;
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder;
use Maatwebsite\Excel\Concerns\WithCustomValueBinder;

class ExpertMonthFinanceExport extends DefaultValueBinder implements WithCustomValueBinder

{
    public function bindValue(Cell $cell, $value)
    {
        $column = $cell->getColumn();
        if (in_array( $column, ['C','D', 'H'])) {
            $cell->setValueExplicit($value, DataType::TYPE_STRING);
            return true;
        }
        return parent::bindValue($cell, $value);
    }
}
3年前 评论
chaishuai 1年前
storefee (作者) 1年前
chaishuai 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!