PHPOffice读取数据

编程

在开发中经常遇到从Excel中读取数据内容的场景,这里使用PHPOffice库来实现,如下

<?php

namespace AppServicesMisc;

use Exception;

use PhpOfficePhpSpreadsheetReaderXlsx;

use PhpOfficePhpSpreadsheetReaderXls;

use PhpOfficePhpSpreadsheetIOFactory;

use PhpOfficePhpSpreadsheetCellCoordinate;

class Excel

{

public function __construct()

{

}

/**

* 使用PHPEXECL导入

* @param string $filePath 文件路径地址

* @param int $sheet 文件的sheet序号,从0开始

* @param int $columnCnt 每个sheet读多少个字段

* @param array $options

* @return array 二维数组,每一个元素为一个数组,表示一列的数据。

* 键为A,B,C的列号,值为该行所对应列的单元格内的值,第一个元素为表头

* @throws Exception

*/

function importExecl(string $filePath = "", int $sheet = 0, int $columnCnt = 0, &$options = [])

{

try {

/* 转码 */

$filePath = iconv("utf-8", "gb2312", $filePath);

if (empty($filePath) or !file_exists($filePath)) {

throw new Exception("文件不存在!");

}

/** @var Xlsx $objRead */

$objRead = IOFactory::createReader("Xlsx");

if (!$objRead->canRead($filePath)) {

/** @var Xls $objRead */

$objRead = IOFactory::createReader("Xls");

if (!$objRead->canRead($filePath)) {

throw new Exception("只支持导入Excel文件!");

}

}

/* 如果不需要获取特殊操作,则只读内容,可以大幅度提升读取Excel效率 */

empty($options) && $objRead->setReadDataOnly(true);

/* 建立excel对象 */

$obj = $objRead->load($filePath);

/* 获取指定的sheet表 */

$currSheet = $obj->getSheet($sheet);

if (isset($options["mergeCells"])) {

/* 读取合并行列 */

$options["mergeCells"] = $currSheet->getMergeCells();

}

if (0 == $columnCnt) {

/* 取得最大的列号 */

$columnH = $currSheet->getHighestColumn();

/* 兼容原逻辑,循环时使用的是小于等于 */

$columnCnt = Coordinate::columnIndexFromString($columnH);

}

/* 获取总行数 */

$rowCnt = $currSheet->getHighestRow();

$data = [];

/* 读取内容 */

for ($_row = 1; $_row <= $rowCnt; $_row++) {

$isNull = true;

for ($_column = 1; $_column <= $columnCnt; $_column++) {

$cellName = Coordinate::stringFromColumnIndex($_column);

$cellId = $cellName . $_row;

$cell = $currSheet->getCell($cellId);

if (isset($options["format"])) {

/* 获取格式 */

$format = $cell->getStyle()->getNumberFormat()->getFormatCode();

/* 记录格式 */

$options["format"][$_row][$cellName] = $format;

}

if (isset($options["formula"])) {

/* 获取公式,公式均为=号开头数据 */

$formula = $currSheet->getCell($cellId)->getValue();

if (0 === strpos($formula, "=")) {

$options["formula"][$cellName . $_row] = $formula;

}

}

if (isset($format) && "m/d/yyyy" == $format) {

/* 日期格式翻转处理 */

$cell->getStyle()->getNumberFormat()->setFormatCode("yyyy/mm/dd");

}

$data[$_row][$cellName] = trim($currSheet->getCell($cellId)->getFormattedValue());

if (!empty($data[$_row][$cellName])) {

$isNull = false;

}

}

/* 判断是否整行数据为空,是的话删除该行数据 */

if ($isNull) {

unset($data[$_row]);

}

}

return $data;

} catch (Exception $e) {

throw $e;

}

}

}

此方法返回一个二维数组,每一个元素为一个一维数组,表示一列的数据,其中键为A,B,C等列号,值为该行所对应列的单元格内的值。第一个元素为表头数据。

以上是 PHPOffice读取数据 的全部内容, 来源链接: utcz.com/z/512076.html

回到顶部