在利用php读取Excel时,当前(2019年)流行的做法是利用composer安装PhpSpreadsheet(composer require phpoffice/phpspreadsheet)来操作,示例代码如下:
$abs_excel_path = $_SERVER['DOCUMENT_ROOT'] . '/data.xlsx';
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($abs_excel_path);
$worksheet = $spreadsheet->getActiveSheet();
$highestRow = $worksheet->getHighestRow(); // 总行数1, 2,3
$rows = [];
for ($rowIndex = 2; $rowIndex <= $highestRow; $rowIndex++) {
$row['code'] = $worksheet->getCell("B{
$rowIndex}")->getValue();
$row['name'] = $worksheet->getCell("C{
$rowIndex}")->getValue();
$row['unit'] = strval($worksheet->getCell("D{
$rowIndex}")->getValue());
$row['price'] = $worksheet->getCell("E{
$rowIndex}")->getValue();
$row['quantity'] = $worksheet->getCell("F{
$rowIndex}")->getCalculatedValue(); // 获得公式计算值
$row['amount'] = $worksheet->getCell("G{
$rowIndex}")->getCalculatedValue(); // 获得公式计算值
$row['date'] = $worksheet->getCell("G{
$rowIndex}")->getFormattedValue(); // 获得日期的格式化数值
if (!$row['code'] || $row['code'] == 'NULL') {
$row['code'] = $row['name'];
}
$rows[] = $row;
}
读取单元格数值是有坑的。
1、读取数值,要担心万一某些单元格写的是公式,比如“=1900+200”,或=SUM(G2:G5)等,这里看到单元格里写的是数字,但鼠标点击单元格可看到写的是公式,这样使用getValue方法将得到公式本身,而不是计算过的值,应使用getCalculatedValue。
2、读取日期、时间时,getValue得到的是Excel里存储的数值,比如日期是以1900年1月1日为整数1,每过一天加1的数值。比如时间是同php的time()的值,虽然显示是格式化好的字符串,但读取到的是存储的数字。这里应使用getFormattedValue。
另外,如果ABCDEFG也要使用程序的变量来代替,最好是用getCellByColumnAndRow($columnIndex, $row, c r e a t e I f N o t E x i s t s = t r u e ) 代 替 g e t C e l l ( createIfNotExists = true)代替getCell( createIfNotExists=true)代替getCell(pCoordinate, c r e a t e I f N o t E x i s t s = t r u e ) , 并 且 createIfNotExists = true),并且 createIfNotExists=true),并且columnIndex是从1开始的列数,而$row是从0开始的行数。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。