excel导入与导出(markdown版本)

前段时间要做一个excel表格的上传下载功能,上网找了各种资料及源码,最后借用别人的代码及思路完成了符合自己需求的代码,总结一下excel的上传下载实质是通过第三方的类库比如poi,jxl等对excel单元格的设置与读写,通过类库的api,你可以发现各种各样的操作excel的方法,基本上只要你能在office的excel上进行的基本操作通过代码都能实现。

上传文件:

首先新建一个工具类,我命名为ImportExcelUtil,代码如下:

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;  
    }  
}

这个工具类是支持2003和2007的,excel2003和2007所用到的包是不一样的,所以如何你的工程师maven构建的话需要在pom.xml上引入下面两个包:

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->  
<dependency>  
    <groupId>org.apache.poi</groupId>  
    <artifactId>poi</artifactId>  
    <version>3.14</version>  
</dependency>  
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->  
<dependency>  
    <groupId>org.apache.poi</groupId>  
    <artifactId>poi-ooxml</artifactId>  
    <version>3.14</version>  
</dependency>  

工具类写好以后,接下来就可以在具体业务逻辑实现方法里调用了,我这边有个上传的controller

public class UploadExcelControl {  
    @Autowired  
    DetailInfoVoService detailInfoVoService;  
    /** 
     * 描述:通过传统方式form表单提交方式导入excel文件 
     * @param request 
     * @throws Exception 
     */  
    @RequestMapping(value="upload.do",method={RequestMethod.GET,RequestMethod.POST})  
    public  String  uploadExcel(HttpServletRequest request) throws Exception {  
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;    
        System.out.println("通过传统方式form表单提交方式导入excel文件!");  

        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());  
        in.close();  
        //因为要导入的excel比较特殊,不是常规的一行类别,其他行都是数据,所以我需要根据具体模板来读取excel  
        for (int i = 0; i < listob.size(); i+=11) {  
            DetailInfoVo vo = new DetailInfoVo();  
            vo.setSiteId(String .valueOf(listob.get(i).get(1)));  
            vo.setSiteName(String.valueOf(listob.get(i).get(3)));  
            vo.setSitePhone(String.valueOf(listob.get(i).get(5)));  
            vo.setSiteAddress(String.valueOf(listob.get(i+1).get(1)));  
            vo.setIsOpened(String.valueOf(listob.get(i+1).get(5)));  
            vo.setSiteClass(String.valueOf(listob.get(i+2).get(1)).split(",")[0]);  
            vo.setSiteScale(String.valueOf(listob.get(i+2).get(1)).split(",")[1]);  
            vo.setSiteDetail(String.valueOf(listob.get(i+3).get(0)));  
            vo.setIsPartnership(String.valueOf(listob.get(i+4).get(1)));  
            vo.setReason(String.valueOf(listob.get(i+5).get(0)));  
            vo.setBossName(String.valueOf(listob.get(i+7).get(1)));  
            vo.setBossAge(String.valueOf(listob.get(i+7).get(3)));  
            vo.setBossJiguan(String.valueOf(listob.get(i+7).get(5)));  
            vo.setBossYear(String.valueOf(listob.get(i+8).get(1)));  
            vo.setBossPeople(String.valueOf(listob.get(i+8).get(3)));  
            vo.setOthers(String.valueOf(listob.get(i+9).get(1)));  
            vo.setEventLog(String.valueOf(listob.get(i+10).get(0)));  
            int resultCode=detailInfoVoService.insert(vo);  
            if(resultCode!=0){  
                System.out.println("=======");  
            }  
        }  
        return "result";  
    }  
}  

前台使用的是form表单提交的方式,首先在jsp页面定义一个form,action指向对应的controller

<form class="form-inline clearfix " method="POST" enctype="multipart/form-data" id="form1" action="../uploadExcel/upload.do">  
          <div class="row">  
            <div class="form-group col-xs-12">  
              <label class="fl">上传文件: </label>  
              <input type="file" class="form-control" id="upfile" name="upfile">  
            </div>  
       </div>  
