WBCE CMS Forum

WBCE CMS – Way Better Content Editing.

Du bist nicht angemeldet.

#1 21.05.2017 18:56:43

berny
Mitglied

CSV2table

Ein einfaches Droplet, welches eine csv Datei in eine Tabelle gem html Format umrechnet.

Dabei ein script, welches die Zeilen bei mouse-over färbt und bei click ebenfalls.
Ebenso bei click einer anderen Zeile die vorher angeklickte wieder entfärbt.

Verbesserungen sind immer erwünscht, es stehen auch noch ein paar styles drinnen, die vermutlich weg gehören.
BTW diese Styles müssen noch verbessert werden, ist nicht so mein Ding ;-)

$content = "";
$content .= "<div style=\"overflow-x:auto; margin-right: 10px; \">
<style>
	table#ergebnis table:{border-collapse: collapse; border: 1px solid black;}
	table#ergebnis th:{writing-mode: vertical-rl; padding: 5px;}
    	table#ergebnis tr:nth-child(even) { background-color:#dddddd; }
    	table#ergebnis tr:hover td {background:#f88;}
    	table#ergebnis tr:active {background: #ccc;}
    	table#ergebnis td, th:{font-size: 8 px; border: 1px black;}
    	.high-light{background:lightgreen !important;}
    	.mainbox: {width=100%;}
