Formatter une cellule Excel depuis une page HTML générée

Une nouvelle problématique rencontrée ces jours derniers  : une application génère un fichier Excel (format .xls) contenant du code HTML (<table><tr><td>) que le logiciel pourra interpréter pour reconstituer un tableau classique.
Maintenant, on rempli le tableau avec les données manipulées... Mais voilà, une de ces données est sous la forme d’un nombre long, composé d’une petite dizaine de chiffres. En ouvrant le fichier Excel, je m’aperçois que mon nombre se retrouve affiché sous la forme suivante  :

9,0384E+11

Arf... Comment faire pour qu’il s’affiche dans son entier, sans décimale?... Des quotes? Voilà le résultat affiché :
"90384104738″

Presque ça… Mais en fait la solution n’est pas du tout dans cette direction!
Pour contrecarrer la fâcheuse habitude d’Excel de transformer les nombres, il faut utiliser... du CSS!! Oui, Oui c’est bien ça… Mais pas n’importe quel style, celui de Micro$oft!!

Alors là je pense que les puristes du CSS se seront déjà évanouis! Mais prenez le temps de regarder le petit bout de code ci-dessous, il n’en est pas moins très utile :

.xl28 {mso-style-parent:style0; mso-number-format:00000; text-align:left; white-space:normal;} 

Comme vous le voyez, on retrouve les tags classiques des styles générés par Word&co (mso-…). Examinons le tout de même : on comprend clairement qu’il permet de définir le format de la cellule en question (mso-number-format) comme numéraire sans décimale. Ceci aura pour conséquence d’autoriser l’affichage de notre nombre dans son entier! Vous n’avez plus qu’à appliquer cette classe à votre <td> et le tour est joué.

Vous trouverez d’autres exemples d’utilisation de ces styles CSS ici, ou bien sur ce forum, fournissant des exemples plus poussés (formatage de dates...). Eh oui, comme vous le constatez, le fameux adage se vérifie encore : "Si tu as un problème, regarde sur Internet, quelqu’un d’autre l’a forcément eu avant toi!" Encore faut-il savoir où chercher, je ne vous le fais pas dire… Mais c’est pour cela que ce blog existe après tout!!

Pour terminer, dans d’autres cas, si cette méthode ne marche pas, vous pouvez “forcer” Excel à afficher strictement le contenu désiré simplement en écrivant :

="mon-info"

Normalement, le logiciel gardera intacte la donnée.


Fichier(s) joint(s) :



Utiliser simplement FFMpeg

FFMpeg est un outil en ligne de commande permettant de convertir des fichiers audio et vidéo dans de multiples formats. Il est distribué sous la forme d’une librairie opensource. Qui dit ligne de commande, dit exécutable sur un serveur!! Cependant, son utilisation se révèle, du moins au premier abord, assez mystérieuse… Je vais donc vous donner quelques astuces pour le prendre en main rapidement.

Projets utilisant FFMpeg

Cet outil étant libre de droits, on le retrouve dans de nombreux logiciels, plus ou moins connus, comme DivXtoDVD, Mobile Media Converter ou encore PlayStation Portable Video Converter (vous pouvez consulter la liste exhaustive ici).

Mais l’outil qui va nous intéresser dans cet article est Pazera Free FLV to AVI Converter. En effet, il offre une interface graphique parfaite pour préparer ffmpeg à une utilisation sur serveur.

L’outil de Pazera

Voici comment se présente son interface :


Comme vous pouvez le constater, malgré un aspect un peu chargé au premier coup d’oeil, l’ensemble est plutôt clair et tout est visible sur un seul écran.

Si vous regardez la documentation de ffmpeg, vous verrez des exemples de fonctionnement comme celui-ci :

ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg

Pas simple donc, même avec la doc, de connaître tous les arguments à utiliser, pour passer de tel format à tel format, activer tel codec audio/video...

C’est à cela que va donc nous servir Pazera. Grâce à son interface simpliste, vous n’avez qu’à sélectionner toutes les options que vous désirez et exporter la configuration ainsi créée avec File -> Save Bat File. Vous obtiendrez un fichier ressemblant à celui-ci :

