Welcome to the LimeSurvey Community Forum

Ask the community, share ideas, and connect with other LimeSurvey users!

RemoteCOntrol 2 - export_responses - XLS invalid

  • tomy137
  • tomy137's Avatar Topic Author
  • Offline
  • New Member
  • New Member
More
7 years 8 months ago #138314 by tomy137
Bonjour,

En utilisant la base de mon dernier script (Egalement sur ce forum)

J'essais maintenant d'exporter au format XLS pour que cela soit lisible facilement par les utilisateurs d'Excel.

Via l'interface web tout fonctionne parfaitement :


Mais via le script suivant :
Code:
var listResponsesXLS = function (SURVEYID, SURVEYNAME){
 
  options.body = JSON.stringify({method:'export_responses',params:{sSessionKey:SESSIONKEY,iSurveyID:SURVEYID, sDocumentType:'xls', sLanguageCode:'fr', sCompletionStatus:'complete', sHeadingType:'full', sResponseType:'long' },id:1});
  request(options, function(error, response, body){
    if(!error && response.statusCode==200){
      body = JSON.parse(body);
      b64 = body.result;
      bin = atob(b64);
 
      fs.writeFileSync(DATEOFTHEDAY+"_"+SURVEYNAME+".xls", bin, "utf8");
    }
    else console.log("ERROR -->"+body.result);
  });
}

Les réglages se font ici : ,params:{sSessionKey:SESSIONKEY,iSurveyID:SURVEYID, sDocumentType:'xls', sLanguageCode:'fr', sCompletionStatus:'complete', sHeadingType:'full', sResponseType:'long' }

Le script fonctionne dans le sens où le fichier est bien créé, mais par contre côté Excel c'est illisible. Il y a des problèmes de Codage mais ce n'est pas le pire :


Est-ce que quelqu'un a déjà effectué un export vers Excel directement ? Sans passer par le CSV comme sur l'interface Web.

Merci d'avance pour vos retours / remarques / idées !

Bonne journée,
The topic has been locked.
  • DenisChenu
  • DenisChenu's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
7 years 8 months ago #138316 by DenisChenu
Replied by DenisChenu on topic RemoteCOntrol 2 - export_responses - XLS invalid
Salut,

Avec le même code : ca passe pour le CSV ?

Ici : c'est marrant : il semble que excel veuille l'ouvrir en mode texte et non en mode "excel". Tu as essayé en enregitrant le fichier ? A mon avis c'est l'entête quand tu le télécharge qui n'est pas la bonne

Avec php, on fait un truc du genre:
Code:
header("Content-Type:   application/vnd.ms-excel; charset=utf-8");
header("Content-Disposition: attachment; filename=abc.xls");  //File name extension was wrong
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);

Assistance on LimeSurvey forum and LimeSurvey core development are on my free time.
I'm not a LimeSurvey GmbH member, professional service on demand , plugin development .
I don't answer to private message.
The topic has been locked.
  • tomy137
  • tomy137's Avatar Topic Author
  • Offline
  • New Member
  • New Member
More
7 years 8 months ago #138321 by tomy137
Bonjour !

Merci pour ta réponse. Oui en CSV ça fonctionne très bien , je change juste le parametre de xls vers csv ainsi que l'extension du fichier et :


Il y a peut-être effectivement un problème d'entête. Mais je n'ai pas l'impression d'avoir une grande marge de manœuvre sur les API.. =/
The topic has been locked.
  • DenisChenu
  • DenisChenu's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
7 years 8 months ago #138335 by DenisChenu
Replied by DenisChenu on topic RemoteCOntrol 2 - export_responses - XLS invalid
Je parle de l'entête sur la requête HTTP : a mon avis : node.js envoie du text donc pour excel : c'est du texte et non du excel.

On peut envoyer le fichier xls au bon format, mais on ne gère pas l'entête HTTP.

Tu a tenté avec un truc du genre Content-Type: application/vnd.ms-excel via nodejs.org/api/http.html#http_response_setheader_name_value

Denis

Assistance on LimeSurvey forum and LimeSurvey core development are on my free time.
I'm not a LimeSurvey GmbH member, professional service on demand , plugin development .
I don't answer to private message.
The topic has been locked.
  • tomy137
  • tomy137's Avatar Topic Author
  • Offline
  • New Member
  • New Member
