2010-08-18 13 views
4

J'ai besoin de affichage le nouveau généré Excel (à partir de tables utilisant Apache POI) dans un navigateur Web (quoi que ce soit, Firefox, Opera ou IE). J'ai créé le fichier JSP avecAfficher la feuille Excel dans le navigateur?

contentType="application/vnd.ms-excel"

Mais je ne suis pas l'obtenir.

Voici mon extrait de code:

<%@page session="true" contentType="application/vnd.ms-excel" pageEncoding="UTF-8"%> 
<%@page import="org.apache.poi.ss.usermodel.CellStyle"%> 
<%@page import="java.sql.DriverManager"%> 
<%@page import="java.sql.ResultSet"%> 
<%@page import="java.sql.Statement"%> 
<%@page import="java.sql.Connection"%> 
<%@page import="org.apache.poi.ss.usermodel.CreationHelper"%> 
<%@page import="org.apache.poi.hssf.usermodel.HSSFCell"%> 
<%@page import="org.apache.poi.hssf.usermodel.HSSFRow"%> 
<%@page import="org.apache.poi.hssf.usermodel.HSSFWorkbook"%> 
<%@page import="org.apache.poi.hssf.usermodel.HSSFSheet"%> 

<html> 
    <head> 
     <%! 
      int r=0; 

      HSSFWorkbook book; 
      HSSFSheet sheet; 
      HSSFRow row; 

      CreationHelper createHelper = book.getCreationHelper(); 

      Connection conn; 
      Statement stmt; 
      ResultSet rs; 
     %> 
     <title>Report</title> 
     <% 
      book = new HSSFWorkbook(); 
      sheet = book.createSheet("Report"); 
     %> 
    </head> 
    <body> 
     <% 
      try  { 

        // Header of the Excel File 
       row = sheet.createRow(r); 

       row.createCell(0).setCellValue("Visit ID"); 
       row.createCell(1).setCellValue("Carrier Name"); 
       row.createCell(2).setCellValue("Phone Number"); 
       row.createCell(3).setCellValue("Patient Name"); 
       row.createCell(4).setCellValue("Subscriber ID"); 
       row.createCell(5).setCellValue("Subscriber Name"); 
       row.createCell(6).setCellValue("Chart Number"); 
       row.createCell(7).setCellValue("Date Of Birth"); 
       row.createCell(8).setCellValue("Subscriber Employer"); 
       row.createCell(9).setCellValue("Service Date"); 
       row.createCell(10).setCellValue("Provider Name"); 
       row.createCell(11).setCellValue("CPT Code"); 
       row.createCell(12).setCellValue("Aging Date"); 
       row.createCell(13).setCellValue("Total"); 
       row.createCell(14).setCellValue("Follow Up Notes"); 
       row.createCell(15).setCellValue("Internal Status Code"); 

       CellStyle cellStyle = book.createCellStyle(); 
       cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("MM/dd/yyyy")); 

       Statement stNotes; 
       ResultSet rsNotes; 

       Class.forName("com.mysql.jdbc.Driver"); 

       conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/maintain", "root", "root"); 
       stmt = conn.createStatement(); 

       stNotes = conn.createStatement(); 

       rs = stmt.executeQuery("SELECT b.VisitID, b.CarrierName, b.PhoneNum, b.PatientName, " 
         + "b.SubscriberID, b.SubscriberName, b.ChartNum, b.DoB, b.SubscriberEmp, " 
         + "b.ServiceDate, b.ProviderName, b.CPTCode, b.BillingDate, b.BalanceAmt " 
         + "FROM billing b INNER JOIN followup f ON b.VisitID = f.VisitID GROUP BY VisitID"); 

       while(rs.next()) { 
        r++; 

        row = sheet.createRow(r); 

        row.createCell(0).setCellValue(rs.getString("VisitID")); 
        row.createCell(1).setCellValue(rs.getString("CarrierName")); 
        row.createCell(2).setCellValue(rs.getString("PhoneNum")); 
        row.createCell(3).setCellValue(rs.getString("PatientName")); 
        row.createCell(4).setCellValue(rs.getString("SubscriberID")); 
        row.createCell(5).setCellValue(rs.getString("SubscriberName")); 
        row.createCell(6).setCellValue(rs.getString("ChartNum")); 
        row.createCell(7).setCellValue(rs.getString("DoB")); 
        row.createCell(8).setCellValue(rs.getString("SubscriberEmp")); 


        row.createCell(9).setCellValue(rs.getString("ServiceDate")); 
        row.createCell(9).setCellStyle(cellStyle); 

        row.createCell(10).setCellValue(rs.getString("ProviderName")); 
        row.createCell(11).setCellValue(rs.getString("CPTCode")); 

        row.createCell(12).setCellValue(rs.getString("BillingDate")); 
        row.createCell(12).setCellStyle(cellStyle); 

        row.createCell(13).setCellValue(rs.getString("BalanceAmt")); 

        rsNotes = stNotes.executeQuery("SELECT Date, InternalStatusCode, FollowUpNote " 
          + "FROM followup WHERE VisitID='" + rs.getString("VisitID") + "' ORDER BY Date"); 

        while(rsNotes.next()) { 
         row.createCell(14).setCellValue(rsNotes.getString("Date") + " - " + rsNotes.getString("FollowUpNote")); 
         row.createCell(15).setCellValue(rs.getString("VisitID")); 
        } 
       } 

      } 
      catch(ClassNotFoundException cnf) { 
       out.print("<br> Error : MySQL Driver not found. <br>"); 
      } 
      catch(Exception ex) { 
       out.print("Error : <br>" + ex); 
      } 
     %> 
    </body> 
