如何使用 PHP Excel 创建可读的 Excel 文件
How to created w readable Excel file with PHP Excel
我一直在使用 PHPExcel 从 csv 文件创建传播sheet。除了 Excel 文件被标记为只读之外,我已经能够完美地工作。我已经浏览了 Class 的 GitHub 问题,并且我在这个版块上进行了 运行 搜索,但找不到任何人讨论这个问题。
能否PHPExcel写入未标记为只读的Excel文件?
这是我的代码。如您所见,我已尝试将所有 sheet 保护和锁定选项标记为 false。
<?php /** Error reporting */
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('Europe/London');
echo "<h1>FINDLAY FOODS Product List CSV Import to Excel</h1><br /><br />";
/** Include PHPExcel */
require_once dirname(__file__) . '/../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 properties", EOL;
$objPHPExcel->getProperties()->setCreator("Findlay Foods")->setLastModifiedBy("Findlay Foods")->setTitle("Prod_List_Test_1")->
setSubject("PRod List Test")->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")->
setKeywords("office 2007 openxml php")->setCategory("Test result file");
echo date('H:i:s'), " Add data", EOL;
$objPHPExcel->setActiveSheetIndex(0);
$new_array = array();
$row = 1;
$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Code');
$objPHPExcel->getActiveSheet()->setCellValue('B1', 'True');
$objPHPExcel->getActiveSheet()->setCellValue('C1', 'Rebate');
$objPHPExcel->getActiveSheet()->setCellValue('D1', 'Break');
$objPHPExcel->getActiveSheet()->setCellValue('E1', 'Portion');
$objPHPExcel->getActiveSheet()->setCellValue('F1', 'Unit');
if (($handle = fopen("prodlist.csv", "r")) !== false)
{
while (($data = fgetcsv($handle, 1000, ",")) !== false)
{
$row++;
for ($c = 0; $c < 1; $c++)
{
$fcode = trim(str_pad($data[0], 5, "0", STR_PAD_LEFT));
$fcode = (float)$fcode;
$true = trim($data[1]);
$true = (float)$true;
$true = number_format($true, 2, '.', '');
$rebate = trim($data[2]);
$bf = trim($data[3]);
$str = trim($data[4]);
$portion = filter_var($str, FILTER_SANITIZE_NUMBER_INT);
$size = strtolower(preg_replace("/[0-9]/", "", $str));
$size = strtolower(preg_replace("/\./", "", $size));
$objPHPExcel->getActiveSheet()->setCellValue('A' . $row, $fcode);
$objPHPExcel->getActiveSheet()->getStyle('A' . $row)->getNumberFormat()->setFormatCode('0000#');
$objPHPExcel->getActiveSheet()->setCellValue('B' . $row, $true);
$objPHPExcel->getActiveSheet()->getStyle('B' . $row)->getNumberFormat()->setFormatCode('#,##0.00');
$objPHPExcel->getActiveSheet()->setCellValue('C' . $row, $rebate);
$objPHPExcel->getActiveSheet()->getStyle('C' . $row)->getNumberFormat()->setFormatCode('#,##0.00');
$objPHPExcel->getActiveSheet()->setCellValue('D' . $row, $bf);
$objPHPExcel->getActiveSheet()->setCellValue('E' . $row, $portion);
$objPHPExcel->getActiveSheet()->setCellValue('F' . $row, $size);
}
}
fclose($handle);
}
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->getProtection()->setSort(false);
$objPHPExcel->getActiveSheet()->getProtection()->setInsertRows(false);
$objPHPExcel->getActiveSheet()->getProtection()->setFormatCells(false);
$objPHPExcel->getSecurity()->setLockWindows(false);
$objPHPExcel->getSecurity()->setLockStructure(false);
echo date('H:i:s'), " Write to Excel5 format", EOL;
$callStartTime = microtime(true);
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->setOffice2003Compatibility(true);
$objWriter->save(str_replace(__file__, '/../data/list/findlay-prodlist.xlsx', __file__));
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
echo date('H:i:s'), " File written to ", str_replace('.php', '.xls', pathinfo(__file__, PATHINFO_BASENAME)),
EOL;
echo 'Call time to write Workbook was ', sprintf('%.4f', $callTime), " seconds", EOL;
// Echo memory usage
echo date('H:i:s'), ' Current memory usage: ', (memory_get_usage(true) / 1024 / 1024), " MB", EOL;`enter code here`
// 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; ?>
打开后"save as"
编辑:抱歉,我可能误解了问题。为了扩展我的回答,您所解决的保护措施等是 'inside' 文件。只读状态由操作系统设置。需要处理的是文件权限。无论您在何处制作文件,都必须是供阅读它的用户使用的可写目录。如果通过浏览器下载,同样适用。
我一直在使用 PHPExcel 从 csv 文件创建传播sheet。除了 Excel 文件被标记为只读之外,我已经能够完美地工作。我已经浏览了 Class 的 GitHub 问题,并且我在这个版块上进行了 运行 搜索,但找不到任何人讨论这个问题。
能否PHPExcel写入未标记为只读的Excel文件? 这是我的代码。如您所见,我已尝试将所有 sheet 保护和锁定选项标记为 false。
<?php /** Error reporting */
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('Europe/London');
echo "<h1>FINDLAY FOODS Product List CSV Import to Excel</h1><br /><br />";
/** Include PHPExcel */
require_once dirname(__file__) . '/../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 properties", EOL;
$objPHPExcel->getProperties()->setCreator("Findlay Foods")->setLastModifiedBy("Findlay Foods")->setTitle("Prod_List_Test_1")->
setSubject("PRod List Test")->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")->
setKeywords("office 2007 openxml php")->setCategory("Test result file");
echo date('H:i:s'), " Add data", EOL;
$objPHPExcel->setActiveSheetIndex(0);
$new_array = array();
$row = 1;
$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Code');
$objPHPExcel->getActiveSheet()->setCellValue('B1', 'True');
$objPHPExcel->getActiveSheet()->setCellValue('C1', 'Rebate');
$objPHPExcel->getActiveSheet()->setCellValue('D1', 'Break');
$objPHPExcel->getActiveSheet()->setCellValue('E1', 'Portion');
$objPHPExcel->getActiveSheet()->setCellValue('F1', 'Unit');
if (($handle = fopen("prodlist.csv", "r")) !== false)
{
while (($data = fgetcsv($handle, 1000, ",")) !== false)
{
$row++;
for ($c = 0; $c < 1; $c++)
{
$fcode = trim(str_pad($data[0], 5, "0", STR_PAD_LEFT));
$fcode = (float)$fcode;
$true = trim($data[1]);
$true = (float)$true;
$true = number_format($true, 2, '.', '');
$rebate = trim($data[2]);
$bf = trim($data[3]);
$str = trim($data[4]);
$portion = filter_var($str, FILTER_SANITIZE_NUMBER_INT);
$size = strtolower(preg_replace("/[0-9]/", "", $str));
$size = strtolower(preg_replace("/\./", "", $size));
$objPHPExcel->getActiveSheet()->setCellValue('A' . $row, $fcode);
$objPHPExcel->getActiveSheet()->getStyle('A' . $row)->getNumberFormat()->setFormatCode('0000#');
$objPHPExcel->getActiveSheet()->setCellValue('B' . $row, $true);
$objPHPExcel->getActiveSheet()->getStyle('B' . $row)->getNumberFormat()->setFormatCode('#,##0.00');
$objPHPExcel->getActiveSheet()->setCellValue('C' . $row, $rebate);
$objPHPExcel->getActiveSheet()->getStyle('C' . $row)->getNumberFormat()->setFormatCode('#,##0.00');
$objPHPExcel->getActiveSheet()->setCellValue('D' . $row, $bf);
$objPHPExcel->getActiveSheet()->setCellValue('E' . $row, $portion);
$objPHPExcel->getActiveSheet()->setCellValue('F' . $row, $size);
}
}
fclose($handle);
}
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->getProtection()->setSort(false);
$objPHPExcel->getActiveSheet()->getProtection()->setInsertRows(false);
$objPHPExcel->getActiveSheet()->getProtection()->setFormatCells(false);
$objPHPExcel->getSecurity()->setLockWindows(false);
$objPHPExcel->getSecurity()->setLockStructure(false);
echo date('H:i:s'), " Write to Excel5 format", EOL;
$callStartTime = microtime(true);
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->setOffice2003Compatibility(true);
$objWriter->save(str_replace(__file__, '/../data/list/findlay-prodlist.xlsx', __file__));
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
echo date('H:i:s'), " File written to ", str_replace('.php', '.xls', pathinfo(__file__, PATHINFO_BASENAME)),
EOL;
echo 'Call time to write Workbook was ', sprintf('%.4f', $callTime), " seconds", EOL;
// Echo memory usage
echo date('H:i:s'), ' Current memory usage: ', (memory_get_usage(true) / 1024 / 1024), " MB", EOL;`enter code here`
// 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; ?>
打开后"save as"
编辑:抱歉,我可能误解了问题。为了扩展我的回答,您所解决的保护措施等是 'inside' 文件。只读状态由操作系统设置。需要处理的是文件权限。无论您在何处制作文件,都必须是供阅读它的用户使用的可写目录。如果通过浏览器下载,同样适用。