基础工作要导入commons.fileupload.jar、commons.io-1.4.0.jar、jxl.jar
前台传入一个excel文件,后台在不向服务器保存excel文件的情况下,对excel进行解析,并处理其中数据
前台页面:
<form id="searchForm" method="post" action="/importProd" enctype="multipart/form-data">
<div class="import">
<p>
<a href="javascript:void(0)" onclick="temple()">产品模板</a>
<input type="file" name="importExcel" id="importExcel" value="浏览" class="validate[required]">
<p>
<p style="margin-top:40px">
<button type="submit" class="btn btn-success">导入</button>
</p>
</div>
</form>
后台接受并处理:
a.后台接收的controller签名中使用@RequestParam标签来接收参数,用一个元素类型为MultipartFile类型的数组来接收
b.参数名称与前台页面input标签name名称一致
@RequestMapping(value = "/importProd",produces = "text/plain;charset=UTF-8")
@ResponseBody
public String importProd(@RequestParam MultipartFile[] importExcel,MultipartHttpServletRequest request,HttpServletResponse response) {
String validateMsg = "";
try {
if (importExcel != null && importExcel.length > 0) {
for (int i = 0; i < importExcel.length; i++) {//循环上传的文件
MultipartFile file = importExcel[i];
// 保存文件
InputStream is = file.getInputStream();//将上传的文件直接写入InputStream输入流,不进行服务器保存操作
List<String> list = productListService.saveProd(is,params);//params为controller中定义的一个接收请求参数的全局变量
}
}
//String path = Global.getConfig("REFER_UPLOAD_ADDRESS");
response.setHeader("Content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.getWriter().write("产品导入完成");
response.getWriter().flush();
return null;
} catch (Exception e) {
e.printStackTrace();
try {
response.getWriter().write("产品导入失败,请检查是否已经导入.");
response.getWriter().flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
return null;
}
public String saveProd(InputStream is,Map<String,String> params){
Workbook wb = null;
try {
wb = Workbook.getWorkbook(is);//通过InputStream输入流来获得excel文件
Sheet sheet = wb.getSheet(0);//wb.getSheet(n)为获取excel中的第几个sheet页,当有过个sheet页时需循环获取
List<String> list = new ArrayList<String>();
if(sheet!=null){
for (int i = 2; i < 10; i++) {
Cell[] cells = sheet.getRow(i);
list.add(cells[2].getContents());//取每行的第三个值
}
}
return list;
总结读取解析excel原理:
1、通过input标签上传excel文件,标签type=“file”,标签所在的form表单增加一个enctype=”multi-part/form-data”属性
2、后台controller使用@RequestParam标签来接收前台传来的文件请求,封装在与前台input标签name属性同名的请求参数中
3、由于未向服务器中做文件的存储操作,则直接利用file.getInpuStream()来获得输入流
4、从输入流中利用Workbook.getWorkbook(is)获取excel对象
5、分析excel对象:
一个excel对象包含n个sheet页,一个sheet包含n行记录,一行记录包含n个字段,
所以,特殊情况下,想解析获得字段值,需进行多层多层for循环嵌套
6、a、获取Excel对象
Workbook wb = Workbok.getWorkbook(is);
b、获取Excel中的sheet页
Sheet sheet = wb.getSheet(0);//下标为0时,获取第一个sheet页
c、获取某sheet页中的行
Cell[] cells = sheet.getRow(0);//下标为0时,获取sheet页的第一行
d、获取某行的第中的字段
cells[0].getContents();