【发布时间】:2017-06-21 03:28:50
【问题描述】:
我将列标题用作数组索引(第 1 行),我不想在他们开始上传列标题不正确(或有时缺失)的 XLSX 文件时遇到问题。
我发现这个答案非常有用。我可以将我的数组索引作为列标题:
for ($row = 2; $row <= $highestRow; $row++){
// Read a row of data into an array
$rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row,
NULL,
TRUE,
FALSE);
$rowData[0] = array_combine($headings[0], $rowData[0]);
}
这就是我想要发生的事情:
- 首先检查列标题是否与列匹配
我之前提供的标题(在数组中,所以我可以在循环中使用
in_array) 将其写入数据库。 - 如果标题正确,我现在将数组索引转换为列标题(因此,它现在应该返回
[firstname],而不是[0]),否则会抛出错误消息。 - 写入数据库,其中我的数据库中的列名与其 XLSX 文件中的列标题名称完全匹配(或者如果不匹配,至少与查询匹配)。 (我称它们为“列映射”)。
长话短说,这是我的代码:
try {
$inputFileName = $_FILES['file']['tmp_name'];
$inputFileType = PHPExcel_IOFactory::identify($inputFileName);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFileName);
//-- Get worksheet dimensions
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();
$headings = $sheet->rangeToArray('A1:'.$highestColumn.'1', NULL, TRUE, FALSE);
//-- $row = 2 <- skip row 1 since this is our headers
for($row = 2; $row <= $highestRow; $row++) {
//-- Read a row of data into an array
$xlsxRow = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
//-- Combine to replace indexes with header names
$xlsxRow[0] = array_combine($headings[0], $xlsxRow[0]);
//-- Got stucked in here..
/*
If column header fails, should exit the loop
*/
//-- SQL query follows here..
}
那么有人可以帮我解决这个问题吗?
【问题讨论】:
-
您是否设法完成它的第一部分以将标题与数组匹配?为什么要更改标题索引的名称?而是编写一个函数并在可以在循环中使用的变量中获取该值。即
$firstName = $xlsxRow[0][0] -
因为我想将 Excel 文件的标题与我的数据库中的标题相匹配。因此,如果用户更改列的位置,数据将始终正确。示例,名字 |姓。但我想切换名字和姓氏的位置。当他/她在我的界面中上传数据时,数据仍然可以管理并正确插入各自的列中。你明白我的意思了吗?
-
所以我只需要知道如何首先检查列标题。如果一列或多列不正确,那么我必须取消查询以避免信息不匹配。
-
使用
array_diff检查标头是否通过并且您的数组是否匹配。如果false显示相应的错误。我仍然不明白需要更改索引名称。我有类似的要求,在 for 循环中我为适当的变量赋值并在循环中使用这些变量。