我想在基于Web的项目(J2EE-JSP + Servlets)中阅读Excel文件的内容,这些项目位于Web服务器的文件夹中。
我创建了一个java文件,我将使用JSTL库通过JSP页面调用,但是我需要在Java文件中获取Excel工作表的路径,所以我可以阅读内容。
如何获取当前Java文件的路径以及Excel文件?
另外,我将通过POI库阅读Excel文件的内容。我能够在J2SE开发中做到这一点,但这可能吗?
POIFSFileSystem fs = null;
try {
fs = new POIFSFileSystem(new FileInputStream("**some path here of sheet**"));
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
HSSFWorkbook wb = null;
try {
wb = new HSSFWorkbook(fs);
} catch (IOException ex) {
ex.printStackTrace();
}
HSSFSheet sheet = wb.getSheetAt(0);
HSSFRow row;
HSSFCell cell1,cell2,cell3;
int rows; // No of rows, stores the no. of rows for an excel sheet
int cols; // No of columns, stores the no. of columns for an excel sheet
rows = sheet.getPhysicalNumberOfRows();
cols = 5;
for(int r = 0; r < rows; r++) {
row = sheet.getRow(r);
if(row != null) {
cell1 = row.getCell(1);
cell2 = row.getCell(2);
cell3 = row.getCell(4);
//System.out.println(cell1.getStringCellValue()+" "+cell2.getStringCellValue()+" "+cell3.getStringCellValue());
}
}
}
答案 0 :(得分:3)
您可以要求servlet上下文相对于实际路径进行转换:
context.getRealPath("/");
如果你的java类是servlet,你可能会做类似
的事情getServletConfig().getServletContext();
否则,jsp页面是一个servlet,所以你可以从那里传递它。
最后,您可以在启动应用时选择一次:
public class AppStartup implements ServletContextListener {
public void contextDestroyed(ServletContextEvent event) {
}
public void contextInitialized(ServletContextEvent event) {
ServletContext context = event.getServletContext();
// remember it in some static class for future use
}
}
说完这一切之后,最好是创建一个具有servlet上下文的servlet,解析路径,并使用已解析的文件路径调用类,然后最终将请求转发到jsp页面以显示结果。
答案 1 :(得分:1)
在一个基本的JSP / Servlet应用程序中,您将拥有一个支持servlet,它将执行程序中的几乎所有逻辑,将模型推送到请求中,然后将用户重定向到JSP页面这将从请求中拉出模型,并且只会格式化它(如果需要,可以使用JSTL)。如果你的方法需要使用Excel文件执行某种处理,它应该在一个扩展javax.servlet.http.HttpServlet的类中,这样你就可以访问ServletContext及其方法
String physicalFolder = getContext().getRealPath("/");
如果您不想使用此方法并且仍想使用JSTL(我猜您使用&lt; jsp:useBean /&gt; 标记),则可以初始化bean属性设置webapp的物理文件夹使用类似的东西:
<jsp:useBean id="excelBean" scope="request" class="yourpackage.YourClass" >
<jsp:setProperty name="physicalPath" value="<%= application.getRealPath("/") %>" />
</jsp:useBean>
答案 2 :(得分:1)
这是错误的做法。
您应该通过将其放在WEB-INF / classes中并使用getResourceAsStream来使用文件名从上下文路径获取InputStream来读取该文件。
尝试查看this示例。
答案 3 :(得分:0)
我怀疑如果你在服务器上寻找本地文件系统路径,那可能是不可能的。虽然有些Web应用程序服务器(特别是Tomcat,我认为)确实有一个包含所有应用程序文件的文件夹,但还有其他服务器直接从压缩的WAR文件运行应用程序。在这种情况下,可能没有Excel文件的路径,因为它在存档中。
一种可能的方法是独立于您正在运行的应用程序服务器,将Excel文件打包到WEB-INF/lib
中的一个JAR中,然后使用
getClass().getResourceAsStream("/class/path/to/file.xls")
而不是
new FileInputStream("/local/filesystem/path/file.xls")
使用getResourceAsStream(“...”)时,需要提供类路径,而不是文件系统路径。因此,如果您将Excel文件打包在JAR中,则在名为com.yourcompany.files
的包中,您需要使用
getClass().getResourceAsStream("/com/yourcompany/files/file.xls")
答案 4 :(得分:0)
我是第二个duffymo和Martin McNulty,你必须使用getResourceAsStream并放入你的Excel文件,这里就是例子:
你的webapp结构是这样的,对吧?
- Application Root
|
+- WEB-INF
|
+- classes/ <--- This is added to CLASSPATH
|
+- lib/ <--- Its contents are added to CLASSPATH
|
+- web.xml
在此结构中,您的应用程序类路径符合位于 lib 文件夹和类文件夹中的JAR文件。当您使用IDE进行编译时,将编译位于源文件夹中的文件,并将 .class 文件复制到 classes 文件夹中,如果这些文件不是Java文件,则刚刚复制到文件夹中,但仍然在类路径中。
因此,简单地说...... 您可以在类路径中添加非类文件,例如Excel文件,并将其组织成包,就像它是一个类一样。
如果将Excel文件放在类路径中,您将获得的优势是可以独立于JAR文件或WAR文件位置访问该文件,只需知道它在类路径中的位置即可。
方法 Class.getResourceAsStream(String path)允许您访问类路径中的文件,只需传递用斜线替换点的路径,例如:
getClass().getResourceAsStream("/yourpackage/YourExcelFile.xsl");
将为您提供文件 YourExcelFile.xsl 的InputStream,该文件位于包 yourpackage 中。
我尽力向您解释此问题,但如果您有疑问,可以查看method documentation。