SMM项目上传Excel,通过流的形式

这里省略spring配置,就是简单的SMM配置

1.前端我用了一个网上找的esyUI的框架




在前端引入

<link rel="stylesheet" href="static/ace/css/font-awesome.min.css" />
<link rel="stylesheet" type="text/css"
	href="static/jquery-easyui-1.3.3/themes/default/easyui.css">
<link rel="stylesheet" type="text/css"
	href="static/jquery-easyui-1.3.3/themes/icon.css">
<style type=text/css><script type="text/javascript"
		src="static/jquery-easyui-1.3.3/jquery.min.js"></script>
	<script type="text/javascript"
		src="static/jquery-easyui-1.3.3/jquery.easyui.min.js"></script>
	<script type="text/javascript"
		src="static/jquery-easyui-1.3.3/locale/easyui-lang-zh_CN.js"></script>
按钮
<td><div><a href="javascript:void(0)" class="easyui-linkbutton"
														iconCls="icon-import " plain="true"
														onclick="openUploadFileDialog()">批量导入数据</a></div></td>
按钮弹窗 
 
<div id="dlg2" class="easyui-dialog"
						style="width: 400px; height: 180px; padding: 10px 20px"
						closed="true" buttons="#dlg-buttons2">
						<form id="uploadForm" action="readCaseNumber/sendCase.do" method="post" enctype="multipart/form-data">
							<table>
								<tr>
									<td>上传文件:</td>
									<td><input type="file" name="upfile"></td>
								</tr>
							</table>
						</form>
					</div>
					<div id="dlg-buttons2">
						<a href="javascript:void(0)" class="easyui-linkbutton"
							iconCls="icon-ok" onclick="uploadFile()">上传</a> <a
							href="javascript:void(0)" class="easyui-linkbutton"
							iconCls="icon-cancel"
							onclick="javascript:$('#dlg2').dialog('close')">关闭</a>
					</div>

漏了js代码

<script>
	function openUploadFileDialog(){
		$("#dlg2").dialog('open').dialog('setTitle','导入数据');
	}
	function uploadFile(){
		$("#uploadForm").form("submit",{
			success:function(result){
				var result=eval('('+result+')');
				if(result.errorMsg){
					$.messager.alert("系统提示",result.errorMsg);
				}else{
					$.messager.alert("系统提示","上传成功");
					$("#dlg2").dialog("close");
					$("#dg").datagrid("reload");
				}
			}
		});
	}


后端controller

@Controller
@RequestMapping(value = "/readCaseNumber")
public class ReadCaseNumber extends BaseController {
@RequestMapping(value = "/sendCase")
    @ResponseBody
	public String sendCase(HttpServletRequest request) throws Exception {System.out.println("开始上传文件");
		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		System.out.println("通过传统方式form表单提交方式导入excel文件!");
		CaseNm caseNm = new CaseNm();
		List<String> caseNumbers = caseNm.upload(multipartRequest);
上面 就是获取前端请求的注解
MultipartHttpServletRequest 可以网上查一下

我的业务是获取Excel表格第一sheet页的第一列的数据,返回第一行数据的数组的工具类

public List<String> upload(MultipartHttpServletRequest multipartRequest) throws Exception {


		InputStream in = null;
		List<List<Object>> listob = null;
		MultipartFile file = multipartRequest.getFile("upfile");
		if (file.isEmpty()) {
			throw new Exception("文件不存在!");
		}
		in = file.getInputStream();
		listob = new ImportExcelUtil().getBankListByExcel(in, file.getOriginalFilename());
		// 因为要导入的excel比较特殊,不是常规的一行类别,其他行都是数据,所以我需要根据具体模板来读取excel
		List<String> list = new ArrayList<>();
		for (int i = 0; i < listob.size(); i++) {
			DetailInfoVo vo = new DetailInfoVo();
			List<Object> list2 = listob.get(i);
			//vo.setCaseNm(String.valueOf(listob.get(i).get(1)));
			System.out.println(list2.toString());
			list.add((String)list2.get(0));
		}
		System.out.println(list.toString());
		in.close();
		return list;
	}
 
 






 
 

验证Excel是2003的xls还是2007的xlsx工具类

public class ImportExcelUtil {
    
    private final static String excel2003L =".xls";    //2003- 版本的excel
    private final static String excel2007U =".xlsx";   //2007+ 版本的excel
    
    /**
     * 描述:获取IO流中的数据,组装成List<List<Object>>对象
     * @param in,fileName
     * @return
     * @throws IOException 
     */
    public  List<List<Object>> getBankListByExcel(InputStream in,String fileName) throws Exception{
        List<List<Object>> list = null;
        
        //创建Excel工作薄
        Workbook work = this.getWorkbook(in,fileName);
        if(null == work){
            throw new Exception("创建Excel工作薄为空!");
        }
        Sheet sheet = null;
        Row row = null;
        Cell cell = null;
        
        list = new ArrayList<List<Object>>();
        //遍历Excel中所有的sheet
        int s=work.getNumberOfSheets();
        for (int i = 0; i < work.getNumberOfSheets(); i++) {
            sheet = work.getSheetAt(i);
            if(sheet==null){continue;}
            int s2=sheet.getLastRowNum();
            //遍历当前sheet中的所有行
            for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {
                row = sheet.getRow(j);
                if(row==null||row.getFirstCellNum()==j){continue;}
                
                //遍历所有的列
                List<Object> li = new ArrayList<Object>();
                for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
                    cell = row.getCell(y);
                    li.add(this.getCellValue(cell));
                }
                list.add(li);
            }
        }
        work.close();
        return list;
    }
    
    /**
     * 描述:根据文件后缀,自适应上传文件的版本 
     * @param inStr,fileName
     * @return
     * @throws Exception
     */
    public  Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{
        Workbook wb = null;
        String fileType = fileName.substring(fileName.lastIndexOf("."));
        if(excel2003L.equals(fileType)){
            wb = new HSSFWorkbook(inStr);  //2003-
        }else if(excel2007U.equals(fileType)){
            wb = new XSSFWorkbook(inStr);  //2007+
        }else{
            throw new Exception("解析的文件格式有误!");
        }
        return wb;
    }

    /**
     * 描述:对表格中数值进行格式化
     * @param cell
     * @return
     */
    public  Object getCellValue(Cell cell){
        Object value = null;
        DecimalFormat df = new DecimalFormat("0");  //格式化number String字符
        SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");  //日期格式化
        DecimalFormat df2 = new DecimalFormat("0.00");  //格式化数字
        
        switch (cell.getCellType()) {
        case Cell.CELL_TYPE_STRING:
            value = cell.getRichStringCellValue().getString();
            break;
        case Cell.CELL_TYPE_NUMERIC:
            if("General".equals(cell.getCellStyle().getDataFormatString())){
                value = df.format(cell.getNumericCellValue());
            }else if("m/d/yy".equals(cell.getCellStyle().getDataFormatString())){
                value = sdf.format(cell.getDateCellValue());
            }else{
                value = df2.format(cell.getNumericCellValue());
            }
            break;
        case Cell.CELL_TYPE_BOOLEAN:
            value = cell.getBooleanCellValue();
            break;
        case Cell.CELL_TYPE_BLANK:
            value = "";
            break;
        default:
            break;
        }
        return value;
    }


猜你喜欢

转载自blog.csdn.net/llxinlan/article/details/78921250
今日推荐