Php excel удалить строку

Иногда бывают случаи, когда нужно заполнить некий уже сформатированный xls-файл в PHP. Библиотека PHPExcel (PHPExcel.zip) тоже это умеет, включая дописывание, добавление и удаление строк.

Для примера заполним бланк счета на оплату в формате xls и xlsx:

1

Формат xls

schet.xls

//spl_autoload_unregister('autoload');
require_once __DIR__ . '/PHPExcel/Classes/PHPExcel.php';
require_once __DIR__ . '/PHPExcel/Classes/PHPExcel/Writer/Excel5.php';
require_once __DIR__ . '/PHPExcel/Classes/PHPExcel/IOFactory.php';
			
$objReader = PHPExcel_IOFactory::createReader('Excel5');
$objPHPExcel = $objReader->load(__DIR__ . '/schet.xls');
$sheet = $objPHPExcel->getActiveSheet();
			
// Дописываем номер накладной
$sheet->setCellValue('B13', $sheet->getCell('B13')->getValue() . '123 от ' . date('d.m.Y'));	

// Покупатель
$sheet->setCellValue('F19', 'ООО "Рога и копыта"');	
			
// Функция для копирования строк
function copyRowFull(&$sheet, $from, $to)
{
	$sheet->getRowDimension($to)->setRowHeight($sheet->getRowDimension($from)->getRowHeight());
	$lastColumn = $sheet->getHighestColumn();
	++$lastColumn;
	for ($c = 'A'; $c != $lastColumn; ++$c) {
		$cell_from = $sheet->getCell($c . $from);
		$cell_to = $sheet->getCell($c . $to);
		$cell_to->setXfIndex($cell_from->getXfIndex());
		$cell_to->setValue($cell_from->getValue());
		$cell_from = $sheet->getCell($c . $from); 
		if($cell_from->isMergeRangeValueCell()) { 
			$col = PHPExcel_Cell::coordinateFromString(PHPExcel_Cell::splitRange($cell_from->getMergeRange())[0][1])[0]; 
			$sheet->mergeCells($c . $to . ':' . $col . $to); 
		}
	}
}

// Заполняем таблицу с товарами	
$prods = array(
	array(
		'sku'   => '8545775',
		'name'  => 'Боксерские перчатки GREEN HILL Super Star (без марки AIBA)',
		'price' => '6060',
		'count' => '2'
	),
	array(
		'sku'   => '865645',
		'name'  => 'Боксерский мешок 120X35, 46 кг',
		'price' => '9900',
		'count' => '1'
	),
	array(
		'sku'   => '865643',
		'name'  => 'Кронштейн для боксерского мешка',
		'price' => '4800',
		'count' => '3'
	),
);

$line = 22;
$total = 0;
$n = 1;
foreach ($prods as $row) {
	$i = $line + 1;
	$sheet->insertNewRowBefore($i, 1);
	copyRowFull($sheet, $line, $i);
	
	$sheet->setCellValue('B' . $line, ++$n);
	$sheet->setCellValue('D' . $line, $row['name']);
	$sheet->setCellValue('S' . $line, $row['count']);
	$sheet->setCellValue('W' . $line, 'шт');
	$sheet->setCellValue('Z' . $line, $row['price']);
	$sheet->setCellValue('AF' . $line, $row['price'] * $row['count']);
	
	$total += $row['price'] * $row['count'];
	$line++;	
}

// Удаляем лишнюю строку т.к. первая строка уже была  
$sheet->removeRow($line);

// Итого
$sheet->setCellValue('AF' . ($line + 1), $total);

// В том числе НДС
$sheet->setCellValue('AF' . ($line + 2), '');

// Всего к оплате:
$sheet->setCellValue('AF' . ($line + 3), $total);

// Всего наименований 																																				
$sheet->setCellValue('B' . ($line + 4), 'Всего наименований ' . count($prods) . ', на сумму ' . $total .  ' руб.');
																																		
// Сумма прописью
function str_price($value)
{
	$value = explode('.', number_format($value, 2, '.', ''));
	$f = new NumberFormatter('ru', NumberFormatter::SPELLOUT);
	$str = $f->format($value[0]);
	$str = mb_strtoupper(mb_substr($str, 0, 1)) . mb_substr($str, 1, mb_strlen($str));
	$num = $value[0] % 100;
	if ($num > 19) { 
		$num = $num % 10; 
	}	
	switch ($num) {
		case 1: $rub = 'рубль'; break;
		case 2: 
		case 3: 
		case 4: $rub = 'рубля'; break;
		default: $rub = 'рублей';
	}	
	
	return $str . ' ' . $rub . ' ' . $value[1] . ' копеек.';
}