</form>  

上传的内容就介绍完了,相比上传,下载更加容易。

导出excel:

新建一个工具类ExportExcelUtil:

public class ExportExcelUtil {  

    /** 
     * 描述:根据文件路径获取项目中的文件 
     * @param fileDir 文件路径 
     * @return 
     * @throws Exception 
     */  
    public  File getExcelDemoFile(String fileDir) throws Exception{  
        String classDir = null;  
        String fileBaseDir = null;  
        File file = null;  
        classDir = Thread.currentThread().getContextClassLoader().getResource("/").getPath();  
        fileBaseDir = classDir.substring(0, classDir.lastIndexOf("classes"));  

        file = new File(fileBaseDir+fileDir);  
        if(!file.exists()){  
            throw new Exception("模板文件不存在!");  
        }  
        return file;  
    }  

    public  Workbook writeNewExcel(File file,String sheetName,List<DetailInfoVo> lis) throws Exception{  
        Workbook wb = null;  
        Row row = null;   
        Cell cell = null;  

        FileInputStream fis = new FileInputStream(file);  
        wb = new ImportExcelUtil().getWorkbook(fis, file.getName());    //获取工作薄  
        Sheet sheet = wb.getSheet(sheetName);  

        //循环插入数据  
        int lastRow = sheet.getLastRowNum()+1;    //插入数据的数据ROW  
        CellStyle cs = setSimpleCellStyle(wb);    //Excel单元格样式  
        for (int i = 0; i < lis.size(); i++) {  
            row = sheet.createRow(lastRow+i); //创建新的ROW,用于数据插入  

            //按项目实际需求,在该处将对象数据插入到Excel中  
            DetailInfoVo vo  = lis.get(i);  
            if(null==vo){  
                break;  
            }  
            //Cell赋值开始  
            cell = row.createCell(0);  
            cell.setCellValue(vo.getSiteId());  
            cell.setCellStyle(cs);  

            cell = row.createCell(1);  
            cell.setCellValue(vo.getSiteName());  
            cell.setCellStyle(cs);  

            cell = row.createCell(2);  
            cell.setCellValue(vo.getSiteAddress());  
            cell.setCellStyle(cs);  

            cell = row.createCell(3);  
            cell.setCellValue(vo.getSiteClass());  
            cell.setCellStyle(cs);  

            cell = row.createCell(4);  
            cell.setCellValue(vo.getSiteScale());  
            cell.setCellStyle(cs);  

            cell = row.createCell(5);  
            cell.setCellValue(vo.getIsPartnership());  
            cell.setCellStyle(cs);  

            cell = row.createCell(6);  
            cell.setCellValue(vo.getSitePhone());  
            cell.setCellStyle(cs);  

            cell = row.createCell(7);  
            cell.setCellValue(vo.getIsOpened());  
            cell.setCellStyle(cs);  
        }  
        return wb;  
    }  

    /** 
     * 描述:设置简单的Cell样式 
     * @return 
     */  
    public  CellStyle setSimpleCellStyle(Workbook wb){  
        CellStyle cs = wb.createCellStyle();  

        cs.setBorderBottom(CellStyle.BORDER_THIN); //下边框  
        cs.setBorderLeft(CellStyle.BORDER_THIN);//左边框  
        cs.setBorderTop(CellStyle.BORDER_THIN);//上边框  
        cs.setBorderRight(CellStyle.BORDER_THIN);//右边框  

        cs.setAlignment(CellStyle.ALIGN_CENTER); // 居中  

        return cs;  
    }  

}  

具体的实现类如下

