So im kinda new to phpExcel and im making a sheet with data from a form(not done but will come) but i have a problem my formulas wont calculate i have tested preset formulas and import formulas from the code but none wont work all i get is 0 and protected mode and if i click editsheet and click on the cell where the formula is and hit enter it works and calculate it
<?php
/** Error reporting */
error_reporting(E_ALL);
/** PHPExcel */
include 'Classes/PHPExcel.php';
/** PHPExcel_Writer_Excel2007 */
include 'Classes/PHPExcel/Writer/Excel2007.php';
include 'Classes/PHPExcel/IOFactory.php';
// Load file if it doesn't exists
if (file_exists('Exceltime.xlsx'))
{
$objPHPExcel = PHPExcel_IOFactory::load('Exceltime.xlsx');
}
else
{
$objPHPExcel = new PHPExcel();
}
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('C4', '10:00')
->setCellValue('D4', '18:00')
->setCellValue('E4', '01:30')
->setCellValue('F4', '=(D4-C4-E4)');
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('C5', '10:00')
->setCellValue('D5', '18:00')
->setCellValue('E5', '01:30')
->setCellValue('F5', '=(D5-C5-E5)');
$objPHPExcel->getActiveSheet()->setTitle('TidsRapport Namn');
header('Content-Type: application/vnd.openxmlformats- officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="Tidsrapport Namn.xlsx"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->setPreCalculateFormulas(TRUE);
$objWriter->save('php://output');
?>
So all it should do is import work clock hours Start/end/break and then the formula is calculating how many hours/minutes you work
also if there is a better way or something i should do im free to try it :)
A better answer is to actually use MS Excel date/time values rather than hoping that PHPExcel/MS Excel will guess that your string values like ('10:00') are supposed to be times.
As per the PHPExcel documentation
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('C4', PHPExcel_Calculation_DateTime::TIMEVALUE('10:00'))
->setCellValue('D4', PHPExcel_Calculation_DateTime::TIMEVALUE('18:00'))
->setCellValue('E4', PHPExcel_Calculation_DateTime::TIMEVALUE('01:30'))
->setCellValue('F4', '=(D4-C4-E4)');
$objPHPExcel->getActiveSheet()->getStyle('C4:E4')
->getNumberFormat()
->setFormatCode('hh:mm');
$objPHPExcel->getActiveSheet()->getStyle('F4')
->getNumberFormat()
->setFormatCode('[hh]:mm');
Related
I am working with PhpSpreadsheet. When I use a formula that copies cell values, it adds to the formula the # symbol. This cause constant an error.
I need to prevent PhpSpreadsheet from adding this # symbol.
When I remove the #, the formula works perfectly.
//** Create a new Spreadsheet Object **//
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet(); //get current active sheet (first sheet)
//** Set and load the reader **//
$inputFileName = $basePath;
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); // Create a new Reader of type xlsx
$reader->setReadDataOnly(false); // Keeping the style
$spreadsheet = $reader->load($inputFileName); // Load $inputFileName to a Spreadsheet Object
$spreadsheet->getActiveSheet()->fromArray($ufields, null, 'A8', true);
$attrs = $spreadsheet->getActiveSheet()->getCell("A10")->getFormulaAttributes();
$attrs['t'] = 'array';
$spreadsheet->getActiveSheet()->getCell("A10")->setFormulaAttributes($attrs);
$spreadsheet->getActiveSheet()->setCellValue("A10",'=IF(all_details!A8:I8<>"", all_details!A8:I8, "")');
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
$writer->setPreCalculateFormulas(false);
$writer->save($inputFileName);
//Export sheet code
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$reportOriginalname.'"');
header('Cache-Control: max-age=0');
** I read and tried the solution suggested here, but it didn't work for me.
i am using php excel tcpdf render to save file as pdf. pdf can save successfully but pdf only saving as A4 size and it cuts my columns. i have many columns so i need all columns on pdf. pdf width should be auto so it can generate pdf as per number of columns given. please have a look below is my code i tried. also i included image i taken from pdf generated. you can see my pdf width is fix so my content is cut. any suggestion
if (PHP_SAPI == 'cli')
die('This example should only be run from a Web Browser');
$rendererName = PHPExcel_Settings::PDF_RENDERER_TCPDF;
$rendererLibrary = 'tcpdf';
$rendererLibraryPath = '' . $rendererLibrary;
//echo $rendererLibraryPath;
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
// Set document properties
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
->setLastModifiedBy("Maarten Balliauw")
->setTitle("PDF Test Document")
->setSubject("PDF Test Document")
->setDescription("Test document for PDF, generated using PHP classes.")
->setKeywords("pdf php")
->setCategory("Test result file");
// Rename worksheet
$objPHPExcel->getActiveSheet()->setTitle('Simple');
$objPHPExcel->getActiveSheet()->setShowGridLines(false);
//If used external excel file
$inputFile="xlsx_file/subcategory.xlsx";
$inputFileType = PHPExcel_IOFactory::identify($inputFile);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFile);
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet)
{
$worksheet->setShowGridLines(true);
$worksheet->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A2_PAPER );
$worksheet->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A2_PAPER );
$worksheet->getPageSetup()->setFitToPage(true);
$worksheet->getPageSetup()->setFitToWidth(1);
$worksheet->getPageSetup()->setFitToHeight(0);
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
if (!PHPExcel_Settings::setPdfRenderer(
$rendererName,
$rendererLibraryPath
)) {
die(
'NOTICE: Please set the $rendererName and $rendererLibraryPath values' .
'<br />' .
'at the top of this script as appropriate for your directory structure'
);
}
$rand = rand(1234, 9898);
$presentDate = date('YmdHis');
$fileName = "report_" . $rand . "_" . $presentDate . ".pdf";
// Redirect output to a client’s web browser (PDF)
header('Content-Type: application/pdf');
header('Content-Disposition: attachment;filename="'.$fileName.'"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF');
$objWriter->save('php://output');
exit;
Try setting the portrait visualization:
$objPHPExcel->getActiveSheet()
->getPageSetup()
->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT);
I was having the same problem and I had to deactivate the autoSize for the columns and set the width manually, like this:
$objPHPExcel ->getActiveSheet()->getColumnDimension('A')->setAutoSize(false);
$objPHPExcel ->getActiveSheet()->getColumnDimension('B')->setAutoSize(false);
$objPHPExcel ->getActiveSheet()->getColumnDimension('C')->setAutoSize(false);
$objPHPExcel ->getActiveSheet()->getColumnDimension('D')->setAutoSize(false);
$objPHPExcel ->getActiveSheet()->getColumnDimension('E')->setAutoSize(false);
$objPHPExcel ->getActiveSheet()->getColumnDimension('F')->setAutoSize(false);
$objPHPExcel ->getActiveSheet()->getColumnDimension('G')->setAutoSize(false);
$objPHPExcel ->getActiveSheet()->getColumnDimension('A')->setWidth(20);
$objPHPExcel ->getActiveSheet()->getColumnDimension('B')->setWidth(20);
$objPHPExcel ->getActiveSheet()->getColumnDimension('C')->setWidth(14);
$objPHPExcel ->getActiveSheet()->getColumnDimension('D')->setWidth(15);
$objPHPExcel ->getActiveSheet()->getColumnDimension('E')->setWidth(14);
$objPHPExcel ->getActiveSheet()->getColumnDimension('F')->setWidth(18);
$objPHPExcel ->getActiveSheet()->getColumnDimension('G')->setWidth(9);
After doing that, my pdf was printed like this:
The answer might be a little late, but I hope it helps you in the future.
I have a Excel file stored on my webserver which i use as a calculator. I was wondering if it's any way possible to post/send values to specific cells and then extract the result from a specific cell? I would prefer to do this by PHP.
Use phpExcel, here's an example to open and modify your existing file:
<?php
error_reporting(E_ALL);
set_time_limit(0);
date_default_timezone_set('Europe/Lisbon');
set_include_path(get_include_path() . PATH_SEPARATOR . './Classes/');
include 'PHPExcel/IOFactory.php';
$fileType = 'Excel5'; //you may have to change this value
$fileName = 'yourfile.xlsm';
// Read the file
$objReader = PHPExcel_IOFactory::createReader($fileType);
$objPHPExcel = $objReader->load($fileName);
// Change the file
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', 'Hello')
->setCellValue('B1', 'World!');
// Write the file
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, $fileType);
$objWriter->save($fileName);
Please refer to the official documentation and list of examples.
I've been looking everywhere on how to do this with two existing files, looks like all documentation is on creating new files. I'd like to take one of the files and add the second file to it as a new worksheet then save it to the server.
I've been trying with no avail like this:
$file="test.xls";
$file2="test2.xls";
$outputFile = "final.xls";
$phpExcel = new PHPExcel($file);
$phpExcel->getActiveSheet();
$phpExcel->setActiveSheetIndex(0);
$phpExcel->addSheet($file2);
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=$outputFile");
header("Cache-Control: max-age=0");
$objWriter = PHPExcel_IOFactory::createWriter($phpExcel, "Excel5");
file_put_contents($outputFile, $objWriter);
Any help would be greatly appreciated. Very new to PHP.
Doesn't anybody ever read documentation these days? There's a whole document in the folder called /Documentation about reading files to PHPExcel objects (it's called PHPExcel User Documentation - Reading Spreadsheet Files), together with dozens of examples (the /Documentation/Examples/Reader folder is a good place to look), and none of them use new PHPExcel($file). Nor do any of the examples or any of the documents say to use file_put_contents() when saving.
$file1="test.xls";
$file2="test2.xls";
$outputFile = "final.xls";
// Files are loaded to PHPExcel using the IOFactory load() method
$objPHPExcel1 = PHPExcel_IOFactory::load($file1);
$objPHPExcel2 = PHPExcel_IOFactory::load($file2);
// Copy worksheets from $objPHPExcel2 to $objPHPExcel1
foreach($objPHPExcel2->getAllSheets() as $sheet) {
$objPHPExcel1->addExternalSheet($sheet)
}
// Save $objPHPExcel1 to browser as an .xls file
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel1, "Excel5");
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=$outputFile");
header("Cache-Control: max-age=0");
$objWriter->save('php://output');
// update from office site
$filenames = array('doc1.xlsx', 'doc2.xlsx');
$bigExcel = new PHPExcel();
$bigExcel->removeSheetByIndex(0);
$reader = PHPExcel_IOFactory::createReader($input_file_type);
foreach ($filenames as $filename) {
$excel = $reader->load($filename);
foreach ($excel->getAllSheets() as $sheet) {
$bigExcel->addExternalSheet($sheet);
}
foreach ($excel->getNamedRanges() as $namedRange) {
$bigExcel->addNamedRange($namedRange);
}
}
$writer = PHPExcel_IOFactory::createWriter($bigExcel, 'Excel5');
$file_creation_date = date("Y-m-d");
// name of file, which needs to be attached during email sending
$saving_name = "Report_Name" . $file_creation_date . '.xls';
// save file at some random location
$writer->save($file_path_location . $saving_name);
// More Detail : with different object:
Merge multiple xls file into single one is explained here:
I'm going to describe a bit different:
http://rosevinod.wordpress.com/2014/03/15/combine-two-or-more-xls-files-as-worksheets-phpexcel/
// Combine all .csv files into one .xls file,
$cache_dir = "/home/user_name/public_html/";
$book1 = $cache_dir . "book1.csv";
$book2 = $cache_dir . "book2.csv";
$outputFile = $cache_dir . "combined.xls";
$inputFileType = 'CSV';
$inputFileNames = array($book1,$book2);
$objReader = new PHPExcel_Reader_CSV();
/** Extract the first named file from the array list **/
$inputFileName = array_shift($inputFileNames);
/** Load the initial file to the first worksheet in a PHPExcel Object **/
$objPHPExcel = $objReader->load($inputFileName);
/** Set the worksheet title (to the filename that we've loaded) **/
$objPHPExcel->getActiveSheet()
->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME));
/** Loop through all the remaining files in the list **/
foreach($inputFileNames as $sheet => $inputFileName) {
/** Increment the worksheet index pointer for the Reader **/
$objReader->setSheetIndex($sheet+1);
/** Load the current file into a new worksheet in PHPExcel **/
$objReader->loadIntoExisting($inputFileName,$objPHPExcel);
/** Set the worksheet title (to the filename that we've loaded) **/
$objPHPExcel->getActiveSheet()->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME));
}
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
$objWriter->save( $outputFile );
$objPHPExcel->disconnectWorksheets();
unset($objPHPExcel);
echo "DONE";
I want to export some file php to XLS file use class PHPEXcel, I don't used this before.
notif on my browser:
"Fatal error: Allowed memory size of 25165824 bytes exhausted (tried to allocate 1056 bytes) in C:\AppServ\www\kjjp2\Classes\PHPExcel\Cell.php on line 1124"
code:
<?php
include "config/koneksi.php";
error_reporting(E_ALL);
require_once 'Classes/PHPExcel.php';
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
$query = "SELECT * FROM `tabeldata`";
$hasil = mysql_query($query);
// Set properties
$objPHPExcel->getProperties()->setCreator("Erik")
->setLastModifiedBy("Erik")
->setTitle("Office 2007 XLSX ")
->setSubject("Office 2007 XLSX ")
->setDescription("Document for Office 2007 XLSX, generated using PHP classes.")
->setKeywords("office 2007 openxml php")
->setCategory("Test result file");
// Add some data
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', 'Jenis Report')
->setCellValue('B1', 'Pembayaran')
->setCellValue('C1', 'No')
->setCellValue('D1', 'Cabang')
//and some files
->setCellValue('AG1', 'Surveyor');
$rowNya = 3;
$no = 0;
while($row=mysql_fetch_array($hasil)){
$no = $no +1;
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue("A$rowNya", $row['jenReport'])
->setCellValue("B$rowNya", $row['pembayaran'])
->setCellValue("C$rowNya", $row['no'])
->setCellValue("D$rowNya", $row['cabang'])
->setCellValue("E$rowNya", $row['namaSales'])
->setCellValue("F$rowNya", $row['jenLaporan'])
//and some files
->setCellValue("AG$rowNya", $row['surveyor']);
$rowNya = $rowNya + 1;
}
// Rename sheet
$objPHPExcel->getActiveSheet()->setTitle('Simple');
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
// Redirect output to a client’s web browser (Excel5)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="database.xls"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;
?>
You are running out of RAM that can be used by PHP. You can set how much RAM that PHP will use in php.ini. You currently have this limit set to 24MB, which is pretty low. Try increasing it.
ini_set('memory_limit', '256M');
PHPExcel is known for being memory hungry. The website has a discussions with some workarounds, see http://phpexcel.codeplex.com/discussions/242712?ProjectName=phpexcel
You could also consider using another library like the old Spreadsheet_Excel_Writer lib (which has its drawbacks as well)
http://pear.php.net/package/Spreadsheet_Excel_Writer/redirected