$sheet->setCellValue('B' . ($line + 5), str_price($total));
	
// Сохранение в файл	
//$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
//$objWriter->save(__DIR__ . '/Счет.xls');

// Вывод в браузер
header("Expires: Mon, 1 Apr 1974 05:00:00 GMT");
header("Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=Счет.xls");
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
$objWriter->save('php://output'); 
exit();	

PHP

2

Формат xlsx

schet.xlsx

//spl_autoload_unregister('autoload');
require_once __DIR__ . '/PHPExcel/Classes/PHPExcel.php';
require_once __DIR__ . '/PHPExcel/Classes/PHPExcel/Writer/Excel2007.php';
require_once __DIR__ . '/PHPExcel/Classes/PHPExcel/IOFactory.php';
			
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objPHPExcel = $objReader->load(__DIR__ . '/schet.xlsx');
$sheet = $objPHPExcel->getActiveSheet();
			
// Дописываем номер накладной
$sheet->setCellValue('B13', $sheet->getCell('B13')->getValue() . '123 от ' . date('d.m.Y'));	

// Покупатель
$sheet->setCellValue('F19', 'ООО "Рога и копыта"');	
			
// Функция для копирования строк
function copyRowFull(&$sheet, $from, $to)
{
	$sheet->getRowDimension($to)->setRowHeight($sheet->getRowDimension($from)->getRowHeight());
	$lastColumn = $sheet->getHighestColumn();
	++$lastColumn;
	for ($c = 'A'; $c != $lastColumn; ++$c) {
		$cell_from = $sheet->getCell($c . $from);
		$cell_to = $sheet->getCell($c . $to);
		$cell_to->setXfIndex($cell_from->getXfIndex());
		$cell_to->setValue($cell_from->getValue());
		$cell_from = $sheet->getCell($c . $from); 
		if($cell_from->isMergeRangeValueCell()) { 
			$col = PHPExcel_Cell::coordinateFromString(PHPExcel_Cell::splitRange($cell_from->getMergeRange())[0][1])[0]; 
			$sheet->mergeCells($c . $to . ':' . $col . $to); 
		}
	}
}

// Заполняем таблицу с товарами:	
$prods = array(
	array(
		'sku'   => '8545775',
		'name'  => 'Боксерские перчатки GREEN HILL Super Star (без марки AIBA)',
		'price' => '6060',
		'count' => '2'
	),
	array(
		'sku'   => '865645',
		'name'  => 'Боксерский мешок 120X35, 46 кг',
		'price' => '9900',
		'count' => '1'
	),
	array(
		'sku'   => '865643',
		'name'  => 'Кронштейн для боксерского мешка',
		'price' => '4800',
		'count' => '3'
	),
);

$line = 22;
$total = 0;
$n = 1;
foreach ($prods as $row) {
	$i = $line + 1;
	$sheet->insertNewRowBefore($i, 1);
	copyRowFull($sheet, $line, $i);
	
	$sheet->setCellValue('B' . $line, ++$n);
	$sheet->setCellValue('D' . $line, $row['name']);
	$sheet->setCellValue('S' . $line, $row['count']);
	$sheet->setCellValue('W' . $line, 'шт');
	$sheet->setCellValue('Z' . $line, $row['price']);
	$sheet->setCellValue('AF' . $line, $row['price'] * $row['count']);
	
	$total += $row['price'] * $row['count'];
	$line++;	
}

// Удаляем лишнюю строку т.к. первая строка уже была  
$sheet->removeRow($line);

// Итого
$sheet->setCellValue('AF' . ($line + 1), $total);

// В том числе НДС
$sheet->setCellValue('AF' . ($line + 2), '');

// Всего к оплате
$sheet->setCellValue('AF' . ($line + 3), $total);

// Всего наименований 																																				
$sheet->setCellValue('B' . ($line + 4), 'Всего наименований ' . count($prods) . ', на сумму ' . $total .  ' руб.');
																																		
