我想将所有数据和某个范围的样式复制到其他单元格。例如,我要从A4:I15复制,然后粘贴,正是我要从A16复制内容和样式。我该怎么做?。这是我要复制的内容:
我知道只复制数据但不复制样式,并使用以下代码进行处理:
$cellValues = $objPHPExcel->getActiveSheet()->rangeToArray('A4:I15'); $objPHPExcel->getActiveSheet()->fromArray($cellValues, null, 'A16');
我需要复制样式和数据
更新:@pavelDD指出,自1.xx版以来,某些导入已被重命名。我将不接受他对原始代码的编辑,而是共享新版本。除了重命名,我还修复了烦人的索引错误,并添加了一个可从原始工作表中复制样式的帮助程序。不幸的是,我懒得像上次那样将其从类转换为简单的函数。但是根据以前的版本,如果需要,您应该可以自己完成此操作。
getCellByColumnAndRow($col, $row); $style = $sheet->getStyleByColumnAndRow($col, $row); $dstCell = Coordinate::stringFromColumnIndex($destColumnStart + $colCount) . (string)($destRowStart + $rowCount); $destSheet->setCellValue($dstCell, $cell->getValue()); $destSheet->duplicateStyle($style, $dstCell); // Set width of column, but only once per column if ($rowCount === 0) { $w = $sheet->getColumnDimensionByColumn($col)->getWidth(); $destSheet->getColumnDimensionByColumn ($destColumnStart + $colCount)->setAutoSize(false); $destSheet->getColumnDimensionByColumn ($destColumnStart + $colCount)->setWidth($w); } $colCount++; } $h = $sheet->getRowDimension($row)->getRowHeight(); $destSheet->getRowDimension($destRowStart + $rowCount)->setRowHeight($h); $rowCount++; } foreach ($sheet->getMergeCells() as $mergeCell) { $mc = explode(":", $mergeCell); $mergeColSrcStart = Coordinate::columnIndexFromString(preg_replace("/[0-9]*/", "", $mc[0])); $mergeColSrcEnd = Coordinate::columnIndexFromString(preg_replace("/[0-9]*/", "", $mc[1])); $mergeRowSrcStart = ((int)preg_replace("/[A-Z]*/", "", $mc[0])); $mergeRowSrcEnd = ((int)preg_replace("/[A-Z]*/", "", $mc[1])); $relativeColStart = $mergeColSrcStart - $srcColumnStart; $relativeColEnd = $mergeColSrcEnd - $srcColumnStart; $relativeRowStart = $mergeRowSrcStart - $srcRowStart; $relativeRowEnd = $mergeRowSrcEnd - $srcRowStart; if (0 <= $mergeRowSrcStart && $mergeRowSrcStart >= $srcRowStart && $mergeRowSrcEnd <= $srcRowEnd) { $targetColStart = Coordinate::stringFromColumnIndex($destColumnStart + $relativeColStart); $targetColEnd = Coordinate::stringFromColumnIndex($destColumnStart + $relativeColEnd); $targetRowStart = $destRowStart + $relativeRowStart; $targetRowEnd = $destRowStart + $relativeRowEnd; $merge = (string)$targetColStart . (string)($targetRowStart) . ":" . (string)$targetColEnd . (string)($targetRowEnd); //Merge target cells $destSheet->mergeCells($merge); } } } public static function copyStyleXFCollection(Spreadsheet $sourceSheet, Spreadsheet $destSheet) { $collection = $sourceSheet->getCellXfCollection(); foreach ($collection as $key => $item) { $destSheet->addCellXf($item); } } } ?>
我接受了Prashant的回答,并对其进行了扩展以便于使用,并添加了一些其他功能。首先是一个很好的资源。但是它缺少我的一些关键功能:取一个范围(例如A10:B15)而不只是索引取一个目标单元格而不是一行。设置目标列的宽度
请注意,我正在使用PHPExcel的后继者PHPSpreadsheet。如果您使用的是旧版本,则只需更新Cell类的路径。
getCellByColumnAndRow($col, $row); $style = $sheet->getStyleByColumnAndRow($col, $row); $dstCell = Cell::stringFromColumnIndex($destColumnStart + $colCount) . (string)($destRowStart + $rowCount); $sheet->setCellValue($dstCell, $cell->getValue()); $sheet->duplicateStyle($style, $dstCell); // Set width of column, but only once per row if ($rowCount === 0) { $w = $sheet->getColumnDimensionByColumn($col)->getWidth(); $sheet->getColumnDimensionByColumn ($destColumnStart + $colCount)->setAutoSize(false); $sheet->getColumnDimensionByColumn ($destColumnStart + $colCount)->setWidth($w); } $colCount++; } $h = $sheet->getRowDimension($row)->getRowHeight(); $sheet->getRowDimension($destRowStart + $rowCount)->setRowHeight($h); $rowCount++; } foreach ($sheet->getMergeCells() as $mergeCell) { $mc = explode(":", $mergeCell); $mergeColSrcStart = Cell::columnIndexFromString(preg_replace("/[0-9]*/", "", $mc[0])) - 1; $mergeColSrcEnd = Cell::columnIndexFromString(preg_replace("/[0-9]*/", "", $mc[1])) - 1; $mergeRowSrcStart = ((int)preg_replace("/[A-Z]*/", "", $mc[0])); $mergeRowSrcEnd = ((int)preg_replace("/[A-Z]*/", "", $mc[1])); $relativeColStart = $mergeColSrcStart - $srcColumnStart; $relativeColEnd = $mergeColSrcEnd - $srcColumnStart; $relativeRowStart = $mergeRowSrcStart - $srcRowStart; $relativeRowEnd = $mergeRowSrcEnd - $srcRowStart; if (0 <= $mergeRowSrcStart && $mergeRowSrcStart >= $srcRowStart && $mergeRowSrcEnd <= $srcRowEnd) { $targetColStart = Cell::stringFromColumnIndex($destColumnStart + $relativeColStart); $targetColEnd = Cell::stringFromColumnIndex($destColumnStart + $relativeColEnd); $targetRowStart = $destRowStart + $relativeRowStart; $targetRowEnd = $destRowStart + $relativeRowEnd; $merge = (string)$targetColStart . (string)($targetRowStart) . ":" . (string)$targetColEnd . (string)($targetRowEnd); //Merge target cells $sheet->mergeCells($merge); } } } ?>
用法示例:
copyRange($sheet, 'A4:B8', 'E1'); copyRange($sheet, 'A4:B8', 'A10'); copyRange($sheet, 'A4:B8', 'C17');
注意:我还没有尝试过使用单个单元格。但从理论上讲,它应该与A1:A1一起使用
如果我有任何错误,请让我,或随时编辑答案。
function copyRows(PHPExcel_Worksheet $sheet,$srcRow,$dstRow,$height,$width) {
for ($row = 0; $row < $height; $row++) {
for ($col = 0; $col < $width; $col++) {
$cell = $sheet->getCellByColumnAndRow($col, $srcRow + $row);
$style = $sheet->getStyleByColumnAndRow($col, $srcRow + $row);
$dstCell = PHPExcel_Cell::stringFromColumnIndex($col) . (string)($dstRow + $row);
$sheet->setCellValue($dstCell, $cell->getValue());
$sheet->duplicateStyle($style, $dstCell);
}
$h = $sheet->getRowDimension($srcRow + $row)->getRowHeight();
$sheet->getRowDimension($dstRow + $row)->setRowHeight($h);
}
foreach ($sheet->getMergeCells() as $mergeCell) {
$mc = explode(":", $mergeCell);
$col_s = preg_replace("/[0-9]*/", "", $mc[0]);
$col_e = preg_replace("/[0-9]*/", "", $mc[1]);
$row_s = ((int)preg_replace("/[A-Z]*/", "", $mc[0])) - $srcRow;
$row_e = ((int)preg_replace("/[A-Z]*/", "", $mc[1])) - $srcRow;
if (0 <= $row_s && $row_s < $height) {
$merge = $col_s . (string)($dstRow + $row_s) . ":" . $col_e . (string)($dstRow + $row_e);
$sheet->mergeCells($merge);
}
}
}
$objPHPExcel = PHPExcel_IOFactory::load("x.xlsx");
$sheet = $objPHPExcel->getActiveSheet();
copyRows($sheet, 1, 50, 48, 11);
copyRows($sheet, 2, 7 + 5, 5, 5);
copyRows($sheet, 2, 7 + 10, 5, 5);
copyRows($sheet, 2, 7 + 15, 5, 5);