У меня есть файл .xlsx с двумя листами, и я хочу извлечь в PHP второй лист, так же, как это. Проблема в том, что столбец на этом листе связан с первым, поэтому результаты, которые я получаю, когда печатаю извлеченные значения, представляют собой своего рода смесь между вторым листом и связанной строкой из первого.
Я не уверен, как я могу показать вам Excel, но я покажу код, надеясь, что у кого-то уже была подобная проблема.
public function excel()
{
error_reporting(E_ALL ^ E_NOTICE);
#system variables
header('Content-Type: text/html; charset=utf-8');
set_time_limit(0);
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
ini_set('memory_limit', '128M');
#includes
include FCPATH.'application/libraries/phpexcel/PHPExcel.php';
set_include_path(FCPATH.'application/libraries/phpexcel/PHPExcel/'); //INCLUDE DOS FICHEIROS DO PHPEXCEL
require_once 'IOFactory.php';
$inputFileName = BASE_DIR.'assets/misc/cc_v2.xlsx';
//$reader = PHPExcel_IOFactory::createReaderForFile($inputFileName);
$reader = PHPExcel_IOFactory::createReader('Excel2007');
$reader->setReadDataOnly(true);
$objPHPExcel = $reader->load($inputFileName);
$objPHPExcel->setActiveSheetIndex(1);
$objWorksheet = $objPHPExcel->getActiveSheet();
$highestRow = $objWorksheet->getHighestRow();
$highestColumn = $objWorksheet->getHighestColumn();
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
for ($row = 1; $row <= $highestRow; ++$row)
{
for ($col = 0; $col <= $highestColumnIndex; ++$col)
{
echo $objWorksheet->getCellByColumnAndRow($col, $row)->getOldCalculatedValue()."\n";
}
echo "<br>";
}
}
Таким образом, я получаю смесь обоих листов из-за их зависимости. Уже пытались удалить первый лист, но при этом на втором листе был столбец с неработающими ссылками.
Заранее спасибо.
РЕДАКТИРОВАТЬ:
Вот формула для ячеек B столбца, которая вызывает «проблему» получения значения ячейки с помощью PHP:
=IF(ISNA(A8);"";VLOOKUP(A8;Clientes!$B:$C;2;FALSE))
«Клиенты» — это название первого листа.
В заключение, на листе 1 есть список клиентов, а на листе 2 — список всех расходов.
Столбец B из листа 2 — это имя клиента, но при получении его с помощью PHPExcel я получаю несколько значений из листа 1 вместо значения, которое я вижу в столбце B из листа 2.
Например, ячейка B3 имеет значение «BPI», которое возвращается с первого листа.
РЕДАКТИРОВАТЬ 2:
При запуске кода с getCalculatedValue()
вместо этого я получаю следующую ошибку:
Fatal error: Uncaught exception 'PHPExcel_Calculation_Exception' with message 'CONTA!B2 -> Formula Error: An unexpected error occured' in /home/clientes/versions/v3/application/libraries/phpexcel/PHPExcel/Cell.php:300 Stack trace: #0 /home/clientes/versions/v3/application/controllers/pm_dashboard.php(269): PHPExcel_Cell->getCalculatedValue() #1 [internal function]: Pm_dashboard->excel('fyi', 'drKzj1ykfqUXXBV...') #2 /home/clientes/versions/v3/system/core/CodeIgniter.php(359): call_user_func_array(Array, Array) #3 /home/clientes/versions/v3/index.php(209): require_once('/home/clientes/...') #4 {main} thrown in /home/clientes/versions/v3/application/libraries/phpexcel/PHPExcel/Cell.php on line 300
Вот, если это содержит строку 300 Cell.php:
if ($this->_dataType == PHPExcel_Cell_DataType::TYPE_FORMULA) {
try {
//echo 'Cell value for '.$this->getCoordinate().' is a formula: Calculating value'.PHP_EOL;
$result = PHPExcel_Calculation::getInstance(
$this->getWorksheet()->getParent()
)->calculateCellValue($this,$resetLog);
//echo $this->getCoordinate().' calculation result is '.$result.PHP_EOL;
// We don't yet handle array returns
if (is_array($result)) {
while (is_array($result)) {
$result = array_pop($result);
}
}
} catch ( PHPExcel_Exception $ex ) {
if (($ex->getMessage() === 'Unable to access External Workbook') && ($this->_calculatedValue !== NULL)) {
//echo 'Returning fallback value of '.$this->_calculatedValue.' for cell '.$this->getCoordinate().PHP_EOL;
return $this->_calculatedValue; // Fallback for calculations referencing external files.
}
//echo 'Calculation Exception: '.$ex->getMessage().PHP_EOL;
$result = '#N/A';
#NEXT IS LINE 300
throw new PHPExcel_Calculation_Exception(
$this->getWorksheet()->getTitle().'!'.$this->getCoordinate().' -> '.$ex->getMessage()
);
}
Хорошо, после просмотра вашей формулы:
=IF(ISNA(A8);"";VLOOKUP(A8;Clientes!$B:$C;2;FALSE))
Я заметил одну, но повторяющуюся вещь: ваши аргументы разделяются точкой с запятой (;
) в то время как Excel
Аргументы функции, как и в любом другом языке, разделяются ,
,
Я думаю, что формула должна идти:
=IF(ISNA(A8),"",VLOOKUP(A8,Clientes!$B:$C,2,FALSE))
Другое дело: не VLOOPUP
должен получить диапазон ячеек в качестве первого аргумента? $B:$C
это странно для меня, но я не эксперт по Excel 🙂
Других решений пока нет …