// Сумма прописью
function str_price($value)
{
	$value = explode('.', number_format($value, 2, '.', ''));
	$f = new NumberFormatter('ru', NumberFormatter::SPELLOUT);
	$str = $f->format($value[0]);
	$str = mb_strtoupper(mb_substr($str, 0, 1)) . mb_substr($str, 1, mb_strlen($str));
	$num = $value[0] % 100;
	if ($num > 19) { 
		$num = $num % 10; 
	}	
	switch ($num) {
		case 1: $rub = 'рубль'; break;
		case 2: 
		case 3: 
		case 4: $rub = 'рубля'; break;
		default: $rub = 'рублей';
	}	
	
	return $str . ' ' . $rub . ' ' . $value[1] . ' копеек.';
}

$sheet->setCellValue('B' . ($line + 5), str_price($total));
	
// Сохранение в файл	
//$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
//$objWriter->save(__DIR__ . '/Счет.xlsx');	

// Вывод в браузер
header("Expires: Mon, 1 Apr 1974 05:00:00 GMT");
header("Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
header("Content-type: application/vnd.ms-excel" );
header("Content-Disposition: attachment; filename=Счет.xlsx");
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007");
$objWriter->save('php://output');
exit();

PHP

3

Результат

$cell = $worksheet->getCell($column.$row);

Returns a Cell object and assigns it to $cell; you are then treating that cell object as though it was a string in your preg_match() call.

Surely you should be checking the value of the cell

$cell = $worksheet->getCell($column.$row)->getValue();

Additionally,

$objPHPExcel->getActiveSheet()->removeRow($row,$row);

Do you really mean to pass $row twice? Second argument is the number of rows to delete, first argument is the row number to start deleting, so if you pass $row is 5, then PHPExcel will delete 5 rows, starting at row number 5.

Surely you mean

$objPHPExcel->getActiveSheet()->removeRow($row, 1);

or simply

$objPHPExcel->getActiveSheet()->removeRow($row);

Мне нужно решение для загрузки файла Excel, где находится в столбце Список почтовых адресов, которые необходимо проверить.
Теперь мне нужно удалить все адреса Gmail в столбце А целой строкой.

Я сделал некоторый код, но он не удаляет все адреса Gmail в строке, я думаю, что сценарий удаляет каждую вторую строку, содержащую Gmail.

Может кто-нибудь проверить это и помочь мне?

Вот мой код:

// setup columns and rows for loop

$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();

//define $results from rows as array
$result = [];//loop column A and get values from each row in Array $results

for($row = 1; $row <= $highestRow; ++$row) {

$result[] = $sheet->getCell('A' .$row)->getValue();

}//remove gmail adresses in rows

foreach($result as $gmail){

if(preg_match('/gmail.com/', $gmail)) {

$objPHPExcel->getActiveSheet()->removeRow($row);

}

}

0

Решение

Начать с:

//define $results from rows as array
$result = [];//loop column A and get values from each row in Array $results

for($row = 1; $row <= $highestRow; ++$row) {

$result[] = $sheet->getCell('A' .$row)->getValue();

}

можно заменить на

$result = $sheet->rangeToArray('A1:A'.$highestRow);

Это вернет 2d массив или строки и столбцы, проиндексированные от 0 для каждой строки; Вы можете кормить это array column() чтобы получить простой 1-й массив.

$result = array_column($sheet->rangeToArray('A1:A'.$highestRow), 0);

Затем вам нужно перевернуть массив, сохранив ключи, чтобы вы проходили его снизу вверх:

$result = array_reverse($result, true);

Когда вы пересекаете массив, вам нужно получить ключ и значение, потому что это позволит вам определить номер строки:

foreach($result as $reference => $gmail){
if(preg_match('/gmail.com/', $gmail)) {
$row = $reference + 1; // adjust the array key to the row number
$objPHPExcel->getActiveSheet()->removeRow($row);
}
}

0

Другие решения

Других решений пока нет …

Я хочу удалить все строки, которые начинаются с «//», из листа Excel, с помощью PHPExcel. Мой код:

require '../Classes/PHPExcel.php';
require_once '../Classes/PHPExcel/IOFactory.php';

error_reporting(E_ALL & ~E_STRICT & ~E_NOTICE);


$path = "del_head.xls";

$objPHPExcel = PHPExcel_IOFactory::load($path);
$objWorksheet = $objPHPExcel->getActiveSheet();
$highestRow = $objWorksheet->getHighestRow();
$highestColumn = $objWorksheet->getHighestColumn();
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);