More
7 years 8 months ago - 7 years 8 months ago #138354 by tomy137
OK, je vois l'idée.

J'ai expérimenté. Exemple de POST :
Code:
{ request: 
   { debugId: 3,
     uri: 'http://192.168.1.17/limesurvey/index.php/admin/remotecontrol',
     method: 'POST',
     headers: 
      { 'user-agent': 'Apache-HttpClient/4.2.2 (java 1.5)',
        host: 'limesurvey.xxxxx.loc',
        path: '/index.php/admin/remotecontrol',
        connection: 'keep-alive',
        'content-type': 'application/vnd.ms-excel',
        'content-length': 236 },
     body: '{"method":"export_responses","params":{"sSessionKey":"tn59w52pr2y3arc4gixe5tupphivbg82","iSurveyID":"565971","sDocumentType":"xls","sLanguageCode":"fr","sCompletionStatus":"complete","sHeadingType":"full","sResponseType":"long"},"id":1}' } }

et la réponse :
Code:
{ response: 
   { debugId: 3,
     headers: 
      { date: 'Tue, 28 Jun 2016 16:25:05 GMT',
        server: 'Apache/2.4.7 (Ubuntu)',
        'x-powered-by': 'PHP/5.5.9-1ubuntu4.13',
        'set-cookie': [Object],
        expires: 'Thu, 19 Nov 1981 08:52:00 GMT',
        'cache-control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0',
        pragma: 'no-cache',
        'content-length': '0',
        'keep-alive': 'timeout=5, max=100',
        connection: 'Keep-Alive',
        'content-type': 'text/html' },
     statusCode: 200 } }

Je remarque que : 'content-length': '0', la réponse est vide et est bien sous la forme : 'content-type': 'text/html'


EDIT : Même au plus près de ta commande en PHP pas de changement...
Code:
{ request: 
   { debugId: 3,
     uri: 'http://192.168.1.17/limesurvey/index.php/admin/remotecontrol',
     method: 'POST',
     headers: 
      { 'user-agent': 'Apache-HttpClient/4.2.2 (java 1.5)',
        host: '192.168.1.17',
        path: '/index.php/admin/remotecontrol',
        connection: 'keep-alive',
        'content-type': 'application/vnd.ms-excel, charset=utf-8',
        'Content-Disposition': 'attachment, filename=abc.xls',
        Expires: 0,
        'Cache-Control': 'must-revalidate, post-check=0, pre-check=0',
        'content-length': 236 },
     body: '{"method":"export_responses","params":{"sSessionKey":"a5xssj2uvjjsbdvxyp8g9tb7sz92yuvd","iSurveyID":"565971","sDocumentType":"xls","sLanguageCode":"fr","sCompletionStatus":"complete","sHeadingType":"full","sResponseType":"long"},"id":1}' } }
{ response: 
   { debugId: 3,
     headers: 
      { date: 'Tue, 28 Jun 2016 16:54:02 GMT',
        server: 'Apache/2.4.7 (Ubuntu)',
        'x-powered-by': 'PHP/5.5.9-1ubuntu4.13',
        'set-cookie': [Object],
        expires: 'Thu, 19 Nov 1981 08:52:00 GMT',
        'cache-control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0',
        pragma: 'no-cache',
        'content-length': '0',
        'keep-alive': 'timeout=5, max=100',
        connection: 'Keep-Alive',
        'content-type': 'text/html' },
     statusCode: 200 } }
Last edit: 7 years 8 months ago by tomy137.
The topic has been locked.
  • DenisChenu
  • DenisChenu's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
7 years 8 months ago #138357 by DenisChenu
Replied by DenisChenu on topic RemoteCOntrol 2 - export_responses - XLS invalid
Oui, mais ça c'est pas du coté LS ?

EN fait : si sur LS : on supprime le header("Content-Type: application/vnd.ms-excel; charset=utf-8"); : dans ce cas : il faut enregistrer le fichier puis le réouvrir dans excel.
Sinon : ca fait ce que tu dit.

C'est node.js qui doit envoyé un header correspondant.
Sinon : en bin : tente en enregsitrant le fichier puis le réouvrant (en fait le screenshot semble bien montré du XLS )

