2016-10-19 1 views
1

dans mon équipe au travail Je travaille sur une application GWT qui donne à chaque équipe de l'entreprise un aperçu de ce qu'ils doivent faire. Le programme fonctionne mais maintenant nous voulons que le tableau Excel que vous pouvez télécharger soit un * .xlsx et non un xls Tout ce projet est nouveau pour moi et je me considère comme un débutant dans GWT.GWT Télécharger Excel .xlsx me donne un fichier corrompu

Dans le code lorsque le nom de fichier est donné pour l'Exceltable, il y a un ".xls" à la fin. Mais quand je le change en + ".xlsx" et que je teste l'application, le téléchargement fonctionne toujours mais quand j'essaie d'ouvrir le fichier dans Excel, il me montre un message d'erreur et me dit que le fichier est corrompu ?! (.xls fonctionne)

Pouvez-vous m'expliquer comment fonctionne un téléchargement dans GWT avec un serveur Excel généré par serveur? Peut-être que vous avez des idées Quelles sont les causes du fichier à corrompu (Malheureusement, le programmeur de cette application est en vacances donc je ne peux pas lui demander ...)

Merci à l'avance

modifier:

public class Download extends HttpServlet { 

    private static final long serialVersionUID = 5580666921970339383L; 

    @Override 
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     doGet(request, response); 
    } 

    @Override 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 

     String filename = (String)request.getSession().getAttribute(CrossReportConstants.ATTR_FILENAME); 
     byte[] data = (byte[])request.getSession().getAttribute(CrossReportConstants.ATTR_REPORT); 
     request.getSession().setAttribute(CrossReportConstants.ATTR_FILENAME, null); 
     request.getSession().setAttribute(CrossReportConstants.ATTR_REPORT, null); 

     response.setContentType("application/vnd.ms-excel"); 
     response.setHeader("Content-Disposition", "attachment;filename=" + filename); 
     response.setHeader("Pragma", "no-cache"); 
     response.setHeader("Expires", "0"); 
     response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); 
     response.setContentLength(data.length); 

     try { 
      InputStream in = new ByteArrayInputStream(data); 
      ServletOutputStream out = response.getOutputStream(); 

      byte[] outputByte = new byte[4096]; 
      // copy binary contect to output stream 
      while (in.read(outputByte, 0, 4096) != -1) { 
       out.write(outputByte, 0, 4096); 
      } 
      in.close(); 
      out.flush(); 
      out.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

} 
+0

Pouvez-vous fournir le code que vous essayez de modifier? On dirait que vous changez simplement le nom du fichier dans la réponse http, mais pas le type de contenu. – Akkusativobjekt

+0

@Akkusativobjekt Le problème est que je ne suis pas vraiment autorisé à poster du code ici .... et l'ensemble du projet est relativement grand, il a plus de 80 classes et en ce moment im essayant de comprendre où je dois changer quelque chose .... malheureusement Je ne peux pas demander à mon collègue parce qu'il est en vacances .... si je trouve le code partie je vais le partager – KilledByCheese

+0

S'il s'agit d'un HttpServlet chercher quelque chose comme response.setContentType ("application/vnd.ms-excel"); – Akkusativobjekt

Répondre

0

maintenant que vous avez fourni code question peut être facile de répondre:

Le code ci définit un HttpServlet. Quelque part dans votre projet, il y a un fichier appelé web.xml. Dans ce fichier, la classe que vous avez affichée est mappée à un modèle d'URL, votre serveur sait donc qu'une URL spécifique doit être gérée par cette servlet.

La servlet que vous avez affichée en premier extrait le nom de fichier et le contenu du fichier hors de la session. En plus, la réponse http est préparée et le contenu du fichier est écrit. Il vous suffit maintenant de remplacer le type de contenu de la réponse par celui de xlsx.

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 

Le navigateur qui gère la réponse http reconnaît désormais le téléchargement en tant que fichier .xlsx. L'extension de fichier n'a pas vraiment d'importance dans cette étape, comme vous l'avez remarqué. Lorsque le programmeur d'origine de la servlet revient de ses vacances, vous devriez/pourriez lui recommander d'utiliser response.sendError() (avec un code d'état http approprié) au lieu de e.printStackTrace(). Ensuite, l'utilisateur de la servlet peut mieux comprendre si quelque chose ne fonctionne pas et qui est à blâmer.

+0

j'ai changé response.setContentType ("application/vnd.ms-excel"); à response.setContentType ("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); et changé le nom de fichier générique à .xmsx mais quand je l'ai testé il télécharge une feuille .xslx mais je ne peux pas l'ouvrir Excel me dit toujours que le fichier est corrompu – KilledByCheese