for($row=1; $row < $highestRow; ++$row){
   $value = $objPHPExcel->getActiveSheet()->getCell('A'.$row)->getValue();

   if (substr($value,0,2) == "//") {
      $objPHPExcel->getActiveSheet()->removeRow($row, $row);
      }
}

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007");
$objWriter->save($path);

Но код не удаляет все строки, которые начинаются с «//». Я думаю, что проблема с функцией ‘removeRow’.

Заранее большое спасибо.

2013-07-10 06:22

4

ответа

Замени эту строку

$objPHPExcel->getActiveSheet()->removeRow($row, $row);

с

$objPHPExcel->getActiveSheet()->removeRow($row);

2015-04-05 12:04

Есть одна очевидная проблема с вашим звонком removeRow(): Первый аргумент — начальная строка, второй — количество удаляемых строк; так что если вы найдете // в строке 5, то вы говорите PHPExcel удалить 5 строк, начиная с строки 5 (то есть строк с 5 по 9).

Вы также читаете файл с расширением.xls (при условии, что это файл BIFF с расширением), но сохраняете файл с тем же именем.xls, что и файл OfficeOpenXML (который обычно является файлом.xlsx).

Так какой формат на самом деле ваш файл? Что распознает вызов метода IOFactory identifier ()? Если на самом деле это файл значений, разделенных запятыми или табуляцией //), тогда вам лучше использовать PHP fgetcsv() а также fputcsv() функции для его обработки, чтобы удалить эти строки.

2013-07-10 07:11

Попробуйте этот код, это сработало у меня

$filename     = 'path/example.xls';
$objReader    = PHPExcel_IOFactory::createReader('Excel2007');
$objPHPExcel  = $objReader->load($filename);
$objWorksheet = $objPHPExcel->getActiveSheet();

$row_id  = 1; // deleted row id
$number_rows = 2; // number of rows count 
if ($objWorksheet != NULL) {
    if ($objWorksheet->removeRow($row_id, $number_rows)) {
        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
        $objWriter->save($filename);
    }
}

2016-06-09 11:11

Пожалуйста, проверьте значение, указанное в строке:

$highestRow = $objWorksheet->getHighestRow();

Я проверил этот код, и значение всегда 1

2016-05-01 09:49

Материал из Справочник Web-языков

Перейти к: навигация, поиск

Содержание

  • 1 Общие возможности
  • 2 Добавление строки
  • 3 Удаление строки
  • 4 Задание высоты строки
  • 5 Автоподбор высоты строк
  • 6 Скрытие/отображение строк

Общие возможности

В Excel при помощи PHP можно произвести следующие действия со строками:

  • добавить строку;
  • удалить строку;
  • задать высоту одной строки или группы строк;
  • сделать автоподбор высоты одной строки или группы строк;
  • скрыть строку или группу строк;
  • отобразить ранее скрытую строку или группу строк.

Добавление строки

Добавить строку можно при помощи метода Insert() объекта EntireRow():

<?php
$xls = new COM("Excel.Application"); // Создаем новый COM-объект
$xls->Application->Visible = 1;      // Заставляем его отобразиться
$xls->Workbooks->Add();              // Добавляем новый документ

// Вставляем в 1-ую, 2-ую и 3-ю верхние ячейки значения
$range=$xls->Range("A1");            // Выбрали ячейку A1
$range->Value = "1-ая строка";       // Вставили значение
$range=$xls->Range("A2");            // Выбрали ячейку A2
$range->Value = "2-ая строка;       // Вставили значение
$range=$xls->Range("A3");            // Выбрали ячейку A3
$range->Value = "3-ая строка";       // Вставили значение

// Вставляем строку
$range=$xls->Range("2:2");           // Определяем место
$range->EntireRow->Insert();         // Вставляем строку
?>

Удаление строки

Удаление строки производится при помощи метода Delete() объекта EntireRow():

<?php
$xls = new COM("Excel.Application"); // Создаем новый COM-объект
$xls->Application->Visible = 1;      // Заставляем его отобразиться
$xls->Workbooks->Add();              // Добавляем новый документ

// Вставляем в 1-ую, 2-ую и 3-ю верхние ячейки значения
$range=$xls->Range("A1");            // Выбрали ячейку A1
$range->Value = "1-ая строка";       // Вставили значение
$range=$xls->Range("A2");            // Выбрали ячейку A2
$range->Value = "2-ая строка";       // Вставили значение
$range=$xls->Range("A3");            // Выбрали ячейку A3
$range->Value = "3-ая строка";       // Вставили значение