Assistance on LimeSurvey forum and LimeSurvey core development are on my free time.
I'm not a LimeSurvey GmbH member, professional service on demand , plugin development .
I don't answer to private message.
The topic has been locked.
  • tomy137
  • tomy137's Avatar Topic Author
  • Offline
  • New Member
  • New Member
More
7 years 8 months ago - 7 years 8 months ago #138365 by tomy137
Ok, je comprends. Donc je reprend le cas de base avec la demande classique :

Code:
{ request: 
   { debugId: 3,
     uri: 'http://192.168.1.17/limesurvey/index.php/admin/remotecontrol',
     method: 'POST',
     headers: 
      { 'user-agent': 'Apache-HttpClient/4.2.2 (java 1.5)',
        host: '192.168.1.17',
        path: '/index.php/admin/remotecontrol',
        connection: 'keep-alive',
        'content-type': 'application/json',
        'content-length': 236 },
     body: '{"method":"export_responses","params":{"sSessionKey":"fr5ihxqdpedzivgw7gi9qt6wpkrwmhwt","iSurveyID":"565971","sDocumentType":"xls","sLanguageCode":"fr","sCompletionStatus":"complete","sHeadingType":"full","sResponseType":"long"},"id":1}' } }

Réponse de LS :
Code:
{ response: 
   { debugId: 3,
     headers: 
      { date: 'Wed, 29 Jun 2016 06:45:49 GMT',
        server: 'Apache/2.4.7 (Ubuntu)',
        'x-powered-by': 'PHP/5.5.9-1ubuntu4.13',
        'set-cookie': [Object],
        expires: 'Thu, 19 Nov 1981 08:52:00 GMT',
        'cache-control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0',
        pragma: 'no-cache',
        'keep-alive': 'timeout=5, max=100',
        connection: 'Keep-Alive',
        'transfer-encoding': 'chunked',
        'content-type': 'text/javascript' },
     statusCode: 200,
     body: '{"id":1, "result":"0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAOwADAP7/CQAGAAAAAAAAAAAAAAABAAAAEQAAAAAAAAAAEAAAAAAAAAEAAAD+////AAAAABIAAAD////////[...........................]/////////////////w==", "error":null}' } }

Ce qui nous intéresse est bien là dans le JSON de réponse (Donc bien du text/javascript, pas du application/vnd.ms-excel vu qu'il y a d'autres éléments) atteignable via body.result. C'est en base64 (Je n'ai pas tout laissé ci-dessus, vous comprenez bien pourquoi).

Je ne comprend pas pourquoi il faudrait changer les en-têtes HTTP vu qu'elles sont bien en accord avec ce qui est échangé.

Ensuite je converti le Base64 en bin et je l'écris dans un fichier .xls en bin / UTF8. Est-ce que c'est là que je suis sensé changer un en-tête ?

Et je voudrais éviter autant que possible d'avoir à manipuler le fichier (Ouvrir/Enregistrer) avec Excel, je perdrais l’intérêt d'automatiser via un script.

EDIT : Captures sur un 'vrai' excel :


Last edit: 7 years 8 months ago by tomy137.
The topic has been locked.
  • DenisChenu
  • DenisChenu's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
7 years 8 months ago #138369 by DenisChenu
Replied by DenisChenu on topic RemoteCOntrol 2 - export_responses - XLS invalid
OK,

Donc si en enregistrant il y a aussi un bug .... c'est peut être au moment du transfert.

Ce qu'il faudrait éventuellement faire c'est comparer les premiers caractères hexa des 2 fichiers : celui via le téléchargement, celui via le JS.

Sur l'entête : LS envoi du fichier binaire encodé en base64 : donc l'entête ne doit pas être celle d'excel. Mais quand tu télécharge via le web : le navigateur choisiut le type de fichier selon l'entête HTTP : c'est à ton système de bien positionner cette entête avant d'envoyer le body (A mon avis).

Denis

Assistance on LimeSurvey forum and LimeSurvey core development are on my free time.
I'm not a LimeSurvey GmbH member, professional service on demand , plugin development .
I don't answer to private message.
The topic has been locked.
Moderators: Nickko

Lime-years ahead

Online-surveys for every purse and purpose