Seite 1 von 2

NEUES MODUL :: Excel Viewer

Verfasst: Do 27. Sep 2007, 12:45
von wayfearer
Hi Leute,

hier noch mal ein neues Modul von mir.
Aktualisierte Version vom 29.09.2007
!!! WICHTIG !!! - Um es nutzern zu können müsst ihr folgende Datei runterladen http://marcelbensch.de/upload/downloads/excel.rar, entpacken und den ordner excel so wie er ist in den Mandanten/includes ordner verschieben.

So hier nun der Modul Quelltext:
Beschreibung:

Code: Alles auswählen

Ein Excel Viewer auf Basis der PHPExcelReader Klasse
Version 1.0

Dient dazu um Excel Dokumente direkt im Web anzeigen zu lassen ohne vorher alles selbst in HTML umbauen zu müssen.
Aussehen wird über Stylesheets angepasst.
Eingabe:

Code: Alles auswählen

?><?php
/***********************************************
* CONTENIDO MODUL - INPUT
*
* Modulname   :     Excel Viewer
* Author(s)   :     Marcel Bensch, (Original Module: Illustration by Andreas Lindner, 4fb
* Copyright   :     Marcel Bensch
* Created     :    15.08.2007
************************************************/

#Selected xls directory
$cms_dirname = "CMS_VALUE[1]"; //
#Selected xls
$cms_filename = "CMS_VALUE[2]";

if ($cms_dirname == '' || $cms_dirname == '0') {
	$cms_dirname = 'upload/';
}

#Get paths
$sql = "SELECT
	htmlpath, frontendpath
	FROM
	".$cfg["tab"]["clients"]." 
	WHERE
	idclient = ".$client." ";

$db->query($sql);

if ($db->next_record()) {
	$htmlpath = $db->f('htmlpath');
	$frontendpath = $db->f('frontendpath');
}

#Choose excel folder
echo '<table cellpadding="0" cellspacing="0" border="0">
	<tr><td class="text_medium" style="padding:5px">'.mi18n("Hier k&ouml;nnen Sie die gewünschte Excel-Datei zur Anzeige ausw&auml;hlen").'</td></tr>
	<tr><td class="text_medium" style="padding:5px">'.mi18n("Verzeichnis mit Datei ausw&auml;hlen").': </td></tr>
	<tr><td class="text_medium" style="padding:5px">';
echo '<select name="CMS_VAR[1]" style="width:200px">';

#Get upload directories
$sql = "SELECT DISTINCT
	dirname
	FROM
	".$cfg["tab"]["upl"]."
	WHERE
	idclient='$client' AND
	filetype IN ('xls')
	ORDER BY
	dirname";

$db->query($sql);

$selected = false;
while ($db->next_record()) {
	$dirname = $db->f('dirname');
	if ($cms_dirname != $dirname) {
		echo '<option value="'.$dirname.'">&nbsp;'.$dirname.'</option>';
	} else {
		$selected = true;
		echo '<option value="'.$dirname.'" selected="selected">&nbsp;'.$dirname.'</option>';
	}
}

if (!$selected) {
	echo '<option value="0" selected="selected">'.i18n("Bitte wählen").'</option>';
} else {
	echo '<option value="0">'.i18n("Bitte wählen").'</option>';
}

#Choose xls file
echo '</select>&nbsp;<input type="image" src="images/submit.gif">
	<tr><td class="text_medium" style="padding:5px">'.mi18n("Datei w&auml;hlen").': </td></tr>
	<tr><td class="text_medium" style="padding:5px">';
echo '<select name="CMS_VAR[2]" style="width:200px">';
echo '<option value="0" selected="selected">'.i18n("Bitte w&auml;hlen").'</option>';

if ($cms_dirname != '0') {
	#Get uploaded files
	$sql = "SELECT 
			filename
			FROM
			".$cfg["tab"]["upl"]."
			WHERE
			idclient = '$client' AND
			filetype IN ('xls') AND
			dirname = '$cms_dirname' 
			ORDER BY
			filename";

	$db->query($sql);

	while ($db->next_record()) {
		$img_name = $db->f('filename');
		if ($cms_filename != $img_name) {
			echo '<option value="'.$img_name.'">&nbsp;'.$img_name.'</option>';
		} else {
			echo '<option selected="selected" value="'.$img_name.'">&nbsp;'.$img_name.'</option>';
		}
	}
}