// Удаляем строку
$range=$xls->Range("2:2");           // Определяем строку
$range->EntireRow->Delete();         // Удаляем ее
?>

Задание высоты строки

Задать высоту строки можно при помощи свойства RowHeight. Высота задается в миллиметрах.

В следующем примере для строки «2:2» задается высота 25 мм:

<?php
$xls = new COM("Excel.Application"); // Создаем новый COM-объект
$xls->Application->Visible = 1;      // Заставляем его отобразиться
$xls->Workbooks->Add();              // Добавляем новый документ

// Изменение высоты строки
$range=$xls->Range("2:2");           // Выбираем 2-ю строку
$range->Select();                    // Выделяем ее
$rowRange=$xls->Selection;           // Определяем $rowRange как выделенный фрагмент
$rowRange->RowHeight = 25;           // Устанавливаем высоту строки
?>

По аналогии можно задать высоту для нескольких строк:

<?php
$xls = new COM("Excel.Application"); // Создаем новый COM-объект
$xls->Application->Visible = 1;      // Заставляем его отобразиться
$xls->Workbooks->Add();              // Добавляем новый документ

// Изменение высоты строки
$range=$xls->Range("2:7");           // Выбираем строки со 2-ой по 7-ю
$range->Select();                    // Выделяем их
$rowRange=$xls->Selection;           // Определяем $rowRange как выделенный фрагмент
$rowRange->RowHeight = 25;           // Устанавливаем высоту строк
?>

Автоподбор высоты строк

Автоподбор высоты строк используется для лучшей читабельности отображенных данных. Т.е. если размер шрифта текста, размещенного в строках, намного меньше высоты строки, или намного больше высоты, то такой текст читать не очень приятно.

Для автоподбора используется метод AutoFit() объекта Rows:

<?php
$xls = new COM("Excel.Application"); // Создаем новый COM-объект
$xls->Application->Visible = 1;      // Заставляем его отобразиться
$xls->Workbooks->Add();              // Добавляем новый документ

$range=$xls->Range("B1");            // Задаем 1-ую ячейку
$range->Font->Size = 20;             // Задаем размер шрифта
// Выводим в 1-ую выбранную ячейку значение
$range->Value = "Справочник Web-языков: www.spravkaweb.ru";

$range=$xls->Range("B2");            // Задаем 2-ую ячейку
$range->Font->Size = 20;             // Задаем размер шрифта
// Выводим во 2-ую выбранную ячейку значение
$range->Value = "Справочник Web-языков: www.spravkaweb.ru";

$range=$xls->Range("1:2");            // Задаем для работы 2 строки
$range->Select();                     // Выделяем эти строки
$rangeRows=$xls->Selection();         // Задаем $rangeRows как выделенный фрагмент
$rangeRows->RowHeight = 15;           // Устанавливаем высоту строки = 15 мм

$rowRange=$xls->Range("2:2");         // Выделяем 2-ю строку

$rowRange->Rows->AutoFit();           // Делаем автоподбор высоты
                                      // для третьей строки
?>

Т.е. у нас получилось следующее:

На первую и вторую строку мы записали текст Справочник Web-языков: www.spravkaweb.ru. Шрифт для текста задали 20. Затем установили высоту строк 15, и для второй строки сделали автоподбор высоты. В итоге первая строка отображается некорректно (верхняя часть букв не видна), а вторая нормально.

Скрытие/отображение строк

За визуальное отображение строк отвечает свойство Hidden() объекта EntireRow().

Если присвоить этому свойству значение True, то выбранные строки будут скрыты, если False, то показаны.

Следующий пример скроет строки с 5-ой по 10-ую:

<?php
$xls = new COM("Excel.Application"); // Создаем новый COM-объект
$xls->Application->Visible = 1;      // Заставляем его отобразиться
$xls->Workbooks->Add();              // Добавляем новый документ

$range=$xls->Range("5:10");          // Выбираем строки с 5-ой по 10-ую

$range->EntireRow->Hidden = True;    // Скрыть выбранные строки
?>

Понравилась статья? Поделить с друзьями:
  • Php excel по шаблону
  • Php excel объединенные ячейки
  • Php excel на страницу
  • Php excel выпадающий список
  • Php excel в массиве