@echo off
set ffmpeg="C:\logiciels\Red5\webapps\WebCamMailer\tools\ffmpeg\ffmpeg.exe"
set VCodec=-vn
set VParams=
set ACodec=-acodec wmav2
set AParams=-ab 128k -ar 44100 -ac 2
set AdvParams=-s 320x240
set AddParams=
%ffmpeg% -y -i "C:\Users\PeF\Desktop\mozinor_test.flv" %VCodec% %VParams% %ACodec% %AParams% %AdvParams% %AddParams% "C:\Users\PeF\Desktop\mozinor_test.avi"
pause

Et voilà, rien de plus simple! Une ligne de commande toute prête à être exécutée sur un serveur! Qui plus est, le fichier généré est très lisible et permet de facilement ajuster les paramètres au besoin à la main.

Exemple d’utilisation dans une classe JAVA

Maintenant, le plus important, voilà de quoi exécuter votre ligne de commande sur un serveur Java :

//on crée un processBuilder pour pouvoir récupere les logs de ffmpeg
ProcessBuilder builder = new ProcessBuilder(FLV2AVI_COMMAND_ARGS);
//on redirige le ErrorStream car FFMpeg envoie par defaut ses logs dans le stderr et pas stdout
builder.redirectErrorStream(true);
Process process = builder.start();
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
 sb.append(line).append("\n");
}
 
int exit = process.waitFor(); // 0 = exit normally
response = "OK";

Le principe est de construire un Process qui lancera notre commande et attendra la fin de son exécution avant de continuer le script.

Petite astuce supplémentaire : pour récupérer les logs de ffmpeg, on doit rediriger le flux d’erreur (stderr) vers la sortie standard (stdout). En effet, par défaut, ffmpeg est compilé de telle façon que toutes ses sorties sont traitées comme erreur. Pour les plus courageux, pour éviter ce workaround, vous pouvez toujours vous remonter les manches, modifier le code de ffmpeg et le recompiler!


Fichier(s) joint(s) :



Réparer des fichiers FLV mal encodés

Nous avons vu dans l’article précédent comment enregistrer des fichiers FLV à partir du flux vidéo diffusé par la webcam.

J’y avais mentionné un bug connu de Flash Player qui provoquait l’écriture de fichiers FLV mal formés : en effet, la méthode NetStream.close() ne se terminant pas correctement, ils ne sont pas finalisés et ne comportent pas les en-têtes attendus. Des lecteurs vidéo classiques (Media Player Classic pour ne nommer que lui) sont donc incapables de les lire. Seuls les composants Flash de diffusion vidéo pourront les utiliser sans souci... assez restrictif tout de même!

Un moyen de remédier à ce problème est d’utiliser le petit utilitaire FLVMDI (FLV MetaData Injector). Son rôle est de scruter le fichier en question pour récupérer les informations manquantes et les réécrires au début du fichier. Tout simple! Mais terriblement efficace...

De plus, vu qu’il s’agit simplement d’un exécutable qui prend en entrée un fichier FLV, il peut facilement être placé sur un serveur et exécuté par une routine si tôt qu’un nouvel enregistrement est créé!!

En espérant vous avoir fait gagner quelques heures de "googling"!!


Fichier(s) joint(s) :



Premier client Red5 (avec Flex)

Pour faire suite à mon précédent article illustrant comment créer une simple application Red5, je vais dans cet article vous illustrer comment s’y connecter simplement avec un client léger.

Le protocole de communication utilisé dans ce genre d’application se nomme RTMP (Real Time Messaging Protocol). Il a initialement été développé par Adobe afin de permettre aux applications Flash de communiquer en temps réel avec un serveur, grâce à de simples "messages".

Mais trève de théorie, voici sans plus tarder les quelques lignes qui vous permettront de vous connecter à votre serveur :



 
  
 

Comme vous pouvez le voir dans la méthode "connect", l’URL de l’application est basée sur le protocole RTMP.

Si tout se déroule correctement, une fenêtre pop-up s’ouvrira indiquant "Starting app...". Vous pouvez dès lors faire appel à d’autres méthodes, la connexion au serveur étant assurée.

Dans le cas où tout ne se déroulerait pas aussi simplement, vous pouvez consulter la page de Red5 Blog décrivant les différents messages d’erreurs possibles et leur description/cause.

Note :

