5

我曾尝试将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 模板和图表功能。

请帮忙。

4

3 回答 3

10

这有一个很好的理由:

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

编辑

我从您的评论中看到您根本不了解 PHPExcel 的工作原理,所以我有很多解释要做。

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

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

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

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

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

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

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

于 2012-11-01T07:40:07.200 回答
0

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

于 2017-01-04T07:16:27.160 回答
-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);
于 2015-09-21T07:45:57.717 回答