在浏览器中显示Excel工作表?

我需要在networking浏览器 (不pipe是Firefox,Opera还是IE)中显示生成的excel (使用Apache POI的表格)。 我已经创build了JSP文件

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:

 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) 

我错过了什么或有什么不对吗? 任何人都可以帮我摆脱这个问题吗?

提前感谢。

你试图做的方式没有任何意义。 你不能像这样混合HTML和Excel。 更好地创build一个servlet而不是一个JSP页面,让这个servlet只输出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(); } } 
 HSSFWorkbook book; HSSFSheet sheet; HSSFRow row; CreationHelper createHelper = book.getCreationHelper(); 

您在初始化之前使用书籍对象。

我build议不要这样做。

JSP中的Scriptlet代码简直是错误的。

把数据库访问放在这样的页面上也不好。

更好的方法是Spring MVC和JExcelView。

这里有一个关于如何debuggingJSPexception的技巧:

在堆栈跟踪中,这个类

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

是为您的GetReport.jsp生成的Java类。 您可以在$TOMCAT_HOME/work/<enginename>/<hostname>/<appname>文件夹中查看生成的实际代码,然后查看第29行的具体内容。

看看SourceForge中的WorkbookTag项目,它正是您所需要的:使用Apache POI的HTML工作表呈现… WorkbookTag