echo '</select>&nbsp;<input type="image" src="images/submit.gif">';

#Preview image
if ($cms_dirname != '0' AND $cms_filename != '0' AND strlen($cms_dirname) > 0 AND strlen($cms_filename) > 0) {
	$img_path = $htmlpath.$cfgClient[$client]['upload'].$cms_dirname.$cms_filename;
	$img_split = preg_split("/\./", $cms_filename);
	$count = count($img_split);
	$type = $img_split[$count -1];

	echo '<tr><td colspan="2" style="padding:5px">		
				'.$htmlpath.$cfgClient[$client]['upload'].$cms_dirname.$cms_filename.'
			</td></tr> ';
}

echo '</td></tr>';
echo '</table>';
?><?php 
Ausgabe:

Code: Alles auswählen

<?php
#Selected xls directory
$cms_dirname = "CMS_VALUE[1]";
#Selected xls
$cms_filename = "CMS_VALUE[2]";
$allow_url_override = 1; // Set to 0 to not allow changed VIA POST or GET
$file_to_include = $htmlpath.$cfgClient[$client]['upload'].$cms_dirname.$cms_filename;
if(!$allow_url_override || !isset($file_to_include))
{
	$file_to_include = "yourfile.xls";
}
if(!$allow_url_override || !isset($max_rows))
{
	$max_rows = 0; //USE 0 for no max
}
if(!$allow_url_override || !isset($max_cols))
{
	$max_cols = 5; //USE 0 for no max
}
if(!$allow_url_override || !isset($debug))
{
	$debug = 0;  //1 for on 0 for off
}
if(!$allow_url_override || !isset($force_nobr))
{
	$force_nobr = 1;  //Force the info in cells not to wrap unless stated explicitly (newline)
}

cInclude ("frontend", "includes/excel/reader.php");
$data = new Spreadsheet_Excel_Reader();
$data->setOutputEncoding('UTF-8');
$data->setUTFEncoder('iconv');
$data->read($file_to_include);
error_reporting(E_ALL ^ E_NOTICE);

