我想写入我的.xlsb excel文件,其名称是当天的编号.
例如,昨天的文件名是23.xlsb.
初始文件的名称是"Template.xlsb",位置不同.正如您所看到的那样,它会在新位置复制并重命名.在这个文件中我有很多宏和vba代码,这就是为什么我不想创建一个新的Excel文件.
最后,此Excel文件的链接位于此变量中$renamed_link.
$renamed_link = C:\Documents and Settings\Administrator\Desktop\Rezultate DIDU\2017\Apr\23.xlsb.
我想用我的sql query($parametri)中的数据填充第一个名为"Parametri"的工作表.
工作表的范围将填充数据从A2直到T and the total number of the rows.该表有20列.
<?php
require(realpath(dirname(__FILE__)."/PHPExcel-1.8/Classes/PHPExcel.php"));
$sql_data = date('d.m.Y', strtotime('-1days'));
$conn = oci_connect('USER', 'PASS', 'dark:1521/DAR');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
Else {echo 'Connection successfully !';
}
$parametri = oci_parse($conn,"SELECT * FROM R0508UNITP WHERE TO_DATE('${sql_data}','DD.MM.YYYY') BETWEEN R0508UNITP.R0508VFROM AND R0508UNITP.R0508VTILL");
oci_execute($parametri);
echo "<table border='1'>\n";
while ($row = oci_fetch_array($parametri, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : " ") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
$day = date('j', strtotime('-1 days'));
$month = date('M', strtotime('-1 days'));
$year = date('Y', strtotime('-1 days'));
$link = "C:\Documents and Settings\Administrator\Desktop\Rezultate DIDU\\${year}\\${month}";
$template_link = 'C:\Documents and Settings\Administrator\Desktop\Rezultate DIDU\Template.xlsb';
$destination_link = "C:\Documents and Settings\Administrator\Desktop\Rezultate DIDU\\${year}\\${month}".'\Template.xlsb';
$renamed_link = "C:\Documents and Settings\Administrator\Desktop\Rezultate DIDU\\${year}\\${month}\\${day}".'.xlsb';
if(!is_dir($link))
{
mkdir($link, 0777,true);
}
if(!file_exists($destination_link))
{
copy($template_link,$destination_link);
} else {
}
rename($destination_link,$renamed_link);
?>
Run Code Online (Sandbox Code Playgroud)
解析和(特别是)编辑和xlsb(miscrosoft excel二进制文件)根本不是微不足道的.
在撰写本文时,您可以在以下链接中找到~1000页格式规范pdf:http://interoperability.blob.core.windows.net/files/MS-XLSB/[MS-XLSB] .pdf
为了避免xlsb的复杂性,有一些PHP库可以让你操作这些文件:
EasyXLS是一个商业解决方案:
另一个选择是PHPExcel
https://github.com/PHPOffice/PHPExcel
它是根据LGPL许可的.该库允许您编写(以及其他BIFF 8 (.xls) Excel 95 and above文件)文件.您应该检查您的xlsb文件是否属于此类别.
当您从数据库中获取数据时(您已经成功完成此操作),然后将该数据插入xlsb模板文件并保存为新文件是微不足道的.这两个库都提供了示例和教程.
只需其中一个:https://www.easyxls.com/manual/tutorials/php/read-xlsb-file.html
如上所述,EasyXLS可以读取内部格式为BIFF12的xlsb文件.
这是在他们的网站上说明的,我没有测试他们的软件,但有一个"试用版"可供下载,所以你可以尝试一下.
EasyXLS不是免费的,在撰写本文时大约是295美元,因此根据您的项目可能会超出预算.
EasyXLS不是一个纯PHP库:.NET版本附带一个COM +库,支持PHP(以及其他语言).出于这个原因,它不适合*nix系统,但是因为你在Windows上它可能是一个可行的解决方案.
这个库的开发已经被放弃,有利于新的PhpSpreadsheet
后者仍处于发展阶段.然而,当前版本几乎完整且可用,我希望很快就能获得生产/稳定版本.
PhpSpreadsheet支持BIFF5和BIFF8格式,这些格式是扩展名为.xls的文件.
它不支持BIFF12 - .xlsb文件.
该文档是非常清晰透彻.
我按照文档中提供的说明下载并安装了当前版本的Composer.
我将您提供的Template.xlsb文件"降级" 为.xls格式(使用Excel).显然我没有丢失原始文件的任何功能.
然后我可以使用以下代码编辑它...
<?php
require 'vendor/autoload.php';
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls();
$spreadsheet = $reader->load( 'Template.xls' );
$worksheet = $spreadsheet->getSheetByName( 'PARAMETRI' );
$worksheet->setCellValue( 'A2', 123 );
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xls( $spreadsheet );
$writer->save( "Template-Modified.xls" );
Run Code Online (Sandbox Code Playgroud)
...但保存的文件Template-Modified.xls 丢失了宏.
但是,在我使用宏创建的另一个.xls文件上运行相同的代码,在此过程中成功完成而不会丢失任何内容.
您的文件中的宏可能会丢失,因为它们在源文件中受密码保护.
我认为只需轻微妥协,您就可以在PHPSpreadsheet的项目中取得成功.
我不知道您是否可以降级到.xls和/或从模板文件中的宏中删除密码保护.
无论如何PHPSpreadsheet开发非常活跃,文档和代码都很好.
您可以通过GitHub直接从开发团队获得进一步的信息或支持