public class ExportExcelControl {  
    @Autowired  
    DetailInfoVoService detailInfoVoService;  
    /** 
     * 描述:导出Excel 
     * @param request 
     * @param response 
     * @throws Exception 
     */  
    @RequestMapping(value="export.do",method={RequestMethod.GET,RequestMethod.POST})  
    public  String  exportExcel(HttpServletRequest request,HttpServletResponse response) throws Exception {  
        OutputStream os = null;    
        Workbook wb = null;    //工作薄  
        List<DetailInfoVo> list=detailInfoVoService.findList();  
        try {  
            List<DetailInfoVo> lo = new ArrayList<DetailInfoVo>();  
            for (int i = 0; i < list.size(); i++) {  
                //根据具体需求向excel即将导出的vo模型填充数据  
                DetailInfoVo vo = new DetailInfoVo();  
                vo.setSiteId(list.get(i).getSiteId());  
                vo.setSiteName(list.get(i).getSiteName());  
                vo.setSiteAddress(list.get(i).getSiteAddress());  
                vo.setSiteClass(list.get(i).getSiteClass());  
                vo.setSiteScale(list.get(i).getSiteScale());  
                vo.setIsPartnership(list.get(i).getIsPartnership());  
                vo.setSitePhone(list.get(i).getSitePhone());  
                vo.setIsOpened(list.get(i).getIsOpened());  
                lo.add(vo);  
            }  

            //导出Excel文件数据  
            ExportExcelUtil util = new ExportExcelUtil();  
            File file =util.getExcelDemoFile("/ExcelDemoFile/模板.xlsx");  
            String sheetName="sheet1";    
            wb = util.writeNewExcel(file, sheetName,lo);   

            String fileName="导出信息.xlsx";  
            response.setContentType("application/vnd.ms-excel");  
            response.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode(fileName, "utf-8"));  
            os = response.getOutputStream();  
            wb.write(os);    
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        finally{  
            os.flush();  
            os.close();  
            wb.close();  
        }   
        return null;  
    }  


}  

更详细的代码我就不贴了,主要是上传下载这个思路大家要理清,原理搞清楚了啥都会搞了,比如加特技,通过poi提供的api让你的excel更加炫酷。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaEasyExcel是一个开源的Java库,用于在Java应用程序中实现Excel文件的导入导出功能。它提供了简单易用的API,可以方便地操作Excel文件,并支持多种导入导出的类型。 通过使用JavaEasyExcel,开发人员可以轻松地导出Excel文件。例如,在一个Java方法中,可以使用@SystemLog注解指定导出日志明细的操作,然后调用EasyExcelUtils.export方法来导出数据。在这个方法中,可以通过传入具体的参数来获取需要导出的数据,然后将数据导出到指定的文件中。导出的文件名称可以根据需要自定义,通常可以采用当前时间作为文件名的一部分。 JavaEasyExcel还支持多种数据库,包括MySQL、Oracle、SqlServer、Postgresql、Clickhouse、Sqlite3、DB2等。这意味着您可以在不同的数据库上使用JavaEasyExcel导入导出数据。此外,JavaEasyExcel还支持多线程查询,可以提高导出速度。它还支持导出不同格式的文件,如Word、ExcelMarkdown、PDF等。总体而言,JavaEasyExcel提供了比其他导出工具更高效的导出功能。 在SpringBoot中集成JavaEasyExcel非常简单。您只需在项目的pom.xml文件中添加相应的依赖即可。例如,添加com.alibaba的easyexcel依赖,并指定相应的版本号。然后,您可以在SpringBoot应用程序的代码中使用JavaEasyExcel的API来导入导出Excel文件。 因此,通过使用JavaEasyExcel库,您可以轻松实现Java应用程序中的Excel文件导入导出功能,提高开发效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【JAVA】easyExcel导出导入使用](https://blog.csdn.net/qq_40110781/article/details/130319385)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [export是一款多线程生成数据库结构文档的开源springboot工程,能支持最新的数据库版本,支持导出多种格](https://download.csdn.net/download/weixin_41037490/88279202)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值