function make_alpha_from_numbers($number)
{
	$numeric = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	if($number<strlen($numeric))
	{
		return $numeric[$number];
	}
	else
	{
		$dev_by = floor($number/strlen($numeric));
		return "" . make_alpha_from_numbers($dev_by-1) . make_alpha_from_numbers($number-($dev_by*strlen($numeric)));
	}
}
echo "<script type='text/javascript' language='JavaScript'>
var sheet_HTML = Array();\n";
for($sheet=0;$sheet<count($data->sheets);$sheet++)
{
	$table_output[$sheet] .= "<table class='table_body'>";
	for($row=1;$row<=$data->sheets[$sheet]['numRows']&&($row<=1);$row++)
	{
		$table_output[$sheet] .= "<tr class='excel_headline'>";
		for($col=1;$col<=$data->sheets[$sheet]['numCols']&&($col<=$max_cols||$max_cols==0);$col++)
		{
			if($data->sheets[$sheet]['cellsInfo'][$row][$col]['colspan'] >=1 && $data->sheets[$sheet]['cellsInfo'][$row][$col]['rowspan'] >=1)
			{
				$this_cell_colspan = " colspan=" . $data->sheets[$sheet]['cellsInfo'][$row][$col]['colspan'];
				$this_cell_rowspan = " rowspan=" . $data->sheets[$sheet]['cellsInfo'][$row][$col]['rowspan'];
				for($i=1;$i<$data->sheets[$sheet]['cellsInfo'][$row][$col]['colspan'];$i++)
				{
					$data->sheets[$sheet]['cellsInfo'][$row][$col+$i]['dontprint']=1;
				}
				for($i=1;$i<$data->sheets[$sheet]['cellsInfo'][$row][$col]['rowspan'];$i++)
				{
					for($j=0;$j<$data->sheets[$sheet]['cellsInfo'][$row][$col]['colspan'];$j++)
					{
						$data->sheets[$sheet]['cellsInfo'][$row+$i][$col+$j]['dontprint']=1;
					}
				}
			}
			else if($data->sheets[$sheet]['cellsInfo'][$row][$col]['colspan'] >=1)
			{
				$this_cell_colspan = " colspan=" . $data->sheets[$sheet]['cellsInfo'][$row][$col]['colspan'];
				$this_cell_rowspan = "";
				for($i=1;$i<$data->sheets[$sheet]['cellsInfo'][$row][$col]['colspan'];$i++)
				{
					$data->sheets[$sheet]['cellsInfo'][$row][$col+$i]['dontprint']=1;
				}
			}
			else if($data->sheets[$sheet]['cellsInfo'][$row][$col]['rowspan'] >=1)
			{
				$this_cell_colspan = "";
				$this_cell_rowspan = " rowspan=" . $data->sheets[$sheet]['cellsInfo'][$row][$col]['rowspan'];
				for($i=1;$i<$data->sheets[$sheet]['cellsInfo'][$row][$col]['rowspan'];$i++)
				{
					$data->sheets[$sheet]['cellsInfo'][$row+$i][$col]['dontprint']=1;
				}
			}
			else
			{
				$this_cell_colspan = "";
				$this_cell_rowspan = "";
			}
			if(!($data->sheets[$sheet]['cellsInfo'][$row][$col]['dontprint']))
			{
				$table_output[$sheet] .= "<td class='table_data' $this_cell_colspan $this_cell_rowspan>&nbsp;";
				if($force_nobr)
				{
					$table_output[$sheet] .= "<nobr>";
				}
				$table_output[$sheet] .= nl2br(htmlentities($data->sheets[$sheet]['cells'][$row][$col]));
				if($force_nobr)
				{
					$table_output[$sheet] .= "</nobr>";
				}
				$table_output[$sheet] .= "</td>";
			}
		}
		$table_output[$sheet] .= "</tr>";
	}
	for($row=3;$row<=$data->sheets[$sheet]['numRows']&&($row<=$max_rows||$max_rows==0);$row++)
	{
	    if (is_int($row/2))
	    { $table_output[$sheet] .= "<tr class='bg_grey'>";}
	    else {$table_output[$sheet] .= "<tr >";}
	    
		for($col=1;$col<=$data->sheets[$sheet]['numCols']&&($col<=$max_cols||$max_cols==0);$col++)
		{
			if($data->sheets[$sheet]['cellsInfo'][$row][$col]['colspan'] >=1 && $data->sheets[$sheet]['cellsInfo'][$row][$col]['rowspan'] >=1)
			{
				$this_cell_colspan = " colspan=" . $data->sheets[$sheet]['cellsInfo'][$row][$col]['colspan'];
				$this_cell_rowspan = " rowspan=" . $data->sheets[$sheet]['cellsInfo'][$row][$col]['rowspan'];
				for($i=1;$i<$data->sheets[$sheet]['cellsInfo'][$row][$col]['colspan'];$i++)
				{
					$data->sheets[$sheet]['cellsInfo'][$row][$col+$i]['dontprint']=1;
				}
				for($i=1;$i<$data->sheets[$sheet]['cellsInfo'][$row][$col]['rowspan'];$i++)
				{
					for($j=0;$j<$data->sheets[$sheet]['cellsInfo'][$row][$col]['colspan'];$j++)
					{
						$data->sheets[$sheet]['cellsInfo'][$row+$i][$col+$j]['dontprint']=1;
					}
				}
			}
			else if($data->sheets[$sheet]['cellsInfo'][$row][$col]['colspan'] >=1)
			{
				$this_cell_colspan = " colspan=" . $data->sheets[$sheet]['cellsInfo'][$row][$col]['colspan'];
				$this_cell_rowspan = "";
				for($i=1;$i<$data->sheets[$sheet]['cellsInfo'][$row][$col]['colspan'];$i++)
				{
					$data->sheets[$sheet]['cellsInfo'][$row][$col+$i]['dontprint']=1;
				}
			}
			else if($data->sheets[$sheet]['cellsInfo'][$row][$col]['rowspan'] >=1)
			{
				$this_cell_colspan = "";
				$this_cell_rowspan = " rowspan=" . $data->sheets[$sheet]['cellsInfo'][$row][$col]['rowspan'];
				for($i=1;$i<$data->sheets[$sheet]['cellsInfo'][$row][$col]['rowspan'];$i++)
				{
					$data->sheets[$sheet]['cellsInfo'][$row+$i][$col]['dontprint']=1;
				}
			}
			else
			{
				$this_cell_colspan = "";
				$this_cell_rowspan = "";
			}
			if(!($data->sheets[$sheet]['cellsInfo'][$row][$col]['dontprint']))
			{
				$table_output[$sheet] .= "<td class='table_data' $this_cell_colspan $this_cell_rowspan>&nbsp;";
				if($force_nobr)
				{
					$table_output[$sheet] .= "<nobr>";
				}
				$table_output[$sheet] .= nl2br(htmlentities($data->sheets[$sheet]['cells'][$row][$col]));
				if($force_nobr)
				{
					$table_output[$sheet] .= "</nobr>";
				}
				$table_output[$sheet] .= "</td>";
			}
		}
		$table_output[$sheet] .= "</tr>";
	}
	$table_output[$sheet] .= "</table>";
	$table_output[$sheet] = str_replace("\n","",$table_output[$sheet]);
	$table_output[$sheet] = str_replace("\r","",$table_output[$sheet]);
	$table_output[$sheet] = str_replace("\t"," ",$table_output[$sheet]);
	if($debug)
	{
		$debug_output = print_r($data->sheets[$sheet],true);
		$debug_output = str_replace("\n","\\n",$debug_output);
		$debug_output = str_replace("\r","\\r",$debug_output);
		$table_output[$sheet] .= "<pre>$debug_output</pre>";
	}
	echo "sheet_HTML[$sheet] = \"$table_output[$sheet]\";\n";
}
echo "
function change_tabs(sheet)
{
	//alert('sheet_tab_' + sheet);
	for(i=0;i<" , count($data->sheets) , ";i++)
	{
		document.getElementById('sheet_tab_' + i).className = 'tab_base';
	}
	document.getElementById('table_loader_div').innerHTML=sheet_HTML[sheet];
	document.getElementById('sheet_tab_' + sheet).className = 'tab_loaded';

}
</script>";
echo "
<div id=\"table_complete\" align=\"center\">
<div id=\"tabellen_tabs\">
<table class='table_tabs' NAME='tab_table' align='left'>
<tr>";
for($sheet=0;$sheet<count($data->sheets);$sheet++)
{
	echo "<td class='tab_base' id='sheet_tab_$sheet' align='center'
		onmousedown=\"change_tabs($sheet);\">", $data->boundsheets[$sheet]['name'] , "</td>";
}

