Вы сказали:
Как добавить поддержку html в data ?
<?php
require '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
//function cloneRowCells(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $sheet, int $fromRow, int $toRow){
function cloneRowCells(Worksheet $sheet, int $fromRow, int $toRow) {
foreach ($sheet->getColumnIterator() as $column) {
$col = $column->getColumnIndex();
$fromCell = $sheet->getCell("{$col}{$fromRow}");
$toCell = $sheet->getCell("{$col}{$toRow}");
// Копируем значение
$toCell->setValue($fromCell->getValue());
// Копируем стиль
$style = $sheet->getStyle("{$col}{$fromRow}");
$sheet->duplicateStyle($style, "{$col}{$toRow}");
// Копируем формулу, если есть
if ($fromCell->isFormula()) {
$formula = $fromCell->getValue();
$newFormula = preg_replace_callback('/([A-Z]+)'.$fromRow.'/', function ($matches) use ($toRow) {
return $matches[1] . $toRow;
}, $formula);
$toCell->setValue($newFormula);
}
// Копируем комментарии, если есть
/*$comment = $fromCell->getComment();
if ($comment && $comment->getText()) {
$toCell->getComment()->setText(clone $comment->getText());
}*/
}
// Копируем высоту строки
$rowHeight = $sheet->getRowDimension($fromRow)->getRowHeight();
$sheet->getRowDimension($toRow)->setRowHeight($rowHeight);
}
// Пример данных
$data = [
['name' => 'Кресло офисное', 'name2'=>'Преобразователь линейных перещений $$$$$$$$$$ <br>(магнитная каретка К2 в комплекте)', 'qty' => 2, 'price' => 3500],
['name' => 'Стол письменный', 'name2'=>'Преобразователь линейных перещений CCCCCCCCCCCC (магнитная каретка К2 в комплекте)', 'qty' => 1, 'price' => 8700],
['name' => 'Лампа настольная', 'name2'=>'Преобразователь линейных перещений AAAAAAAAA (магнитная каретка К2 в комплекте)', 'qty' => 3, 'price' => 1200],
];
// Шаг 1: Загружаем шаблон
$templatePath = 'template.xls';
$templatePath = 'generated_offer1.xls';
$templatePath = 'generated_offer_re.xls';
$spreadsheet = IOFactory::load($templatePath);
$sheet = $spreadsheet->getActiveSheet();
// Название вкладки
$sheet->setTitle('форма ТКП');
// Шаг 2: Устанавливаем логотип (если хотите добавить заново)
/*$logoPath = 'logo.png';
if (file_exists($logoPath)) {
$drawing = new Drawing();
$drawing->setName('Логотип');
$drawing->setDescription('Company Logo');
$drawing->setPath($logoPath); // путь к картинке
$drawing->setHeight(80); // высота
$drawing->setCoordinates('A1'); // где разместить
$drawing->setWorksheet($sheet);
}*/
/*$drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
$drawing->setName('Фон');
$drawing->setDescription('Фоновое изображение');
$drawing->setPath('image5.jpeg');
$drawing->setCoordinates('A1');
$drawing->setWidthAndHeight(1000, 1400); // подберите размер
$drawing->setWorksheet($sheet);*/
// Шаг 3: Найдём стартовую строку (где начинается список товаров)
$startRow = $templateRow = 11; // измените если нужно
$itemsCount = count($data);
$footerStartRow = 14;
// Вычисляем, сколько строк вставить
$rowsToInsert = $itemsCount - 1; // первая уже есть
if ($rowsToInsert > 0) {
// Сдвигаем подвал вниз
$sheet->insertNewRowBefore($footerStartRow, $rowsToInsert);
// Копируем шаблон строки в новые строки
for ($i = 1; $i <= $rowsToInsert; $i++) {
$from = $templateRow;
$to = $templateRow + $i;
cloneRowCells($sheet, $from, $to); // Функция из предыдущего ответа
}
}
foreach ($data as $index => $item) {
$row = $startRow + $index;
$sheet->setCellValue("A$row", $index + 1); // №
$sheet->setCellValue("B$row", $item['name']); // Наименование
$sheet->setCellValue("C$row", $item['name2']); // Исполнение
$sheet->setCellValue("E$row", $item['qty']); // Кол-во
$sheet->setCellValue("F$row", $item['price']); // Цена
//$sheet->setCellValue("E$row", $item['qty'] * $item['price']); // Сумма
//$sheet->setCellValue("G$row", "=SUM(E$row:E" . ($row - 1) . ")");
$sheet->setCellValue("G$row", "=F$row*E$row");//=F11*E11
//$sheet->setCellValue("G$row", "=F$row:E$row");
$sheet->setCellValue("H$row", "=G$row*0.2");//=G11*0,2
$sheet->setCellValue("I$row", "=G$row+H$row");//=G11+H11
}
// Шаг 4: Форматируем сумму
$lastRow = $startRow + count($data);
$sheet->setCellValue("D$lastRow", 'Итого:');
$sheet->setCellValue("E$lastRow", "=SUM(E$startRow:E" . ($lastRow - 1) . ")");
// Можно применить стили:
$styleArray = [
'borders' => [
'allBorders' => [
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
],
],
];
$sheet->getStyle("A$startRow:E$lastRow")->applyFromArray($styleArray);
// Шаг 5: Сохраняем как Excel
$writer = new Xlsx($spreadsheet);
$writer->save('generated_offer.xlsx');
// Шаг 6: Сохраняем как PDF (если нужно)
/*use PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf;
\PhpOffice\PhpSpreadsheet\IOFactory::registerWriter('Pdf', Dompdf::class);
$pdfWriter = new Dompdf($spreadsheet);
$pdfWriter->save('generated_offer.pdf');*/
echo "Готово! Файлы сохранены.";