Bonjour,

Je me tourne vers vous après de nombreux essais sans résultats...

Je dois utiliser un fichier Excel existant possédant plusieurs onglet, le modifier et en effectuer une copie comprenant tous les onglets.

Jusque là tout va bien.

Je dois maintenant effectuer une copie complète d'une feuille / d'un onglet d'un classeur et le dupliquer x fois..

La fonction clone de Phpexcel permet de faire cette tâche.

J'arrive à dupliquer x fois sans problèmes.

Mon problème :
Lorsque je duplique un onglet possédant des graphiques et des formules, les données rattachées aux graphiques sont liés à la feuille servant de clone. Si je modifie l'onglet n°2 qui est un clone de l'onglet n°1 les graphiques de l'onglet n°2 sont liés aux données de l'onglet n°1 ! Balo !

Comment effectuer une copie d'une feuille / onglet en conservant le lien à l'onglet cloné et non à son original ?

Voici mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
 
<?php
require_once("inc/PhpExcel/Classes/PHPExcel.php");
require_once("inc/PhpExcel/Classes/PHPExcel/IOFactory.php");
 
$fileType = 'Excel2007';
$fileName = 'classeur3.xlsx';
$fileNameB = 'classeur3T.xlsx';
 
	// Lecture du fichier templates
	$objReader = PHPExcel_IOFactory::createReader($fileType);
	$objReader->setIncludeCharts(TRUE);
	$LoadExcel = $objReader->load($fileName);
 
 
	// Création de l'objet PhpExcel avec lequel on va travailler
	$objPHPExcel = new PHPExcel();
 
	// Suppression du premier onglet créé automatiquement
	$sheetIndex = $objPHPExcel->getIndex($objPHPExcel->getSheetByName('Worksheet'));
	$objPHPExcel->removeSheetByIndex($sheetIndex);
 
 
	// Lecture des graphiques du fichier
	foreach ($LoadExcel->getWorksheetIterator() as $worksheet) {
			$sheetName = $worksheet->getTitle();
			echo 'Worksheet: ' , $sheetName , EOL;
 
			$chartNames = $worksheet->getChartNames();
			if(empty($chartNames)) {
				echo '    There are no charts in this worksheet' , EOL;
			} else {
				natsort($chartNames);
				foreach($chartNames as $i => $chartName) {
					$chart = $worksheet->getChartByName($chartName);
					if (!is_null($chart->getTitle())) {
						$caption = '"' . implode(' ',$chart->getTitle()->getCaption()) . '"';
					} else {
						$caption = 'Untitled';
					}
					echo '    ' , $chartName , ' - ' , $caption , EOL;
					echo str_repeat(' ',strlen($chartName)+3);
					$groupCount = $chart->getPlotArea()->getPlotGroupCount();
					if ($groupCount == 1) {
						$chartType = $chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotType();
						echo '    ' , $chartType , EOL;
					} else {
						$chartTypes = array();
						for($i = 0; $i < $groupCount; ++$i) {
							$chartTypes[] = $chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType();
						}
						$chartTypes = array_unique($chartTypes);
						if (count($chartTypes) == 1) {
							$chartType = 'Multiple Plot ' . array_pop($chartTypes);
							echo '    ' , $chartType , EOL;
						} elseif (count($chartTypes) == 0) {
							echo '    *** Type not yet implemented' , EOL;
						} else {
							echo '    Combination Chart' , EOL;
						}
					}
				}
			}
 
			// On ajoute la feuille à objPHPExcel
			$add_sheet = $objPHPExcel->addSheet($worksheet);			
			$iok++;
		}
 
	// Mise à jour de la feuill1
	$sheet1 = $objPHPExcel->getSheet(0);
	$sheet1->setCellValue('E31', '10');
	$sheet1->setCellValue('E32', '12');
	$sheet1->setCellValue('E33', '25');
 
	// On copie la feuill1 en feuill2
	$sheet1 = $LoadExcel->getSheet(0);
	$sheet2 = clone $sheet1;
	$sheet2->setTitle('Cloned Worksheet');
	$objPHPExcel->addSheet($sheet2);
 
        // Mise à jour de la feuill2
        // Cette partie doit normalement modifier le graphique en page 2
	$sheet2 = $objPHPExcel->getSheet(1);
	$sheet2->setCellValue('E31', '22');
	$sheet2->setCellValue('E32', '2');
	$sheet2->setCellValue('E33', '5');
 
	// Enregistrement du fichier final
	$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, $fileType);
	$objWriter->setIncludeCharts(TRUE);
	$objWriter->save($fileNameB);
 
 
?>
La page est bien cloné mais les données du graphique sont reliés à feuill1.

Merci d'avance !!

Guillaume