2015-03-31 59 views
0

我想在servlet中使用Apache POI打開一個Excel文件。爲什麼servlet拋出FileNotFoundException,而獨立應用程序工作?

我有一個基本的Java應用程序,它的工作原理已經測試過這一點,但在servlet中,我越來越:

java.io.FileNotFoundException 

這裏是我的index.html

<center> 
<h2> 
<a href="ExcelSrv">Click Here</a> 
</h2> 
</center> 

ExcelGenerator。 Java的:

package com.nody; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.Iterator; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 


public class ExcelGenerator extends HttpServlet { 
private static final long serialVersionUID = 1L; 
public ExcelGenerator() 
{} 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
response.setContentType("text/html"); 
PrintWriter out=response.getWriter(); 
try 
{ 
FileInputStream file = new FileInputStream(new File("WebContent/files/source.xlsx"));  //Create Workbook instance holding reference to .xlsx file 
XSSFWorkbook workbook = new XSSFWorkbook(file); 
//Get first/desired sheet from the workbook 
XSSFSheet sheet = workbook.getSheetAt(0); 
//Iterate through each rows one by one 
Iterator<Row> rowIterator = sheet.iterator(); 
while (rowIterator.hasNext()) 
    {       
    Row row = rowIterator.next(); 
    //For each row, iterate through all the columns 
    Iterator<Cell> cellIterator = row.cellIterator(); 
    while (cellIterator.hasNext()) 
    { 
     Cell cell = cellIterator.next(); 
     //Check the cell type and format accordingly 
     switch (cell.getCellType()) 
     { 
     case Cell.CELL_TYPE_NUMERIC: 
     System.out.print(cell.getNumericCellValue() + ""); 
     break; 
     case Cell.CELL_TYPE_STRING: 
     System.out.print(cell.getStringCellValue() + ""); 
     break; 
     } 
    } 
    System.out.println(""); 
    } 
    file.close(); 
    } 
    catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 
} 
} 

的web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
    <display-name>ExcelGenerator</display-name> 
    <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>default.html</welcome-file> 
    <welcome-file>default.htm</welcome-file> 
    <welcome-file>default.jsp</welcome-file> 
    </welcome-file-list> 
    <servlet> 
    <description></description> 
    <display-name>ExcelGenerator</display-name> 
    <servlet-name>ExcelGenerator</servlet-name> 
    <servlet-class>com.nody.ExcelGenerator</servlet-class> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>ExcelGenerator</servlet-name> 
    <url-pattern>/ExcelSrv</url-pattern> 
    </servlet-mapping> 
</web-app> 

我的JAR文件:

dom4j-1.6.1.jar 
poi-3.12-beta1-20150228.jar 
poi-ooxml-3.12-beta1-20150228.jar 
poi-ooxml-schemas-3.12-beta1-20150228.jar 
servlet-api.jar 
xmlbeans-2.6.0.jar 

我一直在我的Excel文件中WebContent/files/source.xlsx,它只包含一列。

回答

1

使用

getServletContext().getRealPath("") 

你的情況

 FileInputStream file = new FileInputStream(new File(getServletContext().getRealPath("/files/source.xlsx")));  //Create Workbook instance holding reference to .xlsx file 

或者您可以使用

FileInputStream file = getServletContext().getResourceAsStream("/files/source.xlsx"); 
+0

java.io.FileNotFoundException:E:\ ECLIPSEWORKSPACE \ JAVA \ SPRING2 \ .metadata位於\ .plugins \ org.eclipse.wst.server.core \ tmp2 \ wtpwebapps \ ExcelGenerator \ src \ source.xlsx(系統找不到指定的路徑) 我做了更改,但仍然得到該異常 – 2015-03-31 19:16:56

+0

Opps刪除WebContent。編輯ans – Pravin 2015-03-31 19:25:32

+0

現在我把它放在WebContent文件夾下..其作品..謝謝 – 2015-03-31 19:38:22

0

你不應該訪問網絡資源java.io.File對象。在許多應用程序服務器中,它們不會在文件系統中獨立存在。

正確的方法是利用javax.servlet.ServletContext.getResourceAsStream(java.lang.String)

InputStream sourceInput = request.getServletContext().getResourceAsStream("/files/source.xlsx"); 
XSSFWorkbook workbook = new XSSFWorkbook(sourceInput); 
相關問題