从前台Jsp页面传到后台Servlet处理
公司正好需要实现一个功能,前台选中Excel文件解析处理,使用poi解析Excel。
如果直接用读取本地路径的方法是不可行的,因为代码发布在服务器上,服务器上并没有这个文件,所以用uploadfile先上传Excel(复制一份文件在服务器上),再读取解析Excel文件。
最后效果如下图:
需要导入jar包:
commons-fileupload-1.2.1.jar
poi-3.7.jar
poi-ooxml-3.7-20101029.jar
poi-ooxml-schemas-3.7-20101029.jar
dom4j-1.6.1.jar
xmlbeans-2.3.0.jar
JSP页面代码:
<form action ="指向Servlet处理" method="POST" ENCTYPE="multipart/form-data">
<table>
<tr>
<td>
<input size="40" type="file">
</td>
</tr>
</table>
<br/>
<table>
<tr>
<td>
<td style="width:100%" align="center"><input type="submit" value="开始上传"/>
</td>
</tr>
</table>
</form>
Servlet后台代码:
//上传Excel到服务器的方法
public static String fileUpload(HttpServletRequest request,HttpServletResponse response)throws Exception
{
//允许上传的文件类型
String fileType = "xls,xlsx";
//允许上传的文件最大大小(100M,单位为byte)
int maxSize = 1024*1024*100;
response.addHeader("Access-Control-Allow-Origin", "*");
//文件要保存的路径
String savePath = request.getRealPath("/") +"deletingShopOrders/";
response.setContentType("text/html; charset=UTF-8");
//检查目录
File uploadDir = new File(savePath);
if ( !uploadDir.exists())
{
uploadDir.mkdirs();
}
if ( !uploadDir.canWrite())
{
return "上传目录没有写权限!";
}
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置缓冲区大小,这里是1M
factory.setSizeThreshold(1024 * 1024);
//设置缓冲区目录
factory.setRepository(uploadDir);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
List<FileItem>items = upload.parseRequest(request);
Iterator<FileItem> it = items.iterator();
FileItem item = null;
String fileName = "";
String name = "";
String extName = "";
String newFileName = "";
while (it.hasNext())
{
item = (FileItem)it.next();
fileName = item.getName();
if (null == fileName || "".equals(fileName))
{
continue;
}
//判断文件大小是否超限
if (item.getSize() > maxSize)
{
item.delete();
JOptionPane.showMessageDialog(null, "文件大小超过限制!应小于" + maxSize/ 1024 / 1024 + "M");
return "文件大小超过限制!应小于" + maxSize;
}
//获取文件名称
name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.lastIndexOf("."));
//获取文件后缀名
extName = fileName.substring(fileName.indexOf(".") + 1).toLowerCase().trim();
//判断是否为允许上传的文件类型
if ( !Arrays.<String> asList(fileType.split(",")).contains(extName))
{
item.delete();
return "文件类型不正确,必须为" + fileType + "的文件!";
}
newFileName = name + "." + extName;
File uploadedFile = new File(savePath, newFileName);
item.write(uploadedFile);
//在这里添加读取Excel的方法来根据路径读取Excel内容
uploadedFile.delete();
}
return "success";
}
//读取Excel,获取Excel的文本和数字格式的内容,可根据需要修改
public static List<String> readExcel(String filePath){
List<String> list = new ArrayList<String>();
//判断是否是excel2007格式
boolean isE2007 = false;
if(filePath.endsWith("xlsx"))
isE2007 = true;
try {
//建立输入流
InputStream input = new FileInputStream(filePath);
Workbook wb = null;
//根据文件格式(2003或者2007)来初始化
if(isE2007)
wb = new XSSFWorkbook(input);
else
wb = new HSSFWorkbook(input);
//获得第一个表单
Sheet sheet = wb.getSheetAt(0);
//获得第一个表单的迭代器
Iterator<Row> rows = sheet.rowIterator();
while (rows.hasNext()) {
//获得行数据
Row row = rows.next();
//获得第一行的迭代器
Iterator<Cell> cells = row.cellIterator();
while (cells.hasNext()) {
Cell cell = cells.next();
//根据cell中的类型来输出数据
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC:
list.add(String.valueOf(new BigDecimal(cell.getNumericCellValue())));
break;
case HSSFCell.CELL_TYPE_STRING:
list.add(cell.getStringCellValue());
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
break;
case HSSFCell.CELL_TYPE_FORMULA:
break;
}
}
}
input.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return list;
}