echo
"</tr>";
echo "</table></div>
<div id=table_loader_div></div>
<script type='text/javascript' language='JavaScript'>
change_tabs(0);
</script></div><div style=\"clear:both;\" ></div><p>&nbsp;</p>";
?>
Für das aussehen sind Stylesheets verantwortlich hier mal ein Beispiel:
Ein Beispiel Stylesheet:

Code: Alles auswählen

#table_loader_div{
    float:left;
    margin-left:50px;
}

.table_data{
	/*border-bottom-style:solid;
	border-bottom-width:0.5px;*/
}

.excel_headline {
    background-color:#EA8B2E;
    font-weight:bold;
    border-left:1px solid #000000;
    border-right: 1px solid #000000;
    border-bottom:1px solid #000000;
    border-top:0px;
}

.bg_grey {
    background-color:#ebecee;
}

.tab_base{
	background:#F4F4F4;
	font-weight:bold;
    color:#ea8b2e;
	cursor:pointer;
    border-left:1px;
    border-right:1px;
    border-top:1px;
    border-bottom:0px;
    border-style:solid;
    border-color:#000000;
    padding:0px 3px 0px 3px;
}

.table_sub_heading{
	background:#CCCCCC;
	font-weight:bold;
	border-style:solid;
	border-width:1;
}

.table_body{
	font-weight:normal;
	font-size:9pt;
	font-family:sans-serif;
    border-collapse:collapse;
    border-left:1px solid #000000;
    border-right:1px solid #000000;
    border-top:0px;
    border-bottom:1px solid #000000;
}

