PHPOffice读取数据
在开发中经常遇到从Excel中读取数据内容的场景,这里使用PHPOffice库来实现,如下
<?phpnamespace 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