PHP使用来自Oracle的数据填充现有.xlsb文件的值

时间:2017-04-24 12:54:37

标签: php oracle

我想写入我的.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”的工作表。
数据填充的工作表范围从A2T 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) : "&nbsp;") . "</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);
?>

我的php表的打印屏幕(其中一些)。
这个表我想要在我的excel文件中。 enter image description here

1 个答案:

答案 0 :(得分:7)

解析和(特别是)编辑和 xlsb (miscrosoft excel二进制文件)并非易事。

在撰写本文时,您可以在以下链接找到~1000页格式规范pdf:http://interoperability.blob.core.windows.net/files/MS-XLSB/[MS-XLSB].pdf

为了避免 xlsb 复杂性,可以使用PHP库来操作这些文件:

EasyXLS 是一种商业解决方案:

https://www.easyxls.com/

另一个选项是 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 时,它可能是一个可行的解决方案。

让我们看看 PHPExcel

此库的开发已被放弃,有利于新 PhpSpreadsheet

后者仍处于发展阶段。然而,当前版本几乎完整且可用,我希望很快就能获得生产/稳定版本。

PhpSpreadsheet 支持 BIFF5 BIFF8 格式,这些格式是扩展名为 .xls 的文件。

支持 BIFF12 - .xlsb 文件。

测试 PHPSpreadsheet

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 直接从开发团队获得更多信息或支持