#tabellen_tabs{
    float:left;
    min-width:400px;
    margin-left:50px;
}

.table_tabs {
    font-weight:normal;
	font-size:9pt;
	font-family:sans-serif;
	border-color:#000000;
    border-collapse:collapse;
    border-left:1px;
    border-right:1px;
    border-top:1px;
    border-bottom:0px;
    border-style:solid;
    text-align:left;
    cursor:pointer;
}

.tab_base:hover{
    background:#EA8B2E;
	color:#ffffff;
	font-weight:bold;
	border-color:#000000;
    border-left:1px;
    border-right:1px;
    border-top:1px;
    border-bottom:0px;
    border-style:solid;
    cursor:pointer;
    padding:0px 3px 0px 3px;
}

.tab_loaded{
	background:#EA8B2E;
	color:#000000;
	font-weight:bold;
	border-color:#000000;
    border-left:1px;
    border-right:1px;
    border-top:1px;
    border-bottom:0px;
    border-style:solid;
    cursor:pointer;
    padding:0px 3px 0px 3px;
}

.table_body td {
  padding:3px 10px 3px 10px;
}

#table_complete{
    min-width:500px;
    *width:500px;
}
Über Lob, Kritik und konstruktive Kommentare freue ich mich natürlich immer !

Viel Spaß damit,

Wayfearer

Re: NEUES MODUL :: Excel Viewer

Verfasst: Do 27. Sep 2007, 12:58
von holger.librenz_4fb
Hi.

Nur ne kleine Anmerkung...
wayfearer hat geschrieben:

Code: Alles auswählen

?><?php
/***********************************************
* CONTENIDO MODUL - INPUT
*
* Modulname   :     Illustration
* Author(s)   :     Andreas Lindner, 4fb
* Copyright   :     Contenido - four for business, Andreas Lindner
* Created     :     12.08.2005
************************************************/
Ich gehe davon aus, das Du noch mal genauer schauen solltest. Andreas hat wohl nix mit Deinem Modul zu tun, auch das Modul heißt anders ;)
Diese Angaben sind dafür da, das nachvollziehbar ist von wem was wie gemacht wurde.

Sonst werd ich mir das Modul gern mal anschauen.

Gruß, Holger

Verfasst: Do 27. Sep 2007, 14:31
von wayfearer
Habe ich drin gelassen aus copyright gründen, den input habe ich eben nur umgeschrieben und net selbst geschrieben komplett, wie man so schön sagt "Warum das Rad neu erfinden ?". Aber ich habe es jetzt abgeändert.

Mfg,

wayfearer

Verfasst: Do 27. Sep 2007, 14:50
von holger.librenz_4fb
Ist auch kein großes Ding. War auch auf keinen Fall böse gemeint!
In solchen Fällen sollte aber trotzdem das eigene Modul, der eigene Name, das aktuelle Datum im Header stehen und der Verweis darauf, das es basierend auf einem bestehenden Modul entwickelt wurde. So wie Du es jetzt auch gemacht hast.

Das hat den Hintergrund, das nun jeder weiß das DU dieses Input Modul für Dein Modul nutzt. Ansonsten würden eben alle Anfragen, die es ggf. zu dem Modul gibt sehr schnell bei Andreas landen...

Also, sorry wenn es zu böse klang. Wollte nur darauf hinweisen.

Gruß, Holger

Verfasst: Fr 28. Sep 2007, 11:26
von wayfearer
Ne is schon okay kein ding !

Verfasst: Fr 28. Sep 2007, 11:39
von wosch
@wayfearer,
weißt du auswendig ob das mit allen Version von Excel bzw. deren Dateien .xls klappt?
Oder erst ab einer bestimmten Version?

Verfasst: Fr 28. Sep 2007, 12:22
von HerrB
excel so wie er ist in den includes ordner
Wäre schön, wenn Du das so ändern könntest, dass das Mandanten/includes-Verzeichnis verwendet wird.

Einbindung dann z.B. mit
cInclude("frontend", "includes/excel/reader.php");

Gruß
HerrB

