【问题标题】:phpexcel - using it with excel template (chart goes missing) phpphpexcel - 将它与 excel 模板一起使用(图表丢失) php
【发布时间】:2012-10-21 17:33:17
【问题描述】:

我曾尝试将 phpexcel 与我自己的模板文件一起使用。 phpexcel 加载文件并将数据写入某些单元格 A2、A3、A4,例如......并使用新数据打开一个输出文件。

我的模板文件有图表内置.. 我想要 phpexcel 做的就是在单元格中填充值并且不要触摸图表。并且,打开新文件。 (请注意,我不想在代码中制作图表。我希望图表以与我最初创建的格式相同的格式预先存在于我的模板中)。只有数据应该更新。

但是,当我尝试这样做时.. 图表本身会从结果文件中丢失。尝试了各种方法后..仍然失败。

而且,我从http://phpexcel.codeplex.com/discussions/397263找到了以下代码

require_once 'Classes/PHPExcel.php'; 
/** PHPExcel_IOFactory */
include 'Classes/PHPExcel/IOFactory.php';




$target ='Results/';
$fileType = 'Excel2007';   
$InputFileName = $target.'Result.xlsx';   
$OutputFileName =  $target . '_Result.xlsx';

 //Read the file (including chart template) 
$objReader = PHPExcel_IOFactory::createReader($fileType); 
$objReader->setIncludeCharts(TRUE);
$objPHPExcel = $objReader->load($InputFileName); 

 //Change the file 


$objPHPExcel->setActiveSheetIndex(0)
// Add data
            ->setCellValue('C3','10' )
            ->setCellValue('C4','20' )
            ->setCellValue('C5','30')
            ->setCellValue('C5','40' );

 //Write the file (including chart)

PHPExcel_Settings::setZipClass(PHPExcel_Settings::PCLZIP);
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, $fileType); 
$objWriter->setIncludeCharts(TRUE);
$objWriter->save($OutputFileName);

上面的代码在 excel 2010 中工作,现在我的图表保持不变......但是当我尝试使用文件类型“Excel5”时它仍然不起作用。

它会抛出以下错误:

    Fatal error: Call to undefined method PHPExcel_Reader_Excel5::setIncludeCharts()
 in D:\IT\bfstools\PHPExcel\MyExamples\test1.php on line 16

请提供一个简单的解决方案,我希望我的模板文件可以与 .xls 和 .xlsx 一起使用,并且模板文件中的所有原始图表都应该保持不变。我不希望图表从结果文件中删除它。我也不打算使用 phpexcel 代码创建图表。 (当excel可以为你完成所有工作时,为什么还要编写不必要的代码)。

我想要最简单的方法,即使用模板中的所有内容,并用新数据填充单元格。而且,我在模板中现有的图表会自动上线。我不想编写不必要的代码,但我可以安全地依赖 Excel 模板和图表功能。

请帮忙。

【问题讨论】:

标签: php phpexcel


【解决方案1】:

如果你会使用 Golang,试试Excelize。支持保存文件不丢失XLSX原始图表。

