php - how to export to excel file with multiple sheets wherein data is from database using mysqli

824

I am a newbie to oops concept of phpexcel.

I am trying to do something like I have data which I am trying to export based on from date, to date and session like breakfast, lunch, and dinner in multiple sheets.

I have almost reached but unable to iterate the rows.

Any help would great to complete it.

Below is the code that I tried.

<?php

error_reporting(E_ALL);
ini_set("display_errors", "ON");
require_once 'PHPExcel.php';
require_once 'PHPExcel/IOFactory.php';
include 'db.php';

$xls_filename = 'Data' . date('d-m-Y') . '.xls'; // Define Excel (.xls) file name
$objPHPExcel = new PHPExcel();
$objPHPExcel->setActiveSheetIndex(0);

$heading = array(
    'id' => 'S.No',
    'date' => 'Date',
    'item_name' => 'Item',
    'qty_in' => 'Quantity (dine in)',
    'qty_out' => 'Quantity (parcel)',
    'price' => 'Total Quantity',
    'total' => 'Total Price',
);

$no_of_cols = count($heading);
$rowNumberH = 1;
$colH = 'A';
$columns = array('0' => 'A', '1' => 'B', '2' => 'C', '3' => 'D', '4' => 'E', '5' => 'F', '6' => 'G', '7' => 'H', '8' => 'I', '9' => 'J', '10' => 'K', '11' => 'L', '12' => 'M', '13' => 'N', '14' => 'O', '15' => 'P', '16' => 'Q', '17' => 'R', '18' => 'S', '19' => 'T', '20' => 'U', '21' => 'V', '22' => 'W', '23' => 'X', '24' => 'Y', '25' => 'Z');

$q = $conn->query("SELECT * FROM main");
if (mysqli_num_rows($q) > 0) {
    foreach ($heading as $h) {
        $objPHPExcel->getActiveSheet()->setCellValue($colH . $rowNumberH, $h);
        $objPHPExcel->getActiveSheet()->getColumnDimension($colH)->setWidth(25);
        $colH++;
    }
    $row = 2;
    while ($row_q = mysqli_fetch_assoc($q)) {
        $i = 0;
        foreach ($row_q as $key => $value) {
            if ($key == 'location')
                continue;
            $objPHPExcel->getActiveSheet()->setCellValue($columns[$i] . $row, $row_q[$key]);
            $i++;
        }
    }
}

header("Content-Type: application/xls");
header("Content-Disposition: attachment; filename=$xls_filename");
header("Pragma: no-cache");
header("Expires: 0");
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
?>

The code is printing only one row.

387

Answer

Solution:

Increment $row at the while loop. I hope it will work.

Edited: I am going to mention your slice of code where I have added $row++.

I have added $row++ at the end of while loop and it is working for me as I tested it at my computer. I implemented your code by creating table like your table. I also tested different type of table in this code and that worked perfect.

$q = $conn->query("SELECT * FROM student");
if (mysqli_num_rows($q) > 0) {
    foreach ($heading as $h) {
        $objPHPExcel->getActiveSheet()->setCellValue($colH . $rowNumberH, $h);
        $objPHPExcel->getActiveSheet()->getColumnDimension($colH)->setWidth(25);
        $colH++;
    }
    $row = 2;
    while ($row_q = mysqli_fetch_assoc($q)) {
        $i = 0;
        foreach ($row_q as $key => $value) {
            if ($key == 'location')
                continue;
            $objPHPExcel->getActiveSheet()->setCellValue($columns[$i] . $row, $row_q[$key]);
            $i++;
        }
        $row++;  // $row is added only in your code.
    }
}
315

Answer

Solution:

What you can do is :

Use this function instead :

 $objPHPExcel->setActiveSheetIndex(0)->setCellValueByColumnAndRow($col,$row,"Name");

both $col and $ row are integers.

if you would use

$objPHPExcel->setActiveSheetIndex(0)->setCellValueByColumnAndRow(0,1,"Name");

Name will be printed on cell A1.

Using this method will remove ambiguity that if you are actually moving to next row or not .

People are also looking for solutions to the problem: php - HTML does not load till graph api calls are executed

Source

Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.