Verfasst: Sa 29. Sep 2007, 23:16
von wayfearer
wosch hat geschrieben:@wayfearer,
weißt du auswendig ob das mit allen Version von Excel bzw. deren Dateien .xls klappt?
Oder erst ab einer bestimmten Version?
Also ich konnte es ohne probleme mit Exel97, 2000, 2003 Dateien nutzen.
Wenn man Excel 2007 verwendet muss man im Kompatibilitätsmodus zu 2003 speichern so dass die Endung *.xls ist, da die Klasse das neue erweiterte Excel Format nicht richtig interpretiert. Ansosten weiß ich nichts genaueres, müsste geteste werden.

Verfasst: Sa 29. Sep 2007, 23:27
von wayfearer
HerrB hat geschrieben:
excel so wie er ist in den includes ordner
Wäre schön, wenn Du das so ändern könntest, dass das Mandanten/includes-Verzeichnis verwendet wird.

Einbindung dann z.B. mit
cInclude("frontend", "includes/excel/reader.php");

Gruß
HerrB
Ist erledigt ! Habe den Quelltext oben aktualisiert, danke für den Hinweis !

Grüße an die Füße,

Marcel

Sehr schön - Danke dafür

Verfasst: Fr 19. Okt 2007, 08:31
von barneyy
Hi wayfearer, setzte gerade ehrenamtlich eine Vereins-Webseite auf. Dabei zeigte sich das Problem, dass ich 560 Zeile Excel einlesen musste - und nicht wusste wie ichs machen sollte. Hinzu kommt - ich bin absoluter PHP-Newbie.

Das Modul funzt auf Anhieb und ich wollte an dieser Stelle mal schnell DANKE sagen für das Modul. Einfache Handhabung, selbst wenn man neu bei Contenido ist.

Beste Grüße

Auch Daten für die Suchfunktion

Verfasst: Mo 22. Okt 2007, 10:50
von barneyy
Eine Sache ist mir beim Excel-Viewer noch aufgefallen. Die Daten der Excel-Files werden nicht vom Beispielmodul "Suche" erfasst. Kann man das noch irgendwie bewerkstelligen???

Contenido-Vers. 4.6.15.
Modul Sucheingabe und Suchausgabe
Beispielmodule des Beispielmandanten
PHP 5

Über kurze Hilfe wäre ich dankbar.

Re: Auch Daten für die Suchfunktion

Verfasst: Di 23. Okt 2007, 09:04
von wayfearer
barneyy hat geschrieben:Eine Sache ist mir beim Excel-Viewer noch aufgefallen. Die Daten der Excel-Files werden nicht vom Beispielmodul "Suche" erfasst. Kann man das noch irgendwie bewerkstelligen???

Contenido-Vers. 4.6.15.
Modul Sucheingabe und Suchausgabe
Beispielmodule des Beispielmandanten
PHP 5

Über kurze Hilfe wäre ich dankbar.
Das kann daran liegen, dass die Sachen die das Modul macht ja erst zur Laufzeit geparsed werden, also nicht in der Datenbank liegen, daher auch nicht durch die Suche zu erfassen sind . Die Problematik lässt sich auch nicht so einfach umgehen wenn man direkt mit den Excel Dateien arbeiten will.

Mfg,

Way

Stimmt, Klingt logisch!

Verfasst: Do 25. Okt 2007, 08:55
von barneyy
Hi Way,

das mit dem parsen habe ich natürlich nicht wirklich bedacht - erscheint aber logisch. Sorry wegen der dämlichen Frage, hätte ich selbst drauf kommen können.

Trotzdem super-Modul - auch weil's direkt funktioniert hat bei mir.
Thx :wink:

Re: Stimmt, Klingt logisch!

Verfasst: Do 25. Okt 2007, 09:10
von wayfearer
barneyy hat geschrieben:Sorry wegen der dämlichen Frage, hätte ich selbst drauf kommen können.
Merke dir: " Es gibt keine dämlichen Fragen, nur dämliche Antworten !"

Und danke für das Lob ;-)

Mfg,

Way

Re: NEUES MODUL :: Excel Viewer

Verfasst: Do 25. Okt 2007, 12:44
von funomat
Hi Way,

hast Du evtl. das Download-Verzeichnis geändert? Kann die Datei nicht runter laden!

Gruß,
funomat