对于PhpSheet我浅显的理解——Php中用来表格读写的工具。(我是在tp5下使用的)
其支持的文件格式:
读文件
//第一步创建读操作
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
//设置只读(不设置应该也没大问题)
$reader->setReadDataOnly(TRUE);
//导入文件
$spreadsheet = $reader->load("test.xlsx");
写文件
如果重复写入同一文件会直接覆盖原文件的内容
//第一步创建写操作
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); //按照指定格式生成Excel文件
//导出文件
$writer->save('filename.xlsx');
获取工作表
当从电子表格文件加载工作簿时,它将与所有现有工作表一起加载(除非指定仅应加载某些工作表)
法1.通过索引位置访问工作表:
$countSheet = $spreadsheet -> getSheetCount(); //获取工作表数量
for ($i = 0; $i < $countSheet; $i++)
{
$currentSheet = $spreadsheet -> getSheet($i); //获取工作表内容
$dataArray[$i] = $currentSheet -> toArray(); //转换为数组
print_r($dataArray[$i]);
}
法2.通过名称访问工作表:
$dataArray = [];
$currentSheet = $spreadsheet->getSheetByName('Sheet1');
$dataArray = $currentSheet->toArray();
var_dump($dataArray);
获取单元格
获取单个单元格:
//1.实例化 Spreadsheet 对象(导入文件的话就不用new了)
$spreadsheet = new Spreadsheet();
//2.获取活动工作薄
$sheet = $spreadsheet->getActiveSheet();
获取单元格A1的值,这将检索单元格中包含的原始,未格式化的值(比如日期,取出来的就是时间戳)。
$cellValue = $sheet->getCell('A1')->getValue();
如果单元格包含一个公式,而且需要检索计算的值而不是公式本身,则使用该单元格的 getCalculatedValue()方法。关于getCalculatedValue()这将在计算引擎中再做补充 。
$cellValue = $sheet->getCell('A1')->getCalculatedValue();
如果要查看应用了任何单元格格式的值(例如,对于人类可读的日期或时间值),可以使用单元格的getFormattedValue()方法。
$cellValue = $sheet->getCell('A1')->getFormattedValue();
单元格获取也通过坐标值检索,如B5坐标值为(2,5),先列后行。
$cellValue = $sheet->getCellByColumnAndRow(2, 5)->getValue();
获取一定范围内的单元格到数组中:
toArray()方法将返回整个工作表;rangeToArray() 将返回指定的范围或单元格;namedRangeToArray()将返回定义内的单元格。这些方法都将返回一个二维的行和列数组。
//rangeToArray
$dataArray = $sheet->rangeToArray(
'C3:E5', // 读取范围
NULL, // 空单元格要返回的默认值
TRUE, // 若是公式则返回计算值
TRUE, // 返回格式化后的值
TRUE // 数组的坐标和表中的一致
);
遍历表格:
法1.使用迭代器
foreach ($sheet->getRowIterator() as $row) //行迭代器
{
$cellIterator = $row->getCellIterator();//列迭代器
$cellIterator->setIterateOnlyExistingCells(FALSE);
foreach ($cellIterator as $cell) {
$cell->getValue() ;
echo $value . PHP_EOL;//打印
}
}
将单元格迭代器设置 setIterateOnlyExistingCells()为FALSE。这使得迭代器循环工作表范围内的所有单元格,即使它们尚未设置。
将单元格迭代器设置 setIterateOnlyExistingCells()为false会循环工作表中当时可用的所有单元格。如果需要,这将创建新的单元并增加内存使用!仅在打算循环所有可用单元时才使用它。(最好还是使用第二个方法的意思吧emm maybe)
法2.按坐标值遍历
$highestRow = $sheet->getHighestRow(); // 获取总行数
$highestColumn = $sheet->getHighestColumn(); // 获取总列数(这里是ABCD)
$highestColumnIndex= \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn); // 获取总列数(数字值)
for ($row = 1; $row <= $highestRow; ++$row) {
for ($col = 1; $col <= $highestColumnIndex; ++$col) {
$value = $sheet->getCellByColumnAndRow($col, $row