2010-08-18 5 views
4

мне нужно дисплей вновь генерироваться превосходят (из таблиц с помощью Apache POI) в веб-браузере (все, что есть, Firefox, Opera или IE). Я создал файл JSP сПоказать лист Excel в браузере?

contentType="application/vnd.ms-excel"

Но я не получаю его.

Вот мой фрагмент кода:

<%@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> 

Я получаю это исключение с 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) 

Я не пропустить что-то или что-то не так? Может ли кто-нибудь помочь мне избавиться от этой проблемы?

Thanx заранее.

+0

Немного кода может помочь. –

+0

@ammoQ - Я добавил bro .. Проверьте это pls .. – Venkat

+0

Теперь я вижу, что вы каждый раз редактировали вопрос для каждой новой проблемы. ** Вы не должны этого делать **. Это делает ответы бессмысленными/бесполезными. Вы должны задать новый вопрос для каждой новой и независимой проблемы! Я отскакивал исходный вопрос. Вы должны задать новый вопрос о новой проблеме 'IllegalStateException' (или просто прочитать сообщение и логически мыслить ...). – BalusC

ответ

7

То, как вы пытаетесь это сделать, не имеет никакого смысла. Вы не можете смешивать HTML с Excel. Лучше создайте сервлет вместо JSP-страницы и пусть этот сервлет выводит только файл Excel и ничего больше.

Что-то вроде этого:

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

Я сделал так, как вы рекомендовали. Но я получаю ** Ошибка:
java.lang.IllegalStateException: getWriter() уже был вызван для этого ответа ** в качестве содержимого excel. Вы можете уточнить, почему? – Venkat

+0

Я подготовил код, как вы рекомендовали. проверьте его pls .. – Venkat

+0

Вы не можете вызывать getWriter() и getOutputStream() в одном и том же объекте ответа. Я предполагаю, что страницы JSP неявно называют getWriter(), поэтому вы должны сделать это сервлетом. (Но не верьте мне на слово, я не эксперт JSP) –

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

Вы используете объект книги перед его инициализацией.

+0

Я не получаю никакого контента в этом файле excel ...Можете ли вы определить, почему? – Venkat

+0

@ven coder, где код, в котором вы пишете книгу в файл? Вы создаете объект и добавляете в него данные, но вы никогда его не пишете. Из POI Javadocs похоже, что вам нужно вызвать 'book.write (OutputStream)' –

2

Я бы рекомендовал не делать это таким образом.

Код сценария в JSP просто ошибочен.

Помещение доступа к базе данных на странице, подобной этой, тоже нехорошо.

Лучшим подходом будет Spring MVC и его JExcelView.

0

Вот подсказка о том, как отлаживать JSP исключения:

в StackTrace, этот класс

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

это сгенерированный класс Java для GetReport .jsp. Вы можете посмотреть в папке $TOMCAT_HOME/work/<enginename>/<hostname>/<appname>, чтобы увидеть фактический код, сгенерированный, и посмотреть, что именно находится в строке 29.

0

Посмотрите проект WorkbookTag от SourceForge, который делает именно то, что вам нужно: рендеринг листа HTML с использованием Apache POI .. . WorkbookTag

Смежные вопросы