JAVA : l'Exportation de Données (base de données) d'excel et de l'envoyer à côté client
Comme le titre le suggère, j'ai besoin de mettre certaines données (que j'ai obtenu à partir de la base de données) dans une feuille excel, puis de l'envoyer à côté client de sorte que l'utilisateur peut enregistrer , ouvrir ou d'annuler l'action.
J'ai vu quelques articles à ce sujet, le plus proche étant : Comment puis-je obtenir de l'utilisateur pour le téléchargement de mon fichier? (Java, MVC, Excel, POI). Se référant aux liens fournis par Stevens j'ai essayé le code suivant :
public String execute(){
setContentDisposition("attachment; filename=\"" + ename + "\"");
try{
ServletContext servletContext = ServletActionContext.getServletContext();
String filePath = servletContext.getRealPath("/WEB-INF/template/excel/mytemplate.xls");
File file = new File(filePath);
Workbook wb = WorkbookFactory.create(new FileInputStream(file));
Sheet sheet = wb.getSheetAt(0);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
wb.write(baos);
InputStream excelStream;
excelStream = new ByteArrayInputStream(baos.toByteArray());
}catch(Exception e){
System.out.println(e.getMessage());
}
return SUCCESS;
}
Ici tout d'abord WorkbookFactory
n'est pas défini. Deuxièmement, je ne pouvais pas comprendre correctement le fonctionnement du code.
J'ai aussi trouvé ce lien : http://www.roseindia.net/answers/viewqa/Java-Beginners/14930-How-to-export-data-from-database-to-excel-sheet-by-using-java--in-standalone-project.html. Mais ici, le fichier excel est enregistré sur le serveur. Je veux que le fichier ne doit pas être enregistré sur le serveur, il devrait aller directement à côté client
(Si ça aide), je suis en utilisant : le framework struts 2, hibernate
Je suis ouvert à d'autres choses comme le PI de l'API de jQuery ou tout autres bonnes choses.
Je ne peux pas utiliser displayTag
pour une raison quelconque.
Javascript serait mon dernier recours (bien que j'ai mis en œuvre avec elle), car elle nécessite une modification de certains paramètres de sécurité par défaut du navigateur (Si cela peut être évité, je suis ouvert à du javascript).
Veuillez indiquer comment dois-je aller à ce sujet maintenant.
Merci!!
EDIT :
<result-types>
<result-type name="jsp" class="org.apache.struts2.views.jsp"/>
<result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/>
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
</result-types>
<action name="myActionName" class="package.myActionClass">
<result type="stream">
<param name="contentType">"application/vnd.ms-excel"</param>
<param name="inputName">excelStream</param>
<param name="contentDisposition">contentDisposition</param>
<param name="bufferSize">1024</param>
</result>
</action>
L'erreur lors de l'exécution de l'action:
java.lang.reflect.InvocationTargetException
java.lang.IncompatibleClassChangeError: Class org.apache.poi.hssf.usermodel.HSSFWorkbook does not implement the requested interface org.apache.poi.ss.usermodel.Workbook
WorkbookFactory
est une partie de la PI de l'API qui est un projet Apache.Je pense que vous devriez le faire avec l'aide de fichiers temporaires "Fichier.createTempFile("préfixe","suffixe"). Il va créer un fichier dans le dossier temp et alors u peut écrire et enregistrer votre contenu dans le dossier temp. et après l'envoi de ce fichier à côté client , vous pouvez les supprimer.
Créer un projet autonome qui utilise POI pour créer un modèle de document avec quelques données factices. Ensuite, dans le conteneur de faire la même chose mais maintenant, l'obtention des données avec hibernate. Vous devriez être en mesure d'enregistrer le fichier sur le serveur et de les analyser (c'est juste un test, vous pouvez garder le fichier en mémoire). En ce qui concerne struts2 est concerné, il est juste une mater de l'envoi du fichier.
J'ai découvert que je n'avais pas ajouté le poi-ooxml pot, la raison pour
WorkbookFactory
erreur. Deuxièmement, maintenant que j'ai ajouté le fichier jar requis, j'obtiens une erreur lorsque je lance le projet. L'erreur est --> ÉCHEC de l'application Déployée au chemin de contexte / mais le contexte n'a pas pu démarrer....\nbproject\build-impl.xml:770: Le module n'a pas été déployé. BUILD FAILED (durée totale: 5 secondes). Voir le modifier pour le fichier struts-config .xml fichier de code.vais essayer ça une fois que je reçois par le biais de l'envoi d'une feuille excel à côté client.
OriginalL'auteur kanishk | 2012-02-15
Vous devez vous connecter pour publier un commentaire.
D'accord. Donc, finalement, je suis à travers avec tous les obstacles et a trouvé une façon de le faire.
J'ai réalisé que le problème que j'ai en face n'était pas dans la création du fichier excel, le problème a été de l'envoyer à côté client, et que trop sans la création d'un fichier ou d'un fichier temporaire sur le serveur.
Donc, ici, est de savoir comment aller à ce sujet (j'ai arraché les détails de mon code d'origine de sorte que vous pouvez facilement le comprendre).
Dans le fichier "action" vous devez d'abord créer un HSSFWorkbook de l'objet, de mettre les données sur elle et puis sans l'enregistrer sur le disque sur le serveur, et de l'envoyer au client à l'aide de inputstream.
Action du code de Fichier :
Maintenant dans le fichier struts-config fichier il suffit d'écrire (à noter que excelStream & contentDisposition a été définie dans l'action elle-même le résultat de type ici est
org.apache.struts2.dispatcher.StreamResult
):C'est tout. Maintenant, quand l'action est exécutée, l'utilisateur sera invité à ouvrir ou enregistrer le fichier.
🙂
merci man 😉
Merci pour le guide... je vais avoir un problème plus grave... j'ai mis en place exactement de cette manière, et le rapport est généré avec succès... Cependant, en attendant le fichier Excel est généré, pas de corps pouvez naviguer à travers le site web jusqu'à ce que le rapport demandé par d'autres utilisateurs) finalise. Savez-vous comment résoudre ce problème? Ma plate-forme est de l'établissement de rapports qui dure environ 10 segs à être généré.
OriginalL'auteur kanishk
Vous avez deux copies différentes de POI sur votre classpath, l'un ancien et un nouveau. C'est pourquoi vous obtenez à l'exception java.lang.IncompatibleClassChangeError: Classe org.apache.pi.hssf.usermodel.HSSFWorkbook n'implémente pas l'interface demandée org.apache.pi.ss.usermodel.Classeur - vous avez compilé avec la nouvelle copie, mais à l'exécution, c'est de trouver quelques nouvelles et quelques vieux pots.
Ce qui est couvert dans le PI FAQ. Idéalement, vous devriez juste être capable de regarder tous les pots dans votre configuration, et zap le vieux PI. Si pas, le POI entrée de la FAQ a un exemple de code que vous pouvez utiliser pour obtenir la JVM pour imprimer où il a chargé des POI classes de. Qui va vous montrer le pot de nom de fichier, et vous pouvez supprimer l'ancienne.
C'est aussi exactement le même problème que j'ai rencontré. Merci pour votre réponse, qui est très utile!
OriginalL'auteur Gagravarr