Récemment, j'ai vu un open source sur Internet qui utilise Java pour contrôler Excel. Je l'ai essayé sur weblogic et je l'ai trouvé très bien. Je voudrais le recommander à tout le monde.
Allez d’abord sur http://www.andykhan.com/jexcelapi/index.html pour télécharger la dernière version de JExcelApi et placez jxl.jar dans votre chemin de classe.
Écrivez un javaBean et utilisez JExcelApi pour générer dynamiquement des documents Excel. J'écrirai ici le plus simple et le plus schématique. Si c'est compliqué, vous devrez peut-être interroger la base de données ou quelque chose du genre.
/////////////////////////////Test.java///////////////// ///// ////////////////////////
paquet com.jagie.test;
importer java.io.* ;
importer jxl.*;
importer jxl.write.*;
importer jxl.format.* ;
importer java.util.* ;
importer java.awt.Color ;
classe publique Test{
public static void writeExcel (OutputStream os) lève une exception {
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);
jxl.write.WritableSheet ws = wwb.createSheet("TestSheet1", 0);
jxl.write.Label labelC = new jxl.write.Label(0, 0, "J'aime la Chine");
ws.addCell(labelC);
jxl.write.WritableFont wfc = nouveau jxl.write.WritableFont(WritableFont.ARIAL,20, WritableFont.BOLD, false,
UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.GREEN);
jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
wcfFC.setBackground(jxl.format.Colour.RED);
labelC = new jxl.write.Label(6, 0, "La Chine m'aime",wcfFC);
ws.addCell(labelC);
//Écrire dans une feuille de calcul Exel wwb.write();
//Ferme l'objet classeur Excel wwb.close();
}
//Il est préférable d'écrire une méthode principale comme celle-ci pour tester si votre classe est bien écrite.
public static void main (String [] args) lève une exception {
Fichier f=nouveau fichier("kk.xls");
f.createNewFile();
writeExcel (nouveau FileOutputStream (f));
}
}
Écrivez un jsp pour utiliser le test Javabean pour générer des documents Excel.
////////////////////////////test_excel.jsp////////////////// //// //////
< %@page import="com.jagie.test.Test" %>
<%
réponse.reset();
réponse.setContentType("application/vnd.ms-excel");
Test.writeExcel(response.getOutputStream());
%>
Ceci est fait. Vous pouvez utiliser IE pour accéder à test_excel.jsp afin d'ouvrir le document Excel généré dynamiquement dans IE. Pas de charabia du tout.
Certaines personnes peuvent demander : réponse.reset(); Cette phrase peut-elle être omise ? Ma suggestion est qu'elle doit être écrite à moins que vous puissiez garantir qu'il n'y a rien d'autre dans le tampon de réponse.
D'autres peuvent demander : j'ajoute < %@page contentType="application/vnd.ms-excel;charset=GBK" %> au début de jsp et supprime Response.setContentType("application/vnd.ms-excel" ); ça va ? La réponse à cette question est très simple, il suffit de vérifier le code java généré par le serveur jsp après la compilation de jsp. S'il est modifié comme suit, le code schématique du fichier java généré par mon welogic7 après la compilation de test_excel.jsp est. comme suit :
public void _jspService (demande javax.servlet.http.HttpServletRequest,
javax.servlet.http.HttpServletResponse) renvoie java.io.IOException,
javax.servlet.ServletException {
// déclare et définit des variables connues :
javax.servlet.ServletConfig config = getServletConfig();
javax.servlet.ServletContext application = config.getServletContext();
javax.servlet.jsp.tagext.Tag _activeTag = null;
// variables pour le protocole d'extension de balise
Page d'objet = this ;
javax.servlet.jsp.JspWriter sorti ;
javax.servlet.jsp.PageContext pageContext =
javax.servlet.jsp.JspFactory.getDefaultFactory().getPageContext(this,
requête, réponse, null, vrai, 8192, vrai);
réponse.setHeader("Content-Type", "application/vnd.ms-excel; charset=GBK");
out = pageContext.getOut();
JspWriter _originalOut = out;
javax.servlet.http.HttpSession session = request.getSession(true);
try { // bloc d'essai de page d'erreur
réponse.setContentType("application/vnd.ms-excel;charset=GBK");
out.print("rnrnrnrn");
out.print("rn");
//[ /test_excel.jsp; Ligne : 6]
réponse.reset(); //[ /test_excel.jsp; Ligne : 7]
//response.setContentType("application/vnd.ms-excel");
//[ /test_excel.jsp; Ligne : 8]
Test.writeExcel(response.getOutputStream()); //[ /test_excel.jsp; Ligne : 9]
} catch (Jetable __ee) {
while (out != null && out != _originalOut) out = pageContext.popBody();
((weblogic.servlet.jsp.PageContextImpl)pageContext).handlePageException((Throwable)__ee);
}
//avant l'accolade fermante finale...
}
Évidemment, après avoir bloqué Response.setContentType("application/vnd.ms-excel");, avant Test.writeExcel(response.getOutputStream()); et après Response.reset();, le type correct de type de contenu de réponse est n'est pas défini, bien sûr, la sortie est tronquée. Le code source compilé de jsp qui génère correctement Excel est le suivant :
public void _jspService(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse) renvoie java.io.IOException,
javax.servlet.ServletException
{
// déclare et définit des variables connues :
javax.servlet.ServletConfig config = getServletConfig();
javax.servlet.ServletContext application = config.getServletContext();
javax.servlet.jsp.tagext.Tag _activeTag = null;
// variables pour le protocole d'extension de balise
Page d'objet = this ;
javax.servlet.jsp.JspWriter sorti ;
javax.servlet.jsp.PageContext pageContext =
javax.servlet.jsp.JspFactory.getDefaultFactory().getPageContext(this, request, réponse, null, true, 8192, true
out = pageContext.getOut();
JspWriter _originalOut = out;
javax.servlet.http.HttpSession session = request.getSession(true);
try { // bloc d'essai de page d'erreur
out.print("rn");
//[ /test_excel.jsp; Ligne : 2]
réponse.reset(); //[ /test_excel.jsp; Ligne : 3]
réponse.setContentType("application/vnd.ms-excel"); //[ /test_excel.jsp; Ligne : 4]
Test.writeExcel(response.getOutputStream()); //[ /test_excel.jsp; Ligne : 5]
} catch (Jetable __ee) {
while (out != null && out != _originalOut) out = pageContext.popBody();
((weblogic.servlet.jsp.PageContextImpl)pageContext).handlePageException((Throwable)__ee);
}
//avant l'accolade fermante finale...
}
Vous pouvez voir qu'après Response.reset(); et avant Test.writeExcel(response.getOutputStream()); le contenu de la sortie de réponse est correctement défini. Le résultat est donc normal.
Enfin, j’espère que cet article pourra vous inspirer. S’il y a des erreurs, n’hésitez pas à les critiquer et à les corriger !