</style>
<script type=\"text/javascript\">
$(document).ready(function(){
$('table tr').click(function(){
$('table tr').removeClass(\"high-light\"); 
$(this).addClass(\"high-light\");  
});
});
</script>
";
$ii = 0;
$content .= "<table id=\"ergebnis\" style=\"border: 1px solid black;\">\n";
$f = fopen($filename, "r");
//$f= str_replace("\"","",$f);
while (($line = fgetcsv($f)) !== false) {

        $row = $line[0];    // We need to get the actual row (it is the first element in a 1-element array)
        $cells = explode(";",$row);
        $content .="<tr style=\"nth-child(even): {background-color: #f2f2f20}; border: 1px solid black;\">";
        foreach ($cells as $cell) {
            if($ii <= 0 AND $header == true) {
            $content .= "<th style=\"writing-mode: sideways-lr; vertical-align: bottom; border: 1px solid black; padding-bottom: 5px;\">" . htmlspecialchars($cell) . "</th>";
            } else {
            $content .= "<td style=\"vertical-align: bottom; border: 1px solid black; padding: 5px;\">" . htmlspecialchars($cell) . "</td>";
            }
        }
        $content .= "</tr>\n";
        $ii++;
}
fclose($f);
$content .= "\n</table></div>";
return $content;

[[csv2table?filename=Dateiname.csv&header=true/false]]
filename: file to translate
header: true = first line is title of table

Viel Spass beim Testen ;-)

Offline

Liked by:

grindmobil, florian, thanks

#2 04.06.2017 14:20:03

berny
Mitglied

Re: CSV2table

Auf eines bin ich drauf gekommen, ist aber in erster Linie ein Excel-Export Problem:
Wenn in einer Zelle ein Zeilenumbruch besteht, wird der beim Zerlegen in einzelne Zeilen übernommen, sprich es endet und beginnt an dieser Stelle eine neue Zeile.

Wie könnte man das verhindern bzw konvertieren?

Offline

#3 05.06.2017 09:01:44

grindbatzn
Gast

Re: CSV2table

Das habe ich nie ganz kapiert, es hat wohl mit den verschiedenen Arten von Zeilenwechsel zu tun. Da gibt es \n und \r oder ascii 10, 11, 13.... auch in Kombinationen.
Was-Wo als Zeilenwechsel verwendet werden soll, kann man in Excel einstellen oder beim reinladen in php.

#4 08.06.2017 10:47:41

berny
Mitglied

Re: CSV2table

Update:

isset($headcorrect) ? $headcorrect=$headcorrect : $headcorrect=0;
$fix = array();
isset($headerfix) ? $fix = explode(',', $headerfix) : $fix="";


$content = "";
$content .= "<div style=\"overflow-x:auto; margin-right: 10px; \">
<style>
	table#ergebnis table:{border-collapse: collapse; border: 1px solid black;}
	#table#ergebnis th:{writing-mode: sideways-lr; -ms-writing-mode: tb-rl; padding: 5px;}
    	table#ergebnis tr:nth-child(even) { background-color:#dddddd; }
    	table#ergebnis tr:hover td {background:#f88;}
    	table#ergebnis tr:active {background: #ccc;}
    	table#ergebnis td, th:{font-size: 8 px; border: 1px black;}
    	.high-light{background:lightgreen !important;}
    	.mainbox: {width=100%;}
    	
th.rotate {
  /* Something you can count on */
  height: 140px;
  white-space: nowrap;
}

th.rotate > div {
  transform: 
    /* Magic Numbers */
    translate(1px, -10px)
    /* 45 is really 360 - 45 */
    rotate(270deg);
  width: 20px;
}
th.rotate > div > span {
  border-bottom: 1px solid #ccc;
  padding: 0px 0px;
}
</style>
<script type=\"text/javascript\">
$(document).ready(function(){
$('table tr').click(function(){
$('table tr').removeClass(\"high-light\"); 
$(this).addClass(\"high-light\");  
});
});
</script>
";
$ii = 0;
$content .= "<table id=\"ergebnis\" style=\"border: 1px solid black;\">\n";
$f = fopen($filename, "r");
//$f= str_replace("\"","",$f);
while (($line = fgetcsv($f)) !== false) {

        $row = $line[0];    // We need to get the actual row (it is the first element in a 1-element array)
        $cells = explode(";",$row);
        //$content .= print_r($row);
        $posi =strpos($row, ';;',0);
        //$content.= $posi.'<br />';
       if(strpos($row, ';;', 0) != 0) {
        $content .="<tr style=\"nth-child(even): {background-color: #f2f2f20}; border: 1px solid black;\">";
        $ifix = 0;
        foreach ($cells as $cell) {
            if($ii <= 0 AND $header == true) {
            $content .= "<th ";
            if(in_array($ifix, $fix)) {
            $content .= "";
            } else {
            $content .= "class=\"rotate\" ";
            }
            $content .= "style=\"vertical-align: bottom; border: 1px solid black; min-width:20px;\"><div>".htmlentities(utf8_encode($cell), ENT_SUBSTITUTE) . "</div></th>";
            } else {
            $content .= "<td style=\"vertical-align: bottom; border: 1px solid black; padding-bottom: 5px; min-width:20px;\">" . htmlentities(utf8_encode($cell), ENT_SUBSTITUTE) . "</td>";
            }
            $ifix++;
        }
        $content .= "</tr>\n";
        }
        $ii++;
}
fclose($f);
$content .= "\n</table></div>";
return $content;

    

Headcorrect war als Headerfunktion gedacht, sprich die erste Zeile ist header oder nicht, wird gedreht oder nicht usw...
Diese habe ich hier aber nicht verwendet, weil ich einen fixen header habe.

Folgende Funktionen sind hinzugekommen:
Headerfix: der Header der Tabelle wird um 90° gedreht. Will man diese Drehung in einer Zelle nicht, so muss man diese angeben
Start der Reihenfolge ist 0
zB headerfix=2,4,5,6
Damit werden diese Zellen nicht gedreht.


Update zum Zeilenumbruch:
Wenn man eine excel in eine csv verwandelt, kann man zwar im Excel den Zeilenbruch mit Optionsschalter deaktivieren, aber im Code der Datei steht er immer noch drinnen.
Abhilfe: STRG+H = Ersetzen Fenster wird aktiviert
Im Suchefeld Alt(gedrückt halten)+010 eingeben, im Ersetzenfeld ein Leerzeichen eingeben, dann werden die letzten Codes auch entfernt.
Das gleiche könnte auch mit 013 gehen, sollte 010 keinen Erfolg bringen.
Wie man das im php script rausfiltern könnte, ist mir momentan aus Zeitgründen nicht möglich zu durchdenken.
Ich vermute aber, dass die Zeilenumbrüche im csv mit "text text" gekennzeichnet sind, damit könnte es gehen....

Offline

#5 02.02.2019 21:56:02

rheo
Mitglied

Re: CSV2table

Wow, vielen Dank für die schnelle Antwort !

Über den Beitrag bin ich tatsächlich auch schon gestolpert.
Das heisst, es gibt kein fertiges Droplet, sondern ich soll ein eigenes erstellen mit dem geposteten Code !?

Wenn das mache, erhalte ich folgende Fehlermeldung vom Hosting Provider und der Code wird gelöscht :
Access denied by security policy
Your request is blocked by a security policy rule.
Please contact the support team and inform them of the time the error occurred, and anything you might have
done that may have caused the error.
More information about this error may be available in the server error log.
Please provide the following information to our support team:

Ich werde mich jedenfalls dann nächste Woche mal da melden ...
Oder weisst du, woran das liegen könnte ?!

Beitrag geändert von florian (04.02.2019 19:06:37)

Offline

#6 03.02.2019 06:51:14

florian
Administrator

Re: CSV2table

Zu der Fehlermeldung: Wahrscheinlich verbietet Dein Webhoster "fopen".
Wende Dich bitte an deren Support und frag, ob/wie die Funktion freigeschaltet werden kann.

znip_csv2table wäre ein sehr kleines Modul, das aber vom Entwickler noch nicht veröffentlicht worden ist. Auch das würde aber aufgrund der o.g. Restriktion bei Dir wahrscheinlich nicht funktionieren.


Code allein macht nicht glücklich. Jetzt spenden!

Online

#7 03.02.2019 18:31:42

rheo
Mitglied

Re: CSV2table

Vielen Dank ! 
Dann werde ich das mal versuchen ...

Offline

#8 04.02.2019 17:50:22

rheo
Mitglied

Re: CSV2table

So, ich hab's dank eurer Hilfe und dem Support des Hosters geschafft; die Fehlermeldung erscheint nicht mehr. wink

Allerdings funktioniert das Droplet nicht. neutral
Ich habe es so verstanden, dass ich einfach in der Zeile [[csv2table?filename=Dateiname.csv&header=true/false]] meine Datei (im gleichen Verzeichnis) angeben kann und dann wird im entsprechenden WYSIWYG meine Tabelle zum Sortieren und Filtern dargestellt, also z.B. [[csv2table?filename=Kontinente.csv&header=true]].
Stattdessen bleibt das Modul komplett leer !?

Was mache ich falsch ?

Offline

#9 04.02.2019 19:06:06

florian
Administrator

Re: CSV2table

Beiträge vom csv2table-znip-Thread abgeteilt.

Ich steck in dem Thema nicht so drin, aber CSV ist ja auch nicht gleich CSV... habe es auch nicht zum Laufen gebracht.
vielleicht kann berny da was zu sagen:

  • Trennzeichen: Komma, Semikolon, ...?

  • Codepage bzw. Charset: UTF-8 oder ANSI?

  • Zeilenumbruch: CR/LF oder CR?

  • Texterkennungszeichen: Anführungszeichen der keine?

  • Wo genau muss die CSV-Datei abgelegt werden?


Code allein macht nicht glücklich. Jetzt spenden!

Online

#10 05.02.2019 11:17:32

berny
Mitglied

Re: CSV2table

Dateinamen muss mit Verzeichnis angegeben werden.
" sind egal...
Trenner ist ; (siehe explode)

Schau mal in den Quellentext, ob überhaupt etwas zurück kommt, zumindest müssten table usw zurückkommen, sonst liegt der Fehler woanders.

ich schau mir das später mal an...

ev hast du einen Link zur csv Datei per pn für mich.

Beitrag geändert von berny (05.02.2019 11:21:39)

Offline

#11 05.02.2019 13:47:41

berny
Mitglied

Re: CSV2table

isset($headcorrect) ? $headcorrect=$headcorrect : $headcorrect=0;
$fix = array();
isset($headerfix) ? $fix = explode(',', $headerfix) : $fix="";


$content = "";
$content .= "<div style=\"overflow-x:auto; margin-right: 10px; \">
<style>
	table#ergebnis table:{border-collapse: collapse; border: 1px solid black;}
	#table#ergebnis th:{writing-mode: sideways-lr; -ms-writing-mode: tb-rl; padding: 5px;}
    	table#ergebnis tr:nth-child(even) { background-color:#dddddd; }
    	table#ergebnis tr:hover td {background:#f88;}
    	table#ergebnis tr:active {background: #ccc;}
    	table#ergebnis td, th:{font-size: 8 px; border: 1px black;}
    	.high-light{background:lightgreen !important;}
    	.mainbox: {width=100%;}
    	
th.rotate {
  /* Something you can count on */
  height: 140px;
  white-space: nowrap;
}

th.rotate > div {
  transform: 
    /* Magic Numbers */
    translate(1px, -10px)
    /* 45 is really 360 - 45 */
    rotate(270deg);
  width: 20px;
}
th.rotate > div > span {
  border-bottom: 1px solid #ccc;
  padding: 0px 0px;
}
</style>
<script type=\"text/javascript\">
$(document).ready(function(){
$('table tr').click(function(){
$('table tr').removeClass(\"high-light\"); 
$(this).addClass(\"high-light\");  
});
});
</script>
";
$ii = 0;
$content .= "<table id=\"ergebnis\" style=\"border: 1px solid black;\">\n";
    if(function_exists('fopen')) {
         $f = fopen($filename, "r");
        //$f= str_replace("\"","",$f);
             if(function_exists('fgetcsv')) {   
                while (($line = fgetcsv($f)) !== false) {

                        $row = $line[0];    // We need to get the actual row (it is the first element in a 1-element array)
                        $cells = explode(";",$row);
                        //$content .= print_r($row);
                        $posi =strpos($row, ';;',0);
                        //$content.= $posi.'<br />';
                       if(strpos($row, ';;', 0) != 0) {
                        $content .="<tr style=\"nth-child(even): {background-color: #f2f2f20}; border: 1px solid black;\">";
                        $ifix = 0;
                        foreach ($cells as $cell) {
                            if($ii <= 0 AND $header == true) {
                            $content .= "<th ";
                            if(in_array($ifix, $fix)) {
                            $content .= "";
                            } else {
                            $content .= "class=\"rotate\" ";
                            }
                            $content .= "style=\"vertical-align: bottom; border: 1px solid black; min-width:20px;\"><div>".htmlentities(utf8_encode($cell), ENT_SUBSTITUTE) . "</div></th>";
                            } else {
                            $content .= "<td style=\"vertical-align: bottom; border: 1px solid black; padding-bottom: 5px; min-width:20px;\">" . htmlentities(utf8_encode($cell), ENT_SUBSTITUTE) . "</td>";
                            }
                            $ifix++;
                        }
                        $content .= "</tr>\n";
                        }
                        $ii++;
                } 
            } else {
            $content .= "\n</table><br />Error: fgetcsv fehlt.";
            }
        fclose($f);
        
        
    } else{
       $content .= "\n</table><br />Error: fopen fehlt.";
    }
$content .= "\n</table></div>";
return $content;

kann das wer testen?
Es prüft lediglich das Vorhandensein der fopen und fgetcsv funktionen auf vorhandensein.
Ich vermute, dass eventuell dort Berechtigungsprobleme vorhanden sind.

Offline

#12 06.02.2019 09:20:17

berny
Mitglied

Re: CSV2table

man könnte noch ein file_exists für den Dateinamen als Prüfung einbauen, bevor der Rest abgearbeitet wird.
done

//:
//:
// usage: [[csv2table?filename=&headcorrect=&headerfix=]]
// parameters:

isset($headcorrect) ? $headcorrect=$headcorrect : $headcorrect=0;
$fix = array();
isset($headerfix) ? $fix = explode(',', $headerfix) : $fix="";


$content = "";
// start droplet with filecheck
if(file_exists($filename)) {

            $content .= "<div style=\"overflow-x:auto; margin-right: 10px; \">
            <style>
                    table#ergebnis table:{border-collapse: collapse; border: 1px solid black;}
                    #table#ergebnis th:{writing-mode: sideways-lr; -ms-writing-mode: tb-rl; padding: 5px;}
                    table#ergebnis tr:nth-child(even) { background-color:#dddddd; }
                    table#ergebnis tr:hover td {background:#f88;}
                    table#ergebnis tr:active {background: #ccc;}
                    table#ergebnis td, th:{font-size: 8 px; border: 1px black;}
                    .high-light{background:lightgreen !important;}
                    .mainbox: {width=100%;}

            th.rotate {
              /* Something you can count on */
              height: 140px;
              white-space: nowrap;
            }

            th.rotate > div {
              transform: 
                /* Magic Numbers */
                translate(1px, -10px)
                /* 45 is really 360 - 45 */
                rotate(270deg);
              width: 20px;
            }
            th.rotate > div > span {
              border-bottom: 1px solid #ccc;
              padding: 0px 0px;
            }
            </style>
            <script type=\"text/javascript\">
            $(document).ready(function(){
            $('table tr').click(function(){
            $('table tr').removeClass(\"high-light\"); 
            $(this).addClass(\"high-light\");  
            });
            });
            </script>
            ";
            $ii = 0;
            $content .= "<table id=\"ergebnis\" style=\"border: 1px solid black;\">\n";
                if(function_exists('fopen')) {
                     $f = fopen($filename, "r");
                    //$f= str_replace("\"","",$f);
                         if(function_exists('fgetcsv')) {   
                            while (($line = fgetcsv($f)) !== false) {

                                    $row = $line[0];    // We need to get the actual row (it is the first element in a 1-element array)
                                    $cells = explode(";",$row);
                                    //$content .= print_r($row);
                                    $posi =strpos($row, ';;',0);
                                    //$content.= $posi.'<br />';
                                   if(strpos($row, ';;', 0) != 0) {
                                    $content .="<tr style=\"nth-child(even): {background-color: #f2f2f20}; border: 1px solid black;\">";
                                    $ifix = 0;
                                    foreach ($cells as $cell) {
                                        if($ii <= 0 AND $header == true) {
                                        $content .= "<th ";
                                        if(in_array($ifix, $fix)) {
                                        $content .= "";
                                        } else {
                                        $content .= "class=\"rotate\" ";
                                        }
                                        $content .= "style=\"vertical-align: bottom; border: 1px solid black; min-width:20px;\"><div>".htmlentities(utf8_encode($cell), ENT_SUBSTITUTE) . "</div></th>";
                                        } else {
                                        $content .= "<td style=\"vertical-align: bottom; border: 1px solid black; padding-bottom: 5px; min-width:20px;\">" . htmlentities(utf8_encode($cell), ENT_SUBSTITUTE) . "</td>";
                                        }
                                        $ifix++;
                                    }
                                    $content .= "</tr>\n";
                                    }
                                    $ii++;
                            } 
                        } else {
                        $content .= "\n</table><br />Error: fgetcsv fehlt.";
                        }
                    fclose($f);


                } else{
                   $content .= "\n</table><br />Error: fopen fehlt.";
                }
            $content .= "\n</table></div>";
} else {
    // end filecheck
    $content .= "File ".$filename." does not exist.";
}         
            
return $content;

Bezüglich Droplet vs znip:
Das Droplet kann man überall einbauen, das znip ist eine eigene Section.
Daher ist es dem User überlassen, was er eher braucht.

Dieses Droplet habe ich für eine Seite gebraucht, wo es darum geht, Ergebnisse eines Turniers darzustellen.
Dazu kann vom Programm, welches die Ergebnisse und alles andere verwaltet, eine csv exportiert werden.
Diese CSV habe ich dann weiterverwendet.
Auch habe ich eine eigene Version für einen Beamer, der nur eine bestimmte Anzahl von Ergebnissen auf einer Seite listet und mit refresh die nächsten Ergebnisse nach einer bestimmten Zeit ladet.

Natürlich muss man das anpassen, wenn die csv anders gestaltet ist, sonst funktioniert das auch nicht.
Ein Excel-Universal-Import System zu bauen ist mir dafür zu umständlich, zumal es etliche Möglichkeiten gibt, wie Excel das letztlich ausgibt....

Beitrag geändert von berny (06.02.2019 10:23:23)

Offline

#13 06.02.2019 20:14:12

rheo
Mitglied

Re: CSV2table

Vielen Dank euch allen, dass ihr euch so schnell und ausführlich um meine Frage kümmert !  smile

Wenn ich dich, berny, richtig verstehe, kann ich also mit diesem Droplet nicht eine beiliebige CSV-Datei in eine Tabelle umwandeln !?
Meine Ausgangsfrage (hier : https://forum.wbce.org/viewtopic.php?id=2614) war ja, wie die Tabelle im Modul "csv2table" in der Template-Galerie unter > SubPages > Diverse Module > ChildPages2Tabs erzeugt wird.
Ich hab's mit verschiedenen CSV-Formatierungen und allen obigen Scripten als Droplet (z.B. [[csv2table?filename=Kontinente.csv&header=true]]) versucht, leider ohne Erfolg.

Inzwischen habe ich auch die älteren Threads gesehen, in denen das ja schon angedacht wurde :
- https://forum.wbce.org/viewtopic.php?id=1165
- https://forum.wbce.org/viewtopic.php?id=959

So ein Droplet wäre für diverse Zwecke halt schon sehr praktisch ...  roll
Da ich mich mit PHP nicht auskenne, hoffe ich weiterhin auf eure Hilfe.

Offline

#14 06.02.2019 20:38:55

florian
Administrator

Re: CSV2table

Ohne jetzt zu sehr dazwischen grätschen zu wollen: Das rudimentäre Modul (znip) gibt's jetzt zum Download.


Code allein macht nicht glücklich. Jetzt spenden!

Online

Liked by:

berny

Fußzeile des Forums

up