php读取Excel里面图片和内容
安装composer 新版office类
composer require phpoffice/phpspreadsheet
和安装
composer require intervention/image 这个类依赖images这个扩展imagemagick用来写入压缩图片和生成图片
下面是 使用方法 有参考 这个作者的方法 然后改了一部分.因为他的在我本机无法生成图片
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use Intervention\Image\ImageManagerStatic as Image;
public function POST_addAction()
{
$imageFilePath = APP_PATH . "/public/uploads/exce/"; //图片本地存储的路径
if (!file_exists($imageFilePath)) {
//如果目录不存在则递归创建
mkdir($imageFilePath, 0777, true);
}
$reader = IOFactory::createReader('Xlsx');
$reader->setReadDataOnly(TRUE);
$filePath = APP_PATH . "/public/uploads/1.xlsx";
try {
$objSpreadsheet = $reader->load($filePath);
$objWorksheet = $objSpreadsheet->getSheet(0);
//获取excel所有内容,不包含图片
$data = $objWorksheet->toArray();
// $objWorksheet->getDrawingCollection() 这个方法是获取获取带图片的对象,
//然后通过遍历得到每一个图片和所在的行和列
//最后通过覆盖$data的方法写入所有真实图片绝对路径到 data中
foreach ($objWorksheet->getDrawingCollection() as $key => $drawing) {
list($startColumn, $startRow) = Coordinate::coordinateFromString($drawing->getCoordinates());
$imageFileName = $drawing->getCoordinates() . mt_rand(1000, 9999);
switch ($drawing->getExtension()) {
case 'jpg':
case 'jpeg':
$imageFileName .= '.jpg';
$source = imagecreatefromjpeg($drawing->getPath());
//得到excel里面图片的地址资源
Image::make($source)->save($imageFilePath . $imageFileName,50);
//利用imagemagick扩展生成图片如果太大还可以压缩一下.50代表压缩比率(中等质量)
break;
case 'gif':
$imageFileName .= '.gif';
$source = imagecreatefromgif($drawing->getPath());
Image::make($source)->save($imageFilePath . $imageFileName,50);
break;
case 'png':
$imageFileName .= '.png';
$source = imagecreatefrompng($drawing->getPath());
Image::make($source)->save($imageFilePath . $imageFileName,50);
break;
}
$startColumn = $this->ABC2decimal($startColumn);
$data[$startRow - 1][$startColumn] = $imageFilePath . $imageFileName;
}
dump($data);
} catch (\Exception $e) {
$this->error($e->getMessage());
}
}
/**
* @param $abc 传入B列 exce的列数 例如:ABCDE的其中一个
* @return float|int 返回所代表的 第几列 A代表第一列 B代表第2列
*/
private function ABC2decimal($abc)
{
$ten = 0;
$len = strlen($abc);
for ($i = 1; $i <= $len; $i++) {
$char = substr($abc, 0 - $i, 1);//反向获取单个字符
$int = ord($char);
$ten += ($int - 65) * pow(26, $i - 1);
}
return $ten;
}