Il est important de savoir que la moindre erreur dans votre code JAVA (NullPointerException…) entrainera un retour du type NetConnection.Connect.Failed dans Flex, sans plus d’information. En effet, il semblerait que, pour le moment, Red5 ne puisse pas faire suivre les erreurs levées jusqu’au client... (du moins à ma connaissance!). Alors si vous ne voyez pas pourquoi votre code ne fonctionne pas, n’hésitez pas à le bourrer de try...catch pour faire apparaître les éventuelles erreurs dans la console Red5!


Fichier(s) joint(s) :

Flex/Red5 : Enregistrer le flux de la webcam

Une question toute simple m’a brulé les lèvres ces jours derniers : comment capturer le flux vidéo de ma webcam et en faire une video FLV?

Je me suis décidé à écrire cet article lorsque je me suis aperçu, au fil de mes recherches sur le net, que cette problématique paraît tellement simple que personne n’en a donné une réponse claire et explicite…

Voici donc les quelques lignes (et surtout LA ligne!) qui va vous permettre d’enregistrer votre webcam :



 
  
 
 
 
  
 

Comme vous pouvez le constater, rien de plus simple! Il suffit de faire appel à la méthode NetStream.publish avec le paramètre "record". Un fichier FLV sera créé, portant le nom indiqué.

Hope this help!

Note :

Un bug connu du Flash Player 9, lié (je pense) à ce bug rapporté chez Adobe, persistant sous Flash Player 10 et résidant dans la méthode NetStream.close, provoque l’écriture de fichiers FLV mal formés et parfois donc illisibles… Je décrirais dans un prochain article une solution pour “nettoyer” vos fichiers et les rendre utilisables.


Fichier(s) joint(s) :



A la découverte de Red5!

Avant d’entrer dans le vif du sujet, commençons par présenter rapidement Red5, pour ceux qui ne connaissent pas :
Il s’agit simplement d’un serveur de streaming, permettant de gérer la diffusion de flux diverses, tels des flux audio, vidéos ou même des connexions vers d’autres serveurs (bases de données...). Il est l’équivalent gratuit et open source de Flash Media Server.

Je vais dans cet article vous donner les premières étapes nécessaires à la mise en place de votre première application.

Répartition des fichiers

Les fichiers JAVA

Toutes les classes utilisées pour créer le côté serveur de l’application sont en JAVA et doivent se situer à l’emplacement suivant :

[dossier_installation_red5]/webapps/[nom-de-l'appli]/WEB-INF/classes/

Les fichiers de configuration

Trois fichiers sont requis pour faire fonctionner votre application, dans le répertoire :

[dossier_installation_red5]/webapps/[nom-de-l'appli]/WEB-INF/

web.xml :

Sert à décrire le nom et le répertoire racine de votre application. Il suffit simplement de remplacer "param-value" dans le tag suivant :

********

red5-web.xml :

Indique au serveur quelle sera la classe qui vous aurez créée comme base à votre application (voire le paragraphe suivant sur la classe ApplicationAdapter). Vous devrez indiquer le nom complet de votre classe (package compris) dans ce tag :

***********

red5-web.properties :

Fichier de propriétés déclarant quelles URL doivent pointer vers votre application :

webapp.contextPath=/demo
webapp.virtualHosts=*, localhost, localhost:8088, 127.0.0.1:8088

La classe : ApplicationAdapter

Toute application Red5 doit étendre la classe native ApplicationAdapter pour permettre de gérer les évènement de bases : dé/connexion, démarrage/arrêt de l’application… Voici un exemple basic de ce type de classe :

package applicationAdapter;
 
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IConnection;
import org.apache.log4j.Logger;
 
public class Application extends ApplicationAdapter {
 
private static Logger logger = Logger.getLogger(Application.class);
 
public void appStop() {
logger.info("App stop");
}
 
public void appStart() {
logger.info("App start");
}
 
public boolean appConnect(IConnection conn, Object[] params) {
try {
logger.info("appConnect");
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
 
public void appDisconnect(IConnection conn, Object[] params) {
logger.info("appDisconnect");
}
 
}

Votre application est maintenant prête à être démarrée. Elle sera accessible à l’addresse :

http://localhost:5080/[nom-de-l'appli]/

Dans le prochain article, je vous montrerai le code utilisé pour réaliser un simple client vers notre serveur Red5...


Fichier(s) joint(s) :