PhpSpreadsheet读取excel【包含图片】

时间:2023-01-02 00:44:04


​composer require​​​ ​​phpoffice/phpspreadsheet=1.8.2​

​安装 phpspreadsheet​​ 

$reader           = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx'); //实例化阅读器对象。
$spreadsheet = $reader->load($filename); //将文件读取到到$spreadsheet对象中
$sheet = $spreadsheet->getSheet(0);//sheet
$highestColumn = $sheet->getHighestColumn(); // 取得总列数
$highestRow = $sheet->getHighestRow(); // 取得总行数

 

for ($col = 1; $col <= $highestColumnIndex; ++$col) //列数是以A列开始
{
$column_name = $sheet->getCellByColumnAndRow($col, 1)->getFormattedValue();
if(in_array($column_name,array_keys($format_column)))$column[] = ['clo' => $col,'key' => $format_column[$column_name]];
}
// 2 根据以上确定的列直接循环取值
for ($row = 2; $row <= $highestRow; ++$row) //行号从1开始
{
$row_data = [];
foreach ($column as $item){
switch ($item['key']) {
case "tax":
$value = $sheet->getCellByColumnAndRow($item['clo'], $row)->getFormattedValue();
if(strpos($value, "%") > 0) $value = (float)$value/100;
$row_data[$item['key']] = $value;
break;
case "num" :
$row_data[$item['key']] = (int)$sheet->getCellByColumnAndRow($item['clo'], $row)->getCalculatedValue(true);
break;
case "money":
$res = $sheet->getCellByColumnAndRow($item['clo'], $row)->getFormattedValue();
$row_data[$item['key']] = str_replace(['¥', ','], '', $res);//一般先取出结果,然后自己处理比较方便。
break;
case "time":
$date = $sheet->getCellByColumnAndRow($item['clo'], $row)->getValue();
if(!$date){
$row_data[$item['key']] = null;
}else{
$row_data[$item['key']] = gmdate('Y-m-d', ($date - 25569) * 24 * 3600); //gmdate返回UTC的时间
}
break;
default :
$row_data[$item['key']]= Common::trim($sheet->getCellByColumnAndRow($item['clo'], $row)->getFormattedValue());
}
}
if(count($row_data) != count($format_column)) throw new ApiException(Code::EXCEL_FORMAT_ERROR);
//空数据过滤
$res_data[] = $row_data;
}
$this->filterData($res_data);
return array_values($res_data);

//过滤空数据
private function filterData(&$row_data)
{
foreach ($row_data as $key => $item){
$is_null = false;
foreach ($item as $iv) {
if(!empty($iv)) {
$is_null = true; break;
}
}
if($is_null == false ) unset($row_data[$key]);
}
}

 这里导入的时候会报错:

simplexml_load_string(): Entity: line 2: parser error : Input is not proper UTF-8...

我看到里边报错的地方在Properties.php,当我输出$propertyData是乱码的,所以对其进行转码

PhpSpreadsheet读取excel【包含图片】

PhpSpreadsheet读取excel【包含图片】

 到了这里是没有任何问题的,但当我把写的转码删除居然又成功了,经过反复思考,我觉得是Properties.php这个文件的编码问题,当我用编辑器修改的时候,编码就变回正常的UTF-8了,个人想法是这样的,如果遇到不同看法的可以留言给我,谢谢!

创作不易,如果能够解决您的问题,请给我点个赞

作者:Mark