Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to merge column in Excel using PHPExcel

I already checked this Merging cells in Excel by rows and columns together using PHPExcel but its showing only for row addition however I applied some tests for column as well but none is working.

This code although creates the excel sheet successfully but the output in excel is throwing error.

EDIT

however this is working if remove the llop and put this in simple terms -

$objPHPExcel->setActiveSheetIndex(0)->mergeCells('A1:B1');
$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Swapnesh');

Main code for adding the data -

// Add some data
echo date('H:i:s') , " Add some data" , EOL;
$i = "A";
$j ="B";
for($num =1; $num <= 5; $num++ )
{
    $concat =  "{$i}1:{$j}1";
    $objPHPExcel->setActiveSheetIndex(0)->mergeCells($concat);
    $i++;$j++;
} 
$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Swapnesh');

My whole code -

<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');

date_default_timezone_set('Asia/Calcutta');

/** Include PHPExcel */
require_once 'Classes/PHPExcel.php';


// Create new PHPExcel object
echo date('H:i:s') , " Create new PHPExcel object" , EOL;
$objPHPExcel = new PHPExcel();

// Set document properties
echo date('H:i:s') , " Set document properties" , EOL;
$objPHPExcel->
getProperties()->setCreator("Swapnesh Sinha")
                             ->setLastModifiedBy("Swapnesh")
                             ->setTitle("Office 2007 XLSX Test Document")
                             ->setSubject("Office 2007 XLSX Test Document")
                             ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
                             ->setKeywords("office 2007 openxml php")
                             ->setCategory("Test result file");


// Add some data
echo date('H:i:s') , " Add some data" , EOL;
$i = "A";
$j ="B";
for($num =1; $num <= 5; $num++ )
{
    $concat =  "{$i}1:{$j}1";
    $objPHPExcel->setActiveSheetIndex(0)->mergeCells($concat);
    $i++;$j++;
} 
$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Swapnesh');

// Rename worksheet
echo date('H:i:s') , " Rename worksheet" , EOL;
$objPHPExcel->getActiveSheet()->setTitle('Student Data');


// Set document security
echo date('H:i:s') , " Set document security" , EOL;
$objPHPExcel->getSecurity()->setLockWindows(true);
$objPHPExcel->getSecurity()->setLockStructure(true);
$objPHPExcel->getSecurity()->setWorkbookPassword("PHPExcel");


// Set sheet security
echo date('H:i:s') , " Set sheet security" , EOL;
$objPHPExcel->getActiveSheet()->getProtection()->setPassword('PHPExcel');
$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true); // This should be enabled in order to enable any of the following!
$objPHPExcel->getActiveSheet()->getProtection()->setSort(true);
$objPHPExcel->getActiveSheet()->getProtection()->setInsertRows(true);
$objPHPExcel->getActiveSheet()->getProtection()->setFormatCells(true);


// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);


// Save Excel 2007 file
echo date('H:i:s') , " Write to Excel2007 format" , EOL;
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
//$objWriter->save(str_replace('.php', '.xlsx', __FILE__));
$filename = "Student-data-sheet".".xlsx";
$objWriter->save($filename);
echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL;


// Echo memory peak usage
echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL;

// Echo done
echo date('H:i:s') , " Done writing file" , EOL;
echo 'File has been created in ' , getcwd() , EOL; 
like image 570
swapnesh Avatar asked Feb 26 '13 08:02

swapnesh


People also ask

How do I merge rows in PHPExcel?

":I". ($row_count+4)); Where the variable $row_count has some unpredictable dynamic value like 25, 50, 75 and so on (no regular pattern). It merges the cells as shown in the preceding snap shot as can be seen immediately below the Note cell.

How do I merge cells in laravel Excel?

How do I merge cells in laravel Excel? To merge a range of cells, use ->mergeCells($range) .

How do I change font size in PHPExcel?

$objPHPExcel->getActiveSheet()->getStyle("F1:G1")->getFont()->setFontSize(16);


2 Answers

I figure out the solution on my own -

Actually in case of column merge we actually dont need to iterate. let us say I want to merge from column A1 to E1.

So instead of going loop by loop it can very easily be done via -

$objPHPExcel->setActiveSheetIndex(0)->mergeCells('A1:E1');

So in my case I first need to find the last element and the first and then simply put in mergeCells() method to make it working.

like image 179
swapnesh Avatar answered Oct 05 '22 08:10

swapnesh


This issue happens when you are trying to merge two cell in loop. Reason is not the loop you are iterating but its column name you are passing. if you are passing wrong column names then your excel will not produce proper output.

Following is simple program to get next excel column so that we dont face such kind of issue.

/* manage excel index */
function getColumn($prevColumn){
    if(strlen($prevColumn)==1&&$prevColumn!="Z")
    { $prevColumn++;return $prevColumn; }

    $colum = '';
    $list = str_split($prevColumn);

    if(count($list)==1&&$list[0]=='Z')
    {
        $list[0] = "A";
        $list[1] = "A";
    }
    else if(count($list)==2&&$list[1]!='Z')
    {
        $list[1]++;
}
    else if(count($list)==2&&$list[1]=='Z')
    {
        $list[0] = "B";
        $list[1] = "A";
}
return implode('',$list);
}

## us this like below

$column = "A";
$row = 1;
foreach($array_to_print as $details)
{

$column = getColumn($column); // product next column B
$Excelobj->getActiveSheet()->setCellValue($column.$row, $details);
$column = getColumn($column);// product next column C
$Excelobj->setActiveSheetIndex(0)->mergeCells($from_cell.':'.$to_cell);// now this will  work till A-ZZ column in excel
}
like image 42
Vishal Bhandare Avatar answered Oct 05 '22 09:10

Vishal Bhandare