【讨论】:

    【解决方案2】:

    尝试设置setIncludeCharts

    $objReader = PHPExcel_IOFactory::createReader('Excel2007');
    //  Tell the reader to include charts when it loads a file
    $objReader->setIncludeCharts(TRUE);
    //  Load the file
    $objPHPExcel = $objReader->load($filePath);
    

    【讨论】:

      【解决方案3】:

      这有一个很好的理由:

      图表仅在核心中实现,此时对于 Excel2007 读取器和写入器,所有其他读取器或写入器将忽略图表,将它们视为根本不存在。其目的是在来年向其他读者/作者推出图表。

      编辑

      我从你的评论中看出你根本不明白 PHPExcel 是如何工作的,所以我有很多解释要做。

      PHPExcel 不是用于“编辑”工作簿文件的库:您不是在使用 PHPExcel 来更改文件,而是在更改 可以 的 PHPExcel 对象em> 从文件中加载,然后 可以写入文件。

      PHPExcel Core 是电子表格的内存表示形式,其中不同的组成对象(如工作表、单元格、图像、样式等)都表示为 PHP 对象。

      PHPExcel 阅读器解析电子表格文件并从已编程识别的文件中加载所有组件,并从这些文件组件创建适当的 PHPExcel 核心对象。如果没有等效的 PHPExcel Core 对象(例如数据透视表),则无法“加载”该文件组件;如果加载器没有被编程来识别文件组件,那么它就不能被加载。在这些情况下,文件中的那些元素会被简单地忽略。一旦 Reader 完成了它的工作,一个 PHPExcel 对象就存在了,并且电子表格文件被关闭并被遗忘了。

      当内存中存在 PHPExcel Core 对象时,您有一组方法允许您操作和更改它,添加、修改或删除 Core 元素;但这些工作纯粹在组成 PHPExcel 核心的工作表、单元格、样式对象的“内存中”集合上工作。核心的存在并不知道已从文件加载或已使用 PHP“new PHPExcel()”语句创建;它不会以任何方式更改文件。

      写作时,反之亦然。每个 Writer 获取 PHPExcel 核心对象,并将它们以适当的格式(Excel BIFF、OfficeOpenXML、HTML 等)写入文件。与读者一样,每个作者只能编写那些已编程编写的 PHPExcel Core 对象。如果它没有被编程来编写(例如,图表),那么 PHPExcel Core 中定义的任何图表都将被忽略,因为那个作者根本不知道如何编写它们。同样,PHPExcel Core 中存在的不受正在写入的文件格式支持的功能(例如 CSV Writer 的单元格样式)将被忽略。

      因此,为了支持图表等电子表格功能,PHPExcel Core 对象集合必须经过修改,以提供这些元素的“内存中”表示,供不同的读者使用已被编程以识别它们正在加载的文件中的那些元素并将它们转换为适当的 PHPExcel 核心对象,对于不同的编写器已被编程为将 PHPExcel 核心表示转换为适当的文件表示。

      每个 Reader 和每个 Writer 都需要单独编程。图表是一个相对较新的功能,仅在 1.7.7 版本中添加到 PHPExcel Core 中,此时只有 Excel2007 格式的 Reader 和 Writer 被编程以识别图表元素。 虽然开发人员的意图是扩展它以涵盖其他格式,但不会自动创建必要的代码。对每个单独的 Reader 和 Writer 进行编程需要时间和精力。虽然 Excel2007 读写器的图表代码现在已经稳定到不再被认为是“实验性”的地步,并且开发重点转向编写在 Excel5 读写器中处理图表所需的代码,但它是工作还没有完成。

      【讨论】:

      • 感谢您的快速回复,但我并不完全理解所说的内容。但据我了解...为什么忽略(或删除)模板上的图表。为什么 phpexcel 不能只管它(即不删除它).. 并继续其仅填充模板单元格的工作。而且,我的图表将通过 Excel 本身的功能自动更新,无需 phpexcel 的支持。 phpexcel 删除图表对我来说没有任何意义。有什么技术原因吗?为什么phpexcel不能不管它。
      • @Mark Ba​​ker:我基本上明白你的意思——感谢您的澄清。但我不明白为什么即使我与 PHPExcel 沟通我正在处理 Excel 2007 或更高版本的电子表格,图表仍然存在。因为我使用了 PHPExcel 1.7.7 并且根据您的最后一段(如果我理解正确的话),图表的正确处理应该已经在 2007 年或更高版本中可用。 ?
      • 引用你原来的问题(我的重点):“上面的代码在 excel 2010 中工作,现在我的图表保持不变......但是当我尝试使用文件类型 Excel5 它不起作用。”.... Excel5 是 BIFF 文件 (.xls); Excel2007 是 OfficeOpenXML 文件 (.xlsx)
      • 非常感谢您的解释,现在已经很好理解了。自从我了解 phpexcel 到现在只有 2 天,我希望您的详细解释可以在您的文档或常见问题解答中提供给其他读者,以了解“phpexcel 到底是什么,不是什么”。它在文档中可用吗?除了我的要求之外,phpexcel 是一项出色的工作。非常感谢您的贡献。
      • 另一方面..你能告诉我是否还有其他选择可供我做我想做的事..打开excel模板文件(.xlsx甚至.xlsm)在 php 中填充单元格并保持所有图表、数据透视表,甚至宏、表单、按钮等完好无损。 php 所做的只是用数据库中的新数据填充单元格。换句话说,使用您使用过的相同术语。请指向我可以用来“编辑”工作簿文件的库。再次感谢您。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 2016-06-02
      • 1970-01-01
      相关资源
      最近更新 更多