Newsgroup: it.comp.www.php
Titolo: Funzioni su foglio di calcolo

Salva a tutti, nella mia azienda è sorto questo tipo di problema:
sono stati crati dei fogli di calcolo in excel dove sono state
caricate delle funzioni matematiche abbastanza pesanti, adesso voglio
mettere in rete il seguente foglio magari con un'interfaccia tipo form
in grado di interfacciarsi con il foglio sottostante.
vorrei sapere se tutto questo è possibile....ovvero:
1 Leggo il dato dalla form
2 lo carico nel foglio excel
3 leggo il risultato dal folgio
4 lo invio alla form
leggendo qua e la immagino che tutto questo sia molto difficile se non
impossibile.
Aspetto vostre risposte e vi ringrazio

impossibile.
http://www.spreadsheetcomponent.com/
...anche se io considererei la *possibilita'* di convertire quel foglio di
calcolo in PHP.
Leonardo
-- 
There is nothing makes a man suspect much, more than to know little,
and therefore men should remedy suspicion by procuring to know more,
and not keep their suspicions in smother.            (Francis Bacon)

 Leonardo
Non mi dispiacerebbe neanche a me l'idea della conversione ma ti
assicuro che si tratta di un foglio molto complesso...
cosa mi consiglieresti di leggere/usare per la conversione?

> Leonardo

La cosa piu' complessa e' il calcolo delle dipendenze, ovvero, se hai una
roba tipo
	(Cella A1): B1+C1
	(Cella B1): 2*C2
	(Cella C1): 42
	(Cella C2): 12
ed aggiorni la cella C2, questo deve scatenare l'aggiornamento di A1. Per
fare una cosa del genere bisogna costruirsi un alberino di dipendenze una
volta per tutte, che contenga i "percorsi" da seguire per aggiornare ogni
cosa.
Ma se gia' sai che non ci sono referenze circolari, puoi appoggiarti alla
ricorsione.
Le formule non sono troppo complicate perche' puoi realizzarle a colpi di
funzione. Considera per es.
	SOMMA(C1:D8)+AVERAGE(A1:F5)+SQRT(A11+A12)
Con qualche giro di regexp, per riconoscere le caselle "singole":
	SOMMA(C1:D8)+AVERAGE(A1:F5)+SQRT(VALUE('A11')+VALUE('A12'))
e poi:
	XLS_SOMMA('C1:D8')+XLS_AVERAGE('A1:F5')+XLS_SQRT(VALUE...
che puoi valutare con... eval, a patto di avere XLS_SOMMA, XLS_AVERAGE e
cosi' via, che pero' devi scriverti una volta sola:
	function XLS_SOMMA($range)
	{
		$sum	= 0;
		$cells	= XLS_range($range);
		foreach($cells as $cell)
			$sum += XLS_value($cell);
		return $sum;
	}
	function XLS_AVERAGE($range)
	{
		$sum	= 0;
		$cells	= XLS_range($range);
		foreach($cells as $cell)
			$sum += XLS_value($cell);
		return $sum / count($cells);
	}
...le funzioni "complicate" (nemmen tanto) sono quelle di servizio, come
appunto XLS_range o XLS_value, o XLS_recalculate:
	function XLS_range($range, $refresh = true)
	{
		switch(count($xt = explode(':', $range)))
		{
			case 1:
				return $xt[0];
			case 2:
				break;
			default:
				trigger_error(...);
		}
		$cellname = '/([A-Za-z]+)([1-9][0-9]*)/';
		for ($i = 0; $i < 2; $i++)
		{
			if (!preg_match($cellname, $xt[$i], $gregs,
SEE_MANUAL))
			trigger_error(...);
			$C[$i]	= $gregs[1];
			$R[$i]	= $gregs[2];
		}
		// Inserisce tutte le celle nel range.
		// Qui eventuali formule vanno valutate al volo
		// (non e' molto efficiente come strategia, ma...)
		$cells = array();
		for ($r = $R[0]; $r < $R[1]; $r++)
			for ($c = cell2num($C[0]); $c < cell2num($R[1]);
$c++)
				$cells[] = "$r" . num2cell($c);
		if ($refresh)
		{
			$timestamp = time();
			foreach($cells as $cell)
				XLS_recalculate($cell, $timestamp);
		}
		return $cells;
	}
Leonardo e la continua reinvenzione dell'acqua tiepida
