使用ocupload和POI一键上传Excel并解析导入数据库

来源:互联网 发布:c语言char范围 编辑:程序博客网 时间:2024/05/21 10:16

使用的工具如下:

     JQuery ocupload    jquery.ocupload-1.1.2.js

     Apache POI       poi-3.9.jar           

     如果是Maven项目添加依赖如下:

 <dependency>            <groupId>org.apache.poi</groupId>            <artifactId>poi</artifactId>            <version>3.9</version>    </dependency>  


JQuery ocupload:

首先要使用一键上传要在从项目中引用js(地址在上面)

官方的上传例子:

复制代码
$(element).upload({                name: 'file',//上传组件的name属性,即<input type='file' name='file'/>                action: '',//向服务器请求的路径                enctype: 'multipart/form-data',//mime类型,默认即可                params: {},//请求时额外传递的参数,默认为空                autoSubmit: true,//是否自动提交,即当选择了文件,自动关闭了选择窗口后,是否自动提交请求。                onSubmit: function() {},//提交表单之前触发事件                onComplete: function() {},//提交表单完成后触发的事件                onSelect: function() {}//当用户选择了一个文件后触发事件        });
复制代码


开发代码:

1.自定义一个按钮

<button type="button" id="uploadExcel"><i>&nbsp;上传Excel</i></button>
 

我的项目使用的bootstrap有需要的可以参考下其中的样式,用其他UI的可以忽略

<button type="button" id="uploadExcel" class="btn btn-primary disabled" data-btn-type="selectIcon">         <i class="fa fa-mail-forward">&nbsp;上传Excel-(西药)</i></button>

2.上传文件的js代码

复制代码
//调用OCUpload插件的方法    $("#uploadExcel").upload({        action:basePath+"/excel/upload/WesternMedicine", //表单提交的地址        name:"myFile",        onComplete:function (data) { //提交表单之后           if(data == "0"){                $("#myModal").modal(); //提示框,Excel导入成功            }else{                $("#myModal2").modal(); //提示框,Excel导入成失败            }        },        onSelect: function() {//当用户选择了一个文件后触发事件            //当选择了文件后,关闭自动提交            this.autoSubmit=false;            //校验上传的文件名是否满足后缀为.xls或.xlsx            var regex =/^.*\.(?:xls|xlsx)$/i;            //this.filename()返回当前选择的文件名称 (ps:我使用这个方法没好使,自己写了一个获取文件的名的方法) $("[name = '"+this.name()+"']").val())            //alert(this.filename());            if(regex.test($("[name = '"+this.name()+"']").val())){                //通过校验                this.submit();            }else{                //未通过                $("#myModal3").modal(); //错误提示框,文件格式不正确,必须以.xls或.xlsx结尾            }        }    });
复制代码

3.使用POI上传的后台代码:
 先建立一个class POIUtil 放便使用:本人写了一个,但是在查询资料时候,发现一个更全面的POIUtil便copy下来如下:

 出处:java使用POI实现excel文件的读取,兼容后缀名xls和xlsx

 Class POIUtil :

复制代码
import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import org.apache.log4j.Logger;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.xssf.usermodel.XSSFWorkbook;import org.springframework.web.multipart.MultipartFile;/** * excel读写工具类 * Excel 导入到mysql * Created by CR7 on 2017-3-8 */public class POIUtil {        private static Logger logger  = Logger.getLogger(POIUtil.class);        private final static String xls = "xls";        private final static String xlsx = "xlsx";        /**         * 读入excel文件,解析后返回         * @param file         * @throws IOException         */        public static List<String[]> readExcel(MultipartFile file) throws IOException{            //检查文件            checkFile(file);            //获得Workbook工作薄对象            Workbook workbook = getWorkBook(file);            //创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回            List<String[]> list = new ArrayList<String[]>();            if(workbook != null){                for(int sheetNum = 0;sheetNum < workbook.getNumberOfSheets();sheetNum++){                    //获得当前sheet工作表                    Sheet sheet = workbook.getSheetAt(sheetNum);                    if(sheet == null){                        continue;                    }                    //获得当前sheet的开始行                    int firstRowNum  = sheet.getFirstRowNum();                    //获得当前sheet的结束行                    int lastRowNum = sheet.getLastRowNum();                    //循环除了第一行的所有行                    for(int rowNum = firstRowNum+1;rowNum <= lastRowNum;rowNum++){                        //获得当前行                        Row row = sheet.getRow(rowNum);                        if(row == null){                            continue;                        }                        //获得当前行的开始列                        int firstCellNum = row.getFirstCellNum();                        //获得当前行的列数                        int lastCellNum = row.getPhysicalNumberOfCells();                        String[] cells = new String[row.getPhysicalNumberOfCells()];                        //循环当前行                        for(int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++){                            Cell cell = row.getCell(cellNum);                            cells[cellNum] = getCellValue(cell);                        }                        list.add(cells);                    }                }               // workbook.close();            }            return list;        }        public static void checkFile(MultipartFile file) throws IOException{            //判断文件是否存在            if(null == file){                logger.error("文件不存在!");                throw new FileNotFoundException("文件不存在!");            }            //获得文件名            String fileName = file.getOriginalFilename();            //判断文件是否是excel文件            if(!fileName.endsWith(xls) && !fileName.endsWith(xlsx)){                logger.error(fileName + "不是excel文件");                throw new IOException(fileName + "不是excel文件");            }        }        public static Workbook getWorkBook(MultipartFile file) {            //获得文件名            String fileName = file.getOriginalFilename();            //创建Workbook工作薄对象,表示整个excel            Workbook workbook = null;            try {                //获取excel文件的io流                InputStream is = file.getInputStream();                //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象                if(fileName.endsWith(xls)){                    //2003                    workbook = new HSSFWorkbook(is);                }else if(fileName.endsWith(xlsx)){                    //2007 及2007以上                    workbook = new XSSFWorkbook(is);                }            } catch (IOException e) {                logger.info(e.getMessage());            }            return workbook;        }        public static String getCellValue(Cell cell){            String cellValue = "";            if(cell == null){                return cellValue;            }            //把数字当成String来读,避免出现1读成1.0的情况            if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){                cell.setCellType(Cell.CELL_TYPE_STRING);            }            //判断数据的类型            switch (cell.getCellType()){                case Cell.CELL_TYPE_NUMERIC: //数字                    cellValue = String.valueOf(cell.getNumericCellValue());                    break;                case Cell.CELL_TYPE_STRING: //字符串                    cellValue = String.valueOf(cell.getStringCellValue());                    break;                case Cell.CELL_TYPE_BOOLEAN: //Boolean                    cellValue = String.valueOf(cell.getBooleanCellValue());                    break;                case Cell.CELL_TYPE_FORMULA: //公式                    cellValue = String.valueOf(cell.getCellFormula());                    break;                case Cell.CELL_TYPE_BLANK: //空值                    cellValue = "";                    break;                case Cell.CELL_TYPE_ERROR: //故障                    cellValue = "非法字符";                    break;                default:                    cellValue = "未知类型";                    break;            }            return cellValue;        }    }
复制代码


后台代码:使用的是SpringMVC 和Spring 和Hibernate

controller:

复制代码
 // 上传西药    @RequestMapping(method = RequestMethod.POST ,value="/upload/WesternMedicine")    @ResponseBody    private String uploadWesternMedicine(MultipartFile myFile) throws IOException {        String flag ="0";        try{            List<String[]> list = POIUtil.readExcel(myFile); //这里得到的是一个集合,里面的每一个元素是String[]数组            excelService.saveBath(list); //service实现方法             } catch(Exception e){           flag = "1";        }        return flag;    }
复制代码

serviceImpl:思路就是遍历数据得到每一个String[],也就是类,然后保存(其中数字转换时候可能有一些问题,下面有解决方法)

复制代码
 @Override    public void saveBath(List<String[]> list) {        for (String[] strings : list) {            Drug drug = new Drug();            drug.setName(strings[0]);            drug.setSpecification(strings[1]);            drug.setUnit(strings[2]);            //drug.setPrice(strings[3]);  //这种方法会导致价格出现如下数字:16.399999999999999  77.900000000000006            BigDecimal bd = new BigDecimal(strings[3]);            bd = bd.setScale(1,BigDecimal.ROUND_HALF_UP);            String price = bd.toString();            if("0".equals(price.substring(price.length()-1))){ //如果最后一位是0  如 26.0元  33.0元 就把 .0 删除                String newPrice = price.substring(0, price.length()-2);                drug.setPrice(newPrice);            }else{                drug.setPrice(price);            }            drug.setStatus("0");            drug.setDrug_classify("8afa9409591f762b01591ffa62ff0006");            this.save(drug);        }    }
复制代码


上传成功:

截图如下:

 

 


阅读全文
0 0
原创粉丝点击