我想写入我的.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查询($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);
?>
答案 0 :(得分:7)
解析和(特别是)编辑和 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+ Library,支持PHP(以及其他语言)。出于这个原因,它不适合 * nix 系统,但是当你在 Windows 时,它可能是一个可行的解决方案。
此库的开发已被放弃,有利于新 PhpSpreadsheet
后者仍处于发展阶段。然而,当前版本几乎完整且可用,我希望很快就能获得生产/稳定版本。
PhpSpreadsheet 支持 BIFF5 和 BIFF8 格式,这些格式是扩展名为 .xls 的文件。
不支持 BIFF12 - .xlsb 文件。
documentation非常清晰彻底。
我按照文档中提供的说明,使用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" );
...但保存的文件Template-Modified.xls
丢失了宏。
然而,在过程中使用宏成功的另一个 .xls 文件上运行相同的代码而不会丢失任何内容。
您文件中的宏可能会丢失,因为源文件中的密码保护。
我认为通过 PHPSpreadsheet ,您可以通过轻微的妥协在项目中取得成功。
我不知道您是否可以降级到 .xls 和/或从模板文件中的宏中删除密码保护。
无论如何 PHPSpreadsheet 开发非常活跃,文档和代码都很好。
您可以通过 GitHub 直接从开发团队获得更多信息或支持