</html> 

Je reçois cette exception avec Tomcat 6.0.26:

exception 

org.apache.jasper.JasperException: java.lang.NullPointerException 
    org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:156) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 

root cause 

java.lang.NullPointerException 
    org.apache.jsp.GetReport_jsp.<init>(GetReport_jsp.java:29) 
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    java.lang.Class.newInstance0(Class.java:355) 
    java.lang.Class.newInstance(Class.java:308) 
    org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:145) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 

Ai-je raté quelque chose ou quelque chose de mal? Quelqu'un peut-il m'aider à me débarrasser de ce problème?

Thanx à l'avance.

+0

Un peu de code peut aider. –

+0

@ammoQ - J'ai ajouté bro .. Check it out pls .. – Venkat

+0

Je vois maintenant que vous avez modifié la question à chaque fois pour chaque nouveau problème. ** Vous ne devriez pas faire ça **. Cela rend les réponses inutiles/inutiles. Vous devriez poser une nouvelle question pour chaque nouveau problème indépendant! J'ai retourné la question originale. Vous devriez poser une nouvelle question sur le nouveau problème 'IllegalStateException' (ou simplement lire le message et penser logiquement ...). – BalusC

Répondre

7

La façon dont vous essayez de le faire n'a pas de sens. Vous ne pouvez pas mélanger HTML avec Excel comme ça. Mieux vaut créer une servlet à la place d'une page JSP et laisser cette servlet afficher uniquement le fichier Excel et rien d'autre.

Quelque chose comme ceci:

import java.io.*;  
import javax.servlet.http.*; 
import javax.servlet.*; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
// ... plus all the other libs you need 

public class ExcelServlet extends HttpServlet { 
    public void doGet (HttpServletRequest req, 
        HttpServletResponse res) 
    throws ServletException, IOException 
    { 
    HSSFWorkbook book; 
    // ... 
    // fill the book 
    // ... 
    res.setContentType("application/vnd.ms-excel"); 
    book.write(res.getOutputStream()); 
    res.getOutputStream().close(); 
    } 
} 
+0

J'ai fait ce que vous avez recommandé. Mais je reçois ** Erreur:
java.lang.IllegalStateException: getWriter() a déjà été appelé pour cette réponse ** comme le contenu Excel. Pouvez-vous clarifier, pourquoi? – Venkat

+0

J'ai produit le code comme vous l'avez recommandé. check it out pls .. – Venkat

+0

Vous ne pouvez pas appeler à la fois getWriter() et getOutputStream() sur le même objet de réponse. Je suppose que les pages JSP appellent implicitement getWriter(), c'est pourquoi vous devriez en faire une servlet. (Mais ne me croyez pas sur parole, je ne suis pas un expert JSP) –

3
HSSFWorkbook book; 
HSSFSheet sheet; 
HSSFRow row; 
CreationHelper createHelper = book.getCreationHelper(); 

Vous utilisez l'objet livre avant de l'initialiser.

+0

Je ne reçois aucun contenu dans ce fichier Excel ...Pouvez-vous identifier pourquoi? – Venkat

+0

@ven codeur, où est le code où vous écrivez le classeur dans un fichier? Vous créez l'objet et y ajoutez des données, mais vous ne l'écrivez jamais quelque part. A partir des POI Javadocs, il semble que vous deviez appeler 'book.write (OutputStream)' –

2

Je vous recommande de ne pas le faire de cette façon.

Code Scriptlet dans JSPs est tout simplement faux.

accès Mettre la base de données dans une page comme celui-ci n'est pas bon non plus.

Une meilleure approche serait Spring MVC et son JExcelView.

0

Voici une astuce sur la façon de déboguer exceptions JSP:

dans le stacktrace, cette classe

java.lang.NullPointerException 
org.apache.jsp.GetReport_jsp.<init>(GetReport_jsp.java:29) 

est la classe java généré pour votre GetReport .jsp. Vous pouvez regarder dans le dossier $TOMCAT_HOME/work/<enginename>/<hostname>/<appname> pour voir le code réel généré, et voir ce qui est exactement à la ligne 29.

0

Jetez un oeil au projet WorkbookTag de SourceForge qui fait exactement ce dont vous avez besoin: Rendu de feuille de calcul HTML en utilisant Apache POI .. . WorkbookTag

Questions connexes