phpexcel - 使用excel模板(图表丢失)php

时间:2012-11-01 06:08:35

标签: php phpexcel

我尝试将 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,现在让我的图表保持正常......但是当我尝试使用filetype" 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模板和图表功能。

请帮忙。

3 个答案:

答案 0 :(得分:10)

有一个很好的理由:

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

修改

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

PHPExcel 用于“编辑”工作簿文件的库:您没有使用PHPExcel来更改文件,而是在更改 可以 ,随后将 写入文件。

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

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

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

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

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

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

答案 1 :(得分:0)

如果您可以使用Golang,请尝试Excelize。支持保存文件,而不会丢失XLSX的原始图表。

答案 2 :(得分:-1)

尝试设置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);