PhpSpreadsheet导出Excel表格,长数字自动转科学计数法 2019-08-30

简介: 凡数字超过11位数,Excel 表格就会用科学记数法显示。如果要输入超过11位的数,得把单元格设为文本形式或在输入数字前先输入一个英文单引号(’)。(单引号在英文输入法下输入)

原代码


public function down($data)
{
    $spreadsheet = new Spreadsheet();
    $sheet       = $spreadsheet->getActiveSheet();
    $lieCount = count($data['data'][0]);
    # 全部设为自动列宽
    for($i=65;$i< (65 +$lieCount);$i++){
        $sheet->getColumnDimension(strtoupper(chr($i)))->setAutoSize(true);
    }
    # 最快捷设置数据
    $sheet->fromArray($data['data']);
    # 导出
    $writer = new Xlsx($spreadsheet);
    $writer->save('php://output');
}


这样子就可以实现传入一个数组data,然后快速导出成Excel表格了。 但是遇到长数字的时候,就会被转成科学计数法的数字,并且会丢失最后的精度 全部转成了 0 原因:


凡数字超过11位数,Excel 表格就会用科学记数法显示。如果要输入超过11位的数,得把单元格设为文本形式或在输入数字前先输入一个英文单引号(’)。(单引号在英文输入法下输入)


也就是在传入data之前先遍历 添加符号 但是这样子在我们程序自动导出是不能生效的,需要我们再 双击单元格 它才会转

成文本形式。 导出后的效果为 '11111111111111


网上的方案 ( PHPExcel 旧版的 )


  1. 在数据前后加上 \t' 差不多
  2. $objActSheet->setCellValueExplicit(‘A1’, ‘330602198804224688’, PHPExcel_Cell_DataType::TYPE_STRING);
  3. $objActSheet->setCellValue(‘A1’, ‘ ‘.’330602198804224688’);


PhpSpreadsheet 解决


当然是除了拼接字符串的方案了! 以下划重点 要考!


PhpSpreadsheet也有它的前驱者PHPExcel一样的方式,可以通过setCellValueExplicit指定方案。 所以将原来的程序改造成以下


private $mustStringArray = [];
/**
 * 将列强制设置成文本,避免长文本出现转科学计数法
 * @param array $array
 */
function setMustString(Array $array)
{
    $this->mustStringArray = $array;
}
/**
 * 导出表格
 * @todo 弹窗导出表格
 * @param $data array 数组 可选:filename文件名,data数据(二维数组),
 * @return bool
 * @throws \PhpOffice\PhpSpreadsheet\Exception
 * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
 */
public function down($data)
{
    if (empty($data)) return false;
    $filename = !empty($data['filename']) ? $data['filename'] . ".xlsx" : date('Y-m-d H:i:s') . ".xlsx";
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename="' . $filename . '"');
    header('Cache-Control: max-age=0');
    $spreadsheet = new Spreadsheet();
    $sheet       = $spreadsheet->getActiveSheet();
    $lieCount = count($data['data'][0]);
    for($i=65;$i< (65 +$lieCount);$i++){
        $sheet->getColumnDimension(strtoupper(chr($i)))->setAutoSize(true);
    }
    // 以下代码基于fromArray改造
    // 开始列和开始行数,默认全部
    $startColumn = 'A';
    $startRow = '1';
    foreach ($data['data'] as $rowData) {
        $currentColumn = $startColumn;
        foreach ($rowData as $cellValue) {
                if ($cellValue !== null) {
                    if (in_array($currentColumn, $this->mustStringArray)){
                        $sheet->getCell($currentColumn . $startRow)->setValueExplicit($cellValue,'s');
                    }else{
                        $sheet->getCell($currentColumn . $startRow)->setValue($cellValue);
                    }
                }
            ++$currentColumn;
        }
        ++$startRow;
    }
    $writer = new Xlsx($spreadsheet);
    $writer->save('php://output');
}


关键代码


$sheet->getCell($currentColumn . $startRow)->setValueExplicit($cellValue,'s');


第二个参数其实也是要传入一个类的静态变量,然后我追踪了它的代码,直接将值给写进去了~ 有兴趣的同学可以查看这个类文件 PhpOffice\PhpSpreadsheet\Cell\DataType 里面还有其他几个类型的常量列表


// Data types
const TYPE_STRING2 = 'str';
const TYPE_STRING = 's';
const TYPE_FORMULA = 'f';
const TYPE_NUMERIC = 'n';
const TYPE_BOOL = 'b';
const TYPE_NULL = 'null';
const TYPE_INLINE = 'inlineStr';
const TYPE_ERROR = 'e';
目录
相关文章
|
1月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
135 5
|
28天前
|
前端开发
实现Excel文件和其他文件导出为压缩包,并导入
实现Excel文件和其他文件导出为压缩包,并导入
28 1
|
1月前
|
数据格式 UED
记录一次NPOI库导出Excel遇到的小问题解决方案
【11月更文挑战第16天】本文记录了使用 NPOI 库导出 Excel 过程中遇到的三个主要问题及其解决方案:单元格数据格式错误、日期格式不正确以及合并单元格边框缺失。通过自定义单元格样式、设置数据格式和手动添加边框,有效解决了这些问题,提升了导出文件的质量和用户体验。
170 3
|
1月前
|
SQL 数据可视化 数据挖掘
想让Excel表格设计更美观?试试这几款好用工具!
Excel表格设计在项目管理和数据分析中至关重要。本文推荐四款辅助工具:板栗看板、Excel自动图表助手、Think-Cell Chart 和 Power BI,分别在任务管理、图表生成、数据可视化等方面表现突出,帮助你设计出更专业、美观的表格。
73 2
|
1月前
|
Java API Apache
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
57 4
|
21天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
2月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
153 4
|
4月前
|
关系型数据库 MySQL Shell
不通过navicat工具怎么把查询数据导出到excel表中
不通过navicat工具怎么把查询数据导出到excel表中
52 0
|
2月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
95 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档