PHPExcel CSV to XLSX

11,654

The "default" separator for reading a CSV file in PHPExcel is a comma (,). Your CSV file is using something other than a comma - perhaps a tab ("\t"), which is also commonly used for such files).

If the values isn't a comma (and we can't tell from an image of the file viewed in MS Excel) then you have to tell PHPExcel explicitly what that separator is before loading.

e.g.

$objReader->setDelimiter("\t");
Share:
11,654
JustinasT
Author by

JustinasT

Updated on June 04, 2022

Comments

  • JustinasT
    JustinasT almost 2 years

    I have a problem converting file feom CSV to XLSX format:

    Index.php

    <?php
    if (!isset($_FILES["file"]))
    {
    ?>
    <html>
        <body>
            <h1>Convert CSV to XLSX</h1>
            <form action="index.php" method="post" enctype="multipart/form-data">
                <input type="file" name="file"/>
                <input type="submit"/>
            </form>
        </body>
    </html>
    <?php
        exit;
    }
    
    //obtain PHPExcel from http://phpexcel.codeplex.com
    require_once('Classes\PHPExcel.php');
    require_once('CSVToExcelConverter.php');
    
    if ($_FILES["file"]["error"] > 0)
    {
        echo "Error: " . $_FILES["file"]["error"];
        exit;
    }
    
    try
    {
        header('Content-type: application/ms-excel');
        header('Content-Disposition: attachment; filename='.'example.xlsx');
    
        CSVToExcelConverter::convert($_FILES['file']['tmp_name'], 'php://output');
    } catch(Exception $e) {
        echo $e->getMessage();
    }
    

    CSVToExcelConverter.php

    class CSVToExcelConverter
    {
        /**
         * Read given csv file and write all rows to given xls file
         * 
         * @param string $csv_file Resource path of the csv file
         * @param string $xls_file Resource path of the excel file
         * @param string $csv_enc Encoding of the csv file, use utf8 if null
         * @throws Exception
         */
        public static function convert($csv_file, $xls_file, $csv_enc=null) {
            //set cache
            $cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
            PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
    
            //open csv file
            $objReader = new PHPExcel_Reader_CSV();
            if ($csv_enc != null)
                $objReader->setInputEncoding($csv_enc);
            $objPHPExcel = $objReader->load($csv_file);
            $in_sheet = $objPHPExcel->getActiveSheet();
    
            //open excel file
            $objPHPExcel = new PHPExcel();
            $out_sheet = $objPHPExcel->getActiveSheet();
    
            //row index start from 1
            $row_index = 0;
            foreach ($in_sheet->getRowIterator() as $row) {
                $row_index++;
                $cellIterator = $row->getCellIterator();
                $cellIterator->setIterateOnlyExistingCells(false);
    
                //column index start from 0
                $column_index = -1;
                foreach ($cellIterator as $cell) {
                    $column_index++;
                    $out_sheet->setCellValueByColumnAndRow($column_index, $row_index, $cell->getValue());
                }
            }
    
            //write excel file
            $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
            $objWriter->save($xls_file);
        }
    }
    

    CSV File format: CSV file opened with Excel

    xlsx file I get after conversion

    Basicaly I would like to get output similar to original csv file, but in xmlx format, how to do that?

  • JustinasT
    JustinasT over 8 years
    Thanks for answer! That made things a lot more clear for me!