IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web en Java Discussion :

[Windows]Excel et J2EE


Sujet :

Développement Web en Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 15
    Points
    15
    Par défaut [Windows]Excel et J2EE
    Bonjour,

    voila je dispose d'un cote d'une interface J2EE sur ma base de données
    et de l'autre cote j'ai des macros excels pour traiter ces données.

    - Quelles solutions existent pour appeller des services J2EE à partir d'une macro excel?
    - Est-ce que quelqu'un a deja experimente ce genre de solution? Si oui quel est son avis (performance, complexite de mise en oeuvre, etc..)?

    Merci






    [Modéré par Didier]
    Ajout de tag dans le titre
    Lire les règles du forum : Règles du forum Java

  2. #2
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Si tu as 1 journée devant toi je suis sur le sujet là !! D'ici demain je pense que j'aurai validé les solutions techniques.

    C'est quoi EXACTEMENT tes besoins ? Parce que si c'est le truc béta d'aller chercher des données avec Excel sur ton appli et de les traiter tu ouvres excel, tu fais Données->Donnée Externes -> Nouvelle Requête sur le web. Tu règles tout ça et puis tu mets un refresh auto ou sous certaines conditions.

    Si tu dois faire une macro, tu enregistres (macro-> enregistrer...) comment tu update et tu l'insères dans ta macro.

    Du côté appli tu crées une page propre de données -pas en HTML, données brutes séparées par ; et à la ligne) à laquelle tu accèdes avec excel.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Voila exactement mon probleme: je travaille sur la partie refonte d'un systeme d'informartion et plus precisement je m'occupe de la partie BD et interface J2EE sur la BD.

    A ce jour en parallele, il existe des tas de "Developpements rapides" (DR) faits sous Excel Visual Basic se connectant sur cette base de données. Donc dans le cadre du futur SI il va bien falloir connecter ses DR aux EJB services que l'on mettra a disposition.

    Pourquoi des DR? parce que la maitrise d'ouvrage veut chaque fois qu'elle a un besoin avoir l'outil sou la main en 30s (enfin en 15j) sans passer par des phases de qualif et tout ce qui va autour. Moi je leur proposerai bien de faire leurs DR sous autre chose qu'excel (python par ex) mais je ne suis pas sure qu'ils soient a l'ecoute.. Bref .. et en plus ces DR ne sont ni plus ni moins des IHM (avec champ d'entree, bouton, check box, radio bouton) pour recuperer et modifier des donnees, les injecter en BD, elles font aussi des envois FTP ... bref

    Voila le contexte ... donc pour que la Maitrise d'ouvrage accepte la refonte d'un SI propre et moderne, il faut lui montrer qu'elle peut garder ses DRs et appeler les services J2EE.

    D'ou une mini etude de faisaibilite avec maquette a l'appui. Il faut donc que je regarde tout ce qui peut exister (j'ai vaguement vu JCOM chez BEA, Soap Toolkit chez Microsoft)
    mais avant de me lancer tete baissee dans une solution j'aimerais bien savoir ce qui se fait, et regarder les avantages / inconvenients des differentes methodes.

    Voila ... la je commence juste l'etude. J'ai en gros 10 jours pour regarder ce qui existe et ensuite je trancherai pour une solution et je ferai les specs de ma maquette.
    Donc je suis preneuse d'infos si tu as deja regarde des trucs sur le sujet. Demain ca me convient tres bien.

    Merci d'avance

  4. #4
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Si j'ai bien compris tu participes à la refonte du SI et tu veux leur prouver que leurs clients seront toujours compatibles avec le nouveau SI ?

    Le problème c'est que leur DR se connectent DIRECTEMENT sur la BDD et que toi tu passes à une archi n-tiers, donc il faut maintenant récupérer les données via l'application.

    Ca ne pose aucun problème en fait (youhouuuu), il suffit de modifier un petit peu les DR pour que le module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    - connexion BDD
    - requete
    - recuperation des donnees dans excel
    - travail sur les donnees (mise en forme, etc.)
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    - la macro excel est lancée
    - excel fait une requete HTTP à l'application
    - l'appli se connect à la BDD
    - l'appli requete
    - l'appli récupère les données
    - l'appli met les données en forme (genre fichier texte, séparateur ";") dans une page
    - l'appli renvoie cette page à excel (réponse à la requête HTTP en fait)
    - excel récupère cette page (dans un onglet data par exemple)
    - excel transforme et traite les données de data
    et voila !!

    Tu as quoi comme techno pour monter une maquette ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    tu as tout compris: le but du jeu c'est de leur montrer qu'ils ne vont pas devoir passer leur DR sur java tout de suite et qu'ils peuvent garder Excel .. moyennant quelques modifications du code. (certes pas forcement legeres mais c'est ca ou alors ils changent de techno mais ils semblent encore accroches a leurs macros Excel)

    Mais en fait ca va un peu plus loin car a ce jour ils faisaient n'importe quoi sur la BDD: l'an dernier par exemple ils ont auto-decide d'utiliser la colonne d'une table qui leur semblait vide et resultat ca a fait planter des applis. Donc la ca va demander un effort pour passer par les service EJB qui sont fournis et uniquement ceux la. Ca permet donc de cadrer leur actions (mine de rien!!!).

    C'est aussi un moyen de leur dire vous voyez une architecture sur serveur d'appli avec une interface logicielle java sur la BD ca fonctionne tres bien et c'est propre: aujourd'hui ils doivent connaitre les tables et les jointures a faire pour recuperer leurs infos, demain ils appelleront la classe java qui leur founira un objet complexe avec toutes les infos un point c'est tout.

    Cote J2EE, je suis sur le serveur d'appli BEA (WebLogic) sous Windows 2000
    Apres cote Excel je ne sais pas quelle est la forme de l'echange HTTP, XML??? la je ne connais pas assez . J'ai vu avec JCOM (chez BEA) des exemples de code ou dans la macro on invoque directement la methode sur les objets WebLogic et on recupere des 'home'.
    Je viens de voir il y a un produit payant J-integra avec version d'evaluation. mais je ne sais pas ce que ca vaut.

  6. #6
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Bon c'est pas compliqué ce que tu as à faire mais il faut que tout fonctionne (c'est là le problème). En plus tu es sous weblogic qui est ... bien... mais un peu lourd pour faire une chtite maquette de validation de concept.

    Je fais 2/3 tests sur une page et je poste mes résultats qui devraient être assez faciles à utiliser.

  7. #7
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Quelle techno en BDD au fait ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Oracle 9i

  9. #9
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Nyark !
    C'est cool je suis sous 9i aussi, ça facilite les choses.

    Tiens, voila mes premiers tests : j'essaye de mettre en place un système qui ressemble au vieux puis de montrer comment se greffer dessus. Essaye de les reproduire chez toi et normalement vers 18h c'est finit :

    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
     
    -- Creation de la table TEST :
     
    DROP TABLE TEST CASCADE CONSTRAINTS ; 
     
    CREATE TABLE TEST ( 
      ID       NUMBER        NOT NULL, 
      NUMBER1  NUMBER, 
      NUMBER2  NUMBER, 
      NUMBER3  NUMBER, 
      STRING1  VARCHAR2 (256), 
      STRING2  VARCHAR2 (256), 
      STRING3  VARCHAR2 (256), 
      STRING4  VARCHAR2 (2000))
       TABLESPACE CWEB_DAT
       PCTFREE 10
       INITRANS 1
       MAXTRANS 255
      STORAGE ( 
       INITIAL 65536
       MINEXTENTS 1
       MAXEXTENTS 2147483645
     )
       NOCACHE; 
     
    -- Creation de la sequence SEQ_TEST :
     
    DROP SEQUENCE MA_BASE.SEQ_TEST;
    CREATE SEQUENCE MA_BASE.SEQ_TEST START WITH 0 INCREMENT BY 1 MINVALUE 0 MAXVALUE 999999 NOCACHE  NOCYCLE  NOORDER ;
     
     
    -- Remplissage de TEST :
     
    declare
    i number;
    begin
    select 0 into i from dual;
    loop
    insert into test (id, NUMBER1, STRING1) VALUES (seq_test.nextval, i, 'Valeur '||i); 
    select (i+1) into i from dual;
    exit when i = 100;
    end loop;
    end;
     
     
     
    ANCIEN SYSTEME :
     
    Si Ms Query (sinon envoie moi leur macro d'accés à la BDD que je vois comment ils font)
    - Source de données vers TEST
    - Feuille excel : Données -> Données Externes -> Créer une requête -> Sélectionner la Source de données (MS QUERY s'ouvre) -> OK -> identifiant -> mot de passe
    - Dans MS QUERY : choix de la table TEST -> ajouter puis fermer -> Choix de NUMBER1 et STRING1 comme champs (double clic) -> Renvoyer les données (l'espèce d'icône en forme de porte) -> ok pour l'insertion dans la page.
    - Traitements éventuels...
    Voila donc tu me confirmes s'ils sont bien sous MS Query pour récupérer les données et sinon tu postes (forum ou mp) leur macro pour que je vois comment ils attaquent une base en VBA pur.

    J'écris le code du Servlet qui attaque la base et renvoie les données en html et je le poste. Ensuite j'écris la macro excel de récupération des données et c'est bon.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Dans le doute je t'envoie leur mode de connexion et de requetage a la bd
    .. et je cree ce qu'il faut sur la BD

    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
     
    '----------------------------------------------
    '!i Function F_ConnectBDD
    '!c Connexion à une base de données
    '----------------------------------------------
    Public Function F_ConnectBDD(ByVal NatureConnexion As String, Cnn As ADODB.Connection, Optional Message) As String
        Static ChaineC As String
        Dim CC As String, AffMessage As Boolean
        ' ChaineC mémorise la dernière chaîne de connexion utilisée
        Err.Clear
        CC = F_ChaineConnect(NatureConnexion, "NON", "BDD")
        If Mid(CC, 1, 7) = "Erreur:" Then
            F_InvaliderConnect NatureConnexion  ' efface le mot de passe mémorisé
            GoTo F_ConnectBDD_Fin
        End If
        ' si la chaîne de connexion a changée, il faut refaire la connexion
        ' le set.. nothing force cette action
        If CC <> ChaineC Then Set Cnn = Nothing
        On Error GoTo F_ConnectBDD_Err2
        If Cnn Is Nothing Then
          Set Cnn = New ADODB.Connection
        End If
        On Error GoTo F_ConnectBDD_Err2
        If Cnn.State <> adStateOpen Then Cnn.Open CC
     
        ChaineC = CC
        CC = "OK"
    F_ConnectBDD_Fin:
        If Not IsMissing(Message) And CC <> "OK" Then
          If CC <> "Erreur:Quitter" Then AfficherMessageBox CC
         End If
        F_ConnectBDD = CC
        Exit Function
    F_ConnectBDD_Err1:
        On Error GoTo F_ConnectBDD_Err2
        Set Cnn = New ADODB.Connection
        Resume
    F_ConnectBDD_Err2:
        CC = "Erreur:Rejet à la connexion sur la base !" & vbCrLf & Err.Number & vbCrLf & Err.Description
        On Error GoTo 0
        F_InvaliderConnect NatureConnexion
        Resume F_ConnectBDD_Fin
    End Function
    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
     
    '----------------------------------------------
    '!i Function F_ExecuteSelect
    '!c Exécution d'une commande de type Select
    '!c Gère la trace et en mode non exploit ouvre le notepad en cas d'erreur SQL
    '----------------------------------------------
    Public Function F_ExecuteSelect(ByVal TxtSelect As String, Cnn As ADODB.Connection, rst As ADODB.Recordset) As String
        Dim CC As String, Duree As Double
        Set rst = New ADODB.Recordset
        On Error GoTo F_ExecuteSelect_Err
        Duree = Timer
        rst.Open TxtSelect, Cnn, , , adCmdText 'Exécution
        Duree = (Timer - Duree)
        F_ExecuteSelect = "OK"
        If Len(TP_TraceSQL) > 0 Then TraceSQL TxtSelect, Duree
    F_ExecuteSelect_Suite:
        Exit Function
    F_ExecuteSelect_Err:
        F_ExecuteSelect = "Erreur:Lecture impossible !" & Chr(10) & TraiteErreurExe(TxtSelect)
        Resume F_ExecuteSelect_Suite
    End Function
    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
     
    '----------------------------------------------
    '!i Function F_ExecuteSQL
    '!c Exécution d'une commande PL/SQL
    '!c Gère la trace et en mode non exploit ouvre le notepad en cas d'erreur SQL
    '!c ExecAsynchrone permet de lancer en asynchrone (la min est rendu tout de suite
    '! c pour tester la fin de la commande  , il suffiot de tester cnn.State = 5 qui indique qu'une
    '!c exécution asynchrone est en cours (avec doevnts pour éviter de bloquer le système!!)
    '----------------------------------------------
    Public Function F_ExecuteSQL(ByVal TxtSql As String, Cnn As ADODB.Connection, Optional ByVal ExecAsynchrone As Boolean = False) As String
        Dim Duree As Double
        Dim OptionExecute As Integer
        Dim Tampon As Long
        On Error GoTo F_ExecuteSQL_Err
        Duree = Timer
        '!c On ne peut lancer qu'un commande asynchrone à la fois par connexion !!!
        If ExecAsynchrone Then
            If Cnn.State = 5 Then 'nous traitons déjà une demande en asynchrone ==>on repasse en Synchrone
                OptionExecute = 0
            Else
                OptionExecute = adAsyncExecute
            End If
        Else
            OptionExecute = 0
        End If
        Cnn.Execute TxtSql, False, adExecuteNoRecords + OptionExecute
        If OptionExecute = adAsyncExecute Then
           'si asynchrone, cette affectation permet de générer une erreur si pb SQL
           Tampon = Cnn.State
        End If
        Duree = (Timer - Duree)
        F_ExecuteSQL = "OK"
        If Len(TP_TraceSQL) > 0 Then TraceSQL TxtSql, Duree
    F_ExecuteSQL_Suite:
        Exit Function
    F_ExecuteSQL_Err:
        If OptionExecute = adAsyncExecute Then
           On Error Resume Next
           'on termine la commande asynchrone
           Cnn.Cancel
        End If
     
        F_ExecuteSQL = "Erreur:Exécution impossible !" & Chr(10) & TraiteErreurExe(TxtSql)
        Resume F_ExecuteSQL_Suite
    End Function

  11. #11
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Bon euh ok ...
    Donc on laisse tomber la comparaison Ancien et Nouveau système. On teste avec le nouveau système (servlet+requête web via excel) sur la table TEST et quand ça marche tu feras les modifs de requêtes pour que ça attaque une table qui veuille dire quelquechose à tes utilisateurs.

    Ca va ptet être plus long que prévu vu qu'on VIENT de perdre les licenses weblogic. lol

  12. #12
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Voila le servlet. Tu as besoin du jar de j2ee et du jar driver Oracle.
    Ca marche en standalone (pour tester). Tu le lances en tant que main et ça roule.

    Pour configurer le serveur tu mets ça dans web.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <servlet> 
    	<servlet-name>Test</servlet-name> 
    	<servlet-class>TestGetData</servlet-class> 
      </servlet> 
     
     <servlet-mapping> 
    	<servlet-name>Test</servlet-name> 
    	<url-pattern>/test</url-pattern>
      </servlet-mapping>
    et tu compiles ce fichier en le mettant dans WEB-INF/classes (host, port, BASE, USER, PASS en dur pour l'instant, modifiera plus tard) :
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    import java.io.FileInputStream;
    import java.io.OutputStream;
    import java.io.IOException;
    import java.io.File;
    import java.io.PrintWriter;
     
    import java.sql.Connection;
    import java.sql.Statement;
    import java.sql.ResultSet;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.PreparedStatement;
    import java.sql.CallableStatement;
    import java.sql.SQLWarning;
    import java.util.Map;
    import java.sql.DatabaseMetaData ;
     
    import java.util.ArrayList;
    import java.util.Iterator;
     
    public class TestGetData extends HttpServlet {
     
    	private static Connection conn;
    	private static String DRIVER_NAME = "oracle.jdbc.driver.OracleDriver";
    	private static String DSN = "jdbc:oracle:thin:@host:port:BASE";
    	private static String USER = "USER";
    	private static String PASSWORD = "PASSWORD";
    	private static String QUERY = "select NUMBER1, STRING1 from test";
     
       public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
    		ArrayList results;
    		String driver_name = DRIVER_NAME;
    		String dsn = DSN;
    		String user = USER;
    		String password = PASSWORD;
    		String query = QUERY;
     
    	PrintWriter out = response.getWriter();
          // Use "out" to send content to browser
     
    	try
    		{
    			Class.forName(driver_name).newInstance();
    			conn = DriverManager.getConnection(dsn, user, password);
    		}
    		catch(Exception e)
    		{
    			e.printStackTrace();
    		}
     
    		if (conn!=null)
    		{
    			results = getTest(query);
     
    			if(results!=null)
    			{
    				System.out.println("" + results.size() + " results where found."); 
    				Iterator it = results.iterator();
    				while(it.hasNext())
    				{
    					String[] col = (String[]) it.next();
    					if(col !=null && col.length>0)
    					{
    						for(int i = 0; i<col.length; i++)
    						{
    							if(i>0) out.print(";");
    							out.print(col[i]);
    						}
    						out.println(";");
    					}
    				}
    			}
    			else
    			{
    				System.out.println("Error during the request");
    			}
    		}
     
        	out.close();
    }
     
      public void doPost(HttpServletRequest request,
                          HttpServletResponse response)
            throws ServletException, IOException {
           }
     
    private static ArrayList getTest(String query)
    	{ 
    		Statement stmt; 	// SQL statement object
    		ResultSet rs; 		// SQL query results 
    		boolean more; 		// "more rows found" switch 
    		String  urlStr;		// Temporary storage results
     
    		ArrayList results = new ArrayList(); 
     
    		try 
    		{ 
    			stmt = conn.createStatement();
    			rs = stmt.executeQuery(query);
    			// Check to see if any rows were read
    			int colCount = rs.getMetaData().getColumnCount();
    			String[] row;
    			more = rs.next();
    			if (!more) 
    			{
    				//System.out.println("No rows found."); 
    			}			
    			// Loop through the rows retrieved from the query
     
    			String[] rowNames = new String[colCount];
    			for(int i=1;i<=colCount;i++)
    				{
    					rowNames[i-1] = rs.getMetaData().getColumnName(i);
    				}
    			results.add(rowNames);
     
    			while (more) 
    			{
    				row = new String[colCount];
    				for(int i=1;i<=colCount;i++)
    				{
    					row[i-1] = rs.getString(i);
    				}
    				results.add(row);
    				more = rs.next(); 
    			}
    			rs.close();
    			stmt.close();
    			conn.close();
    		}
    		catch (SQLException e) 
    		{
    			System.err.println(e);
    		}
     
    	return results;
    	}
     
     
    	public static void main(String[] args)
    	{
    		ArrayList results;
    		String driver_name = DRIVER_NAME;
    		String dsn = DSN;
    		String user = USER;
    		String password = PASSWORD;
    		String query = QUERY;
     
    	java.io.PrintStream out = System.out;
     
    	try
    		{
    			Class.forName(driver_name).newInstance();
    			conn = DriverManager.getConnection(dsn, user, password);
    		}
    		catch(Exception e)
    		{
    			e.printStackTrace();
    		}
     
    		if (conn!=null)
    		{
    			results = getTest(query);
     
    			if(results!=null)
    			{
    				System.out.println("" + results.size() + " results where found."); 
    				Iterator it = results.iterator();
    				while(it.hasNext())
    				{
    					String[] col = (String[]) it.next();
    					if(col !=null && col.length>0)
    					{
    						for(int i = 0; i<col.length; i++)
    						{
    							if(i>0) out.print(";");
    							out.print(col[i]);
    						}
    						out.println(";");
    					}
    				}
    			}
    			else
    			{
    				System.out.println("Error during the request");
    			}
    		}
     
        	out.close();
     
    	}
    }
    Tu redémarres le serveur.
    Normalement maintenant si tu fais http://tonhost:tonport/tonappli/test tu dois voir les données s'afficher.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Ok ca y est:

    j'ai compile l'appli qui peut etre lancee grace a son main comme une appli java et j'ai egalement fait le .war deploye sur BEA.
    j'ai egalement fait la manip pour acceder drirectement a la Bd via Excel

    Maintenant j'ai 2 questions:
    - comment je fais pour avoir le resultat sous Excel ... cad comment s'articule la communication entre la HTTPServlet et Excel?
    - si, au lieu d'avoir une HttpServlet, j'ai des EJB Sessions comment je fais egalement?

    Merci d'avance

  14. #14
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Tu crées un document Excel (ou tu modifies un existant, enfin on s'en fout) et tu écris cette macro là :
    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
    Selection.QueryTable.Refresh BackgroundQuery:=False
        Range("A1").Select
        Sheets("Feuil1").Select
        With ActiveSheet.QueryTables.Add(Connection:= _
            "FINDER;C:\projet\MonUrl.iqy" _
            , Destination:=Range("A1"))
            .FieldNames = False
            .RefreshStyle = xlInsertDeleteCells
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .RefreshOnFileOpen = False
            .HasAutoFormat = True
            .BackgroundQuery = True
            .TablesOnlyFromHTML = True
            .Refresh BackgroundQuery:=False
            .SavePassword = False
            .SaveData = True
        End With
    et ton fichier iqy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WEB        
    1
    http://www.monsite.fr/monappli/maservlet
    Et ensuite tu passes une moulinette qui te redistribue tes données comme tu le veux (en fait il faut avoir un feuillet de stockage des données brutes)

  15. #15
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    il y a aussi la solution manuelle : Données-> Données externes -> Requête sur le web (selon les versions en fait...) et ensuite tu peux faire des réglages de fréquence et tout.

    Pour appeler un refresh des données depuis une macro et ensuite appliquer des transformations voici un code perso qui recherche des valeurs dans la page téléchargée et les place dans les cases qui vont bien :
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    Sub Update()
     
    Dim diese As Range
        Dim users As Range
        Dim messages As Range
     
        Dim dieseE As Range
        Dim usersE As Range
        Dim messagesE As Range
     
        Dim dieseR As Range
        Dim usersR As Range
        Dim messagesR As Range
     
        Dim dieseC As Range
        Dim usersC As Range
        Dim messagesC As Range
     
        Dim count As Integer
     
        Worksheets("Donnees2").Select
     
        Selection.QueryTable.Refresh BackgroundQuery:=False
     
        Worksheets("Donnees").Select
     
        Selection.QueryTable.Refresh BackgroundQuery:=False
     
        Set diese = Cells.Find(What:="#", After:=Range(Cells(1, 1), Cells(1, 1)), LookIn:=xlFormulas, LookAt _
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            True)
     
        Set users = Cells.Find(What:="Nom d'utilisateur", After:=Range(Cells(1, 1), Cells(1, 1)), LookIn:=xlFormulas, LookAt _
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            True)
     
        Set messages = Cells.Find(What:="Messages", After:=Range(Cells(1, 1), Cells(1, 1)), LookIn:=xlFormulas, LookAt _
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            True)
     
        If (diese.Row = users.Row And users.Row = messages.Row) Then
     
            Set usersE = users.End(xlDown)
           ' Set usersR = Range(Cells(users.Row, users.Column), Cells(usersR.Row, usersR.Column))
     
            Set messagesE = messages.End(xlDown)
           ' Set messagesR = Range(Cells(messages.Row, messages.Column), Cells(messagesR.Row, messagesR.Column))
     
            If (messagesE.Row = usersE.Row And messagesE.Row > messages.Row And usersE.Row > users.Row) Then
     
                count = messagesE.Row - messages.Row
     
                Set dieseE = Range(Cells(diese.Row + count, diese.Column), Cells(diese.Row + count, diese.Column))
     
                Set dieseR = Range(Cells(diese.Row, diese.Column), Cells(dieseE.Row, dieseE.Column))
     
                Set usersR = Range(Cells(users.Row, users.Column), Cells(usersE.Row, usersE.Column))
     
                Set messagesR = Range(Cells(messages.Row, messages.Column), Cells(messagesE.Row, messagesE.Column))
     
                dieseR.Copy
                Sheets("Membres").Select
                Range("A1").Select
                ActiveSheet.Paste
     
                Sheets("Donnees").Select
                usersR.Copy
                Sheets("Membres").Select
                Range("B1").Select
                ActiveSheet.Paste
     
                Sheets("Donnees").Select
                messagesR.Copy
                Sheets("Membres").Select
                Range("C1").Select
                ActiveSheet.Paste
     
                Columns("A:C").Select
                 Application.CutCopyMode = False
                Selection.Sort Key1:=Range("C2"), Order1:=xlDescending, Key2:=Range("B2") _
                  , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
                  False, Orientation:=xlTopToBottom
                 Selection.AutoFilter
                 Selection.AutoFilter
                Selection.EntireColumn.AutoFit
                 Selection.Borders(xlDiagonalDown).LineStyle = xlNone
        Selection.Borders(xlDiagonalUp).LineStyle = xlNone
        With Selection.Borders(xlEdgeLeft)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeTop)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeRight)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlInsideVertical)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlInsideHorizontal)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
     
            Else
     
                Worksheets("Membres").Range("A1").Value = "Erreur lors de la mise à jour des donnees"
     
            End If
        Else
     
            Worksheets("Membres").Range("A1").Value = "Erreur lors de la mise à jour des donnees"
     
        End If
     
    End Sub

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Avec la solution 1, la macro plante sur le premier ordre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Selection.QueryTable.Refresh BackgroundQuery:=False
    y-a quelque chose a faire avant de lancer la macro?

    et sinon pour la solution 2, il y a 3 feuilles: Donnees, Donnees2 et Membres:
    Donnees, ca correspond aux donnees brutes importees du Web?
    Donnees2, ca correspond aux donnees mises en forme?
    Membres?

  17. #17
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Alors pour les macros récalcitrantes voila la solution :
    tu fait outils->macro->enregistrer une nouvelle macro
    puis tu fais
    données->données externes->Requêtes sur le web et tu choisis ton fichier .iqy et tu lances la requête
    Puis tu vas voir dans outils-> Visual Basic Editor comment il a fait et tu réutilises son code.

    Pour la solution 2 c'est un peu la même en fait sauf que tu as un exemple de moulinette. Les feuilles données et données2 sont des feuilles pour les données brutes. La feuille Membres servait à récupérer les données retraitées et une autre feuille nommée stats faisait des calculs sur les données de Membres. Donc en gros :
    - je récupère les données de Données
    - je récupère les données de Données2
    - je copie les données retraitées depuis Données et Données2 dans Membres
    - les cellules de stats se mettent à jour avec les nouvelles valeurs de Membres

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Ok encore merci beaucoup !!!!
    j'ai teste la solution 1. Ca marche c'est super.
    Pour ce qui est de la solution 2 je ne vais pas checrher a l'adapter a mon cas. Si j'ai bien compris, c'est juste une exemple de traitement des donnees importees.

    Donc en gros la solution experimentee est
    - on developpe une HttpServlet
    - on accede aux infos soit via "nouvelle requete sur le Web" soit via "execution d'une requete .iqy deja enregistree"

    J'ai un peu creuse la solution proposee par webLogic et je vais essayer de la compiler pour la tester. Si tu as WebLogic, la doc est sous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C:\bea\weblogic81\samples\server\examples\src\examples\jcom\zeroclient
    en gros il a des EJB BMP et cote Excel, on y accede de la maniere suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        'Access WebLogic Server.  Set here to localhost, port 7001.
        Set objTemp = GetObject("objref:reference_a_recuperer")
     
        'Bind the EJB AccountHome object via JNDI
        Set mobjHome = objTemp.get("examplesServer:jndi:ejb20-beanManaged-AccountHome")
    puis on travaille ensuite normalement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        'Try to find the account
        Set FindOrCreateAccount = mobjHome.findByPrimaryKey(strName)
    Sinon tu connais ce que vaut J-Integra: on arrive souvent sur ce produit
    quand on cherche sur google?

  19. #19
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Jamais trop entendu parler de J-Integra, non.

    Pour la solution Weblogic, si tu y arrives je suis preneur ça m'a l'air pas mal du tout comme truc.

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Ok j'essaye de faire ca demain (sauf si je galere ...)

    Sinon j'ai egalement vu sur le Web un document sur intitule
    "can enterprise bean data be imported directly into a starOffice spredsheet"
    et ils disent en gros que la solution recommendee est d'utiliser un servlet pour exposer les services du bean comme des sources de donnees XML.

    Est-ce que ca veut-dire que dans la servlet on met en forme "a la main" tout comme si c'etait un vrai fichier XML
    ... en d'autres termes au lieu d'avoir comme dans ton exemple des lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "NUMBER1; STRING1"
    on ecrit plutot "a la main"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <NUMBER1> le_nombre </NUMBER1>
    <STRING1> la_chaine </STRING1>
    ou existe-t-il des solutions automatiques (librairies) pour generer
    ce code XML?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Ouvrir un fichier CSV/Excel en J2EE/Servlet
    Par molarisapa dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 30/03/2011, 16h59
  2. [VBS WMI] HotFix Windows + Excel
    Par nonotoubo dans le forum VBScript
    Réponses: 2
    Dernier message: 29/07/2006, 19h42
  3. Réponses: 1
    Dernier message: 23/06/2006, 20h17
  4. Réponses: 69
    Dernier message: 15/06/2006, 11h42
  5. [J2EE] quelle API pour Excel choisir ?
    Par vallica dans le forum Documents
    Réponses: 4
    Dernier message: 19/04/2006, 14h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo