java读取excel文件(.xls,xlsx,csv)

时间:2022-05-18 14:03:39

前提,maven工程通过poi读写excel文件,需要在pom.xml中配置依赖关系:

在<dependencies>中添加如下代码

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

1,页面标签及属性

input[type="button"]{background-color: #71BCF3;color: white;}
<form name="form" id="form" method="post" enctype="multipart/form-data">
     <input type="file" name="upload" id="upload"style="display: none;"
         onchange="document.form.path.value=this.value" multiple="multiple" accept=".xls,.xlsx,.csv" />
     <input name="path" id="path" readonly>
     <input type="button" value="医路通数据文件上传" onclick="document.form.upload.click()">
</form>
<input type="button" value="确定" onclick="readFile()">
function readFile(){

    var f = document.getElementById("form");
    f.action = "<%=request.getContextPath()%>/mcp/MedicalDate/readExls.action?";
    f.submit();  
}

特别注意 : (一),提交文件标签的数据,一定要用form的action提交,否则有数据缺失 (二),form标签中,必须要有 enctype="multipart/form-data"

2,后台用@RequestParam(value = "upload") MultipartFile upload接文件数据

    @RequestMapping("/readExls")
    public ModelAndView readExls(HttpServletRequest request, HttpServletResponse response, 
            @RequestParam(value = "upload") MultipartFile upload) throws IOException
    {

        String oldFile = upload.getOriginalFilename();
        String suffix = oldFile.substring(oldFile.lastIndexOf("."));

        log.info("oldFile:"+oldFile);//文件名
        log.info("suffix:"+suffix);//文件后缀
        
        InputStream inStream = upload.getInputStream();//文件流,可直接用
}    

3,解析xls后缀文件将数据转换成为List<MedicalWhiteListVO>,以便对数据操作

 public List<MedicalWhiteListVO> readXls(InputStream inStream) throws IOException
    {
        
        InputStream is = inStream;
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
        
        List<MedicalWhiteListVO> medicalWhiteListVOs = new ArrayList<MedicalWhiteListVO>();
        MedicalWhiteListVO medicalvo = null;
        
        // Read the Sheet
        HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(0);
            
        if (hssfSheet == null) {
            //continue;
            return medicalWhiteListVOs;
        }
        
        int lastRowNum = hssfSheet.getLastRowNum();
        
        // Read the Row
        for (int rowNum = 1; rowNum <= lastRowNum; rowNum++) {
            
            HSSFRow hssfRow = hssfSheet.getRow(rowNum);
            
            if (hssfRow != null) {
                medicalvo = new MedicalWhiteListVO();
                
                HSSFCell holderMobile = hssfRow.getCell(0);
                HSSFCell holderRealName = hssfRow.getCell(1);
                
                HSSFCell holderBirthday = hssfRow.getCell(2);
                HSSFCell policyApplyDate = hssfRow.getCell(3);
                
                medicalvo.setHolderMobile(getValue(holderMobile));
                medicalvo.setHolderRealName(getValue(holderRealName));
            
                try
                {
                    medicalvo.setHolderBirthday(getDate(getValue(holderBirthday)));
                    medicalvo.setPolicyApplyDate(getDate(getValue(policyApplyDate)));
                } catch (Exception e)
                {
                    e.printStackTrace();
                    log.info("**日期格式转换异常*2222***");
                }
                
                medicalWhiteListVOs.add(medicalvo);
            }
        }
        return medicalWhiteListVOs;
    }
    public static Date getDate(String date) throws Exception{
            
            Pattern pattern = Pattern.compile("^[0-9]*$");  
            Matcher matcher = pattern.matcher(date);  
            //判断是否可以转换成日期
            if(StringUtils.isNullOrEmpty(date) || !matcher.matches()){
                Date defaultDate = DateUtils.parse("1900-01-01");
                System.out.println(DateUtils.format(defaultDate));
                return defaultDate;
            }  
            
            Double str = Double.valueOf(date);
            
            int numday = (int) Math.round(str);
            
            Calendar d = Calendar.getInstance();  
            d.set(1900, 0, 1);
            d.add(Calendar.DAY_OF_MONTH,numday);
            
            int year = d.get(Calendar.YEAR);
            int month = d.get(Calendar.MONTH) + 1;
            int day = d.get(Calendar.DAY_OF_MONTH)-2;
            
            String dateStr = year+"-"+month+"-"+day;
            
            Date newDate = DateUtils.parse(dateStr);
            
            System.out.println(DateUtils.format(newDate));
            
            return newDate;
        }
    private static String getValue(HSSFCell hssfCell) {
        
        if(hssfCell==null){
            return "";
        }
        
        if (hssfCell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
            return String.valueOf(hssfCell.getBooleanCellValue());
        } else if (hssfCell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
            return String.valueOf((int)hssfCell.getNumericCellValue());
        }else {
            return String.valueOf(hssfCell.getStringCellValue()==null?"":hssfCell.getStringCellValue());
        }
    }

4,解析xlsx后缀文件将数据转换成功List<MedicalWhiteListVO>,以便对数据操作

   public static List<MedicalWhiteListVO> readXlsx(InputStream inStream) throws IOException
    {
        //InputStream is = new FileInputStream(path);
        
        InputStream is = inStream;
        
        XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
        
        List<MedicalWhiteListVO> medicalWhiteListVOs = new ArrayList<MedicalWhiteListVO>();
        MedicalWhiteListVO medicalvo = null;
        
        // Read the Sheet
        XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0);
            
        if (xssfSheet == null) {
            return medicalWhiteListVOs;
        }
        
        // Read the Row
        for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
            
            XSSFRow xssfRow = xssfSheet.getRow(rowNum);
            
            if (xssfRow != null) {
                medicalvo = new MedicalWhiteListVO();
                
                XSSFCell holderMobile = xssfRow.getCell(0);
                XSSFCell holderRealName = xssfRow.getCell(1);
                XSSFCell holderBirthday = xssfRow.getCell(2);
                XSSFCell policyApplyDate = xssfRow.getCell(3);
            
                
                medicalvo.setHolderMobile(getValue(holderMobile));
                medicalvo.setHolderRealName(getValue(holderRealName));

                try
                {
                    medicalvo.setHolderBirthday(getDate(getValue(holderBirthday)));
                    medicalvo.setPolicyApplyDate(getDate(getValue(policyApplyDate)));
                } catch (Exception e)
                {
                    e.printStackTrace();
                    log.info("**日期格式转换异常*2***");
                }
                medicalWhiteListVOs.add(medicalvo);
            }
        }
        
        return medicalWhiteListVOs;
    }
    private static String getValue(XSSFCell xssfRow) {
        if(xssfRow==null){
            return "";
        }
        if (xssfRow.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
            return String.valueOf(xssfRow.getBooleanCellValue());
        } else if (xssfRow.getCellType() == Cell.CELL_TYPE_NUMERIC) {
            return String.valueOf((int)xssfRow.getNumericCellValue());
        }else {
            return String.valueOf(xssfRow.getStringCellValue()==null?"":xssfRow.getStringCellValue());
        }
    }
    public static Date getDate(String date) throws Exception{
        
        Pattern pattern = Pattern.compile("^[0-9]*$");  
        Matcher matcher = pattern.matcher(date);  
        //判断是否可以转换成日期
        if(StringUtils.isNullOrEmpty(date) || !matcher.matches()){
            Date defaultDate = DateUtils.parse("1900-01-01");
            System.out.println(DateUtils.format(defaultDate));
            return defaultDate;
        }  
        
        Double str = Double.valueOf(date);
        
        int numday = (int) Math.round(str);
        
        Calendar d = Calendar.getInstance();  
        d.set(1900, 0, 1);
        d.add(Calendar.DAY_OF_MONTH,numday);
        
        int year = d.get(Calendar.YEAR);
        int month = d.get(Calendar.MONTH) + 1;
        int day = d.get(Calendar.DAY_OF_MONTH)-2;
        
        String dateStr = year+"-"+month+"-"+day;
        
        Date newDate = DateUtils.parse(dateStr);
        
        System.out.println(DateUtils.format(newDate));
        
        return newDate;
    }

4,解析csv后缀文件将数据转换成功List<MedicalWhiteListVO>,以便对数据操作

public static List<MedicalWhiteListVO> readCsv(InputStream inStream) throws IOException
    {
        List<MedicalWhiteListVO> medicalWhiteListVOs = new ArrayList<MedicalWhiteListVO>();
        MedicalWhiteListVO medicalvo = null;
        
         try {    
             //BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(path),"GBK"));
             
             BufferedReader reader=new BufferedReader(new InputStreamReader(inStream,"GBK"));
                //换成你的文件名   
                
             reader.readLine();//第一行信息,为标题信息,不用,如果需要,注释掉   
            String line = null; 
            int num = 0;
            while((line=reader.readLine())!=null){ 
                num ++;
                String item[] = line.split(",");//CSV格式文件为逗号分隔符文件,这里根据逗号切分  
                
                medicalvo = new MedicalWhiteListVO();
                
                medicalvo.setHolderMobile(getValue(item,0));
                medicalvo.setHolderRealName(getValue(item,1));
                medicalvo.setHolderBirthday(getCsvDate(getValue(item,2)));
                medicalvo.setPolicyApplyDate(getCsvDate(getValue(item,3)));
                medicalWhiteListVOs.add(medicalvo);
                
            } 
            
            Log.info("**一共行数**:"+num);
                
        } catch (Exception e) {    
            e.printStackTrace();    
        }    
    
        return medicalWhiteListVOs;
    }
    public static String getValue(String[] item,int index){
            
            if(item.length > index){
                String value = item[index];
                return value;
            }
            return "";
        }
    public static Date getCsvDate(String item) throws Exception{
        
        if(item.indexOf("/") > 0){
            item = item.replaceAll("/", "-");
        }else if(item.indexOf("年") > 0){
            item = item.replaceAll("年", "-").replaceAll("月", "-").replaceAll("日","");
        }
        
        Date birth = DateUtils.parse(item);
        Date defaultDate = DateUtils.parse("1900-01-01");
        
        if(birth.getTime() <= defaultDate.getTime()){
            return defaultDate;
        }
        return birth;
    }

注意java通过poi编写excel文件,需要工程共引入的jar有:

dom4j-1.6.1.jar

poi-3.9.jar

poi-ooxml-3.9.jar

poi-ooxml-schemas-3.9.jar

xmlbeans-2.3.0.jar

xml-resolver-1.2.jar

xmlschema-core-2.0.2.jar

xstream-1.3.1.jar

 

 

this is all over,i hope it helpful for you ,3q~