POI导入导出Excel

导入Excel:首先需要一个小小工具类,当然如果为了测试的话直接参考导入部分即可,下面上代码

提示:如果你的表格中后面的列有空值可能会导致poi读取出的最终列数和你表格中实际的列数不一致,例:你的表格中共有五列数据但是最后一列全部没有数据,当执行到---判断共有多少列:if(row==null||row.getFirstCellNum()==j){ continue;}---时poi可能会只读取出四列,然后会报错数组越界异常,这里小编的一个解决办法是:在表格最后一列的后面再添一列,全部赋一个值,这样poi就会读正确读取出表格中所有的列(这是小编自己想出来的笨方法,哈哈,具体解决办法在网上没有找到,如果有哪位知道如何用代码解决这个问题的话请评论在下方,小编想学习学习~感激不尽)

public class ExcelUtils {
    //先创建两个变量,为下面判断上传文件格式做准备
    private final static String excel2003 = ".xls";
    private final static String excel2007 = ".xlxs";

    //获取IO流中的数据,组装成List<List<Object>>对象
    public List<List<Object>> getExcel(InputStream in, String fileName) throws Exception{
        List<List<Object>> list = null;
        //创建Excel工作薄 
        Workbook wb = this.getWorkbook(in, fileName);
        if(wb == null){
            throw new Exception("创建Excel工作薄为空!");
        }
        Sheet sheet = null;
        Row row = null;
        Cell cell = null;
        list = new ArrayList<List<Object>>();
        //遍历Excel中所有的sheet
        for (int i = 0; i < wb.getNumberOfSheets(); i++) {
            sheet = wb.getSheetAt(i);
            if(sheet == null){
                continue;
            }
            //遍历当前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 k = row.getFirstCellNum(); k <row.getLastCellNum(); k++) {
                    cell = row.getCell(k);
                    if(cell==null || cell.getCellType() == Cell.CELL_TYPE_BLANK){
                        //此处有坑,如果你的表格中有空单元格,poi读取的结果是null,会导致程序报错,自主为其定义个值
                        li.add("");
                        continue;
                    }
                    li.add(this.getCellValue(cell));
                }
                list.add(li);
            }
        }
        return list;
    }

    //根据文件后缀判断上传文件版本
    public Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{
        Workbook wb = null;
        String fileType = fileName.substring(fileName.lastIndexOf("."));
        if(excel2003.equals(fileType)){
            wb = new HSSFWorkbook(inStr);
        }else if(excel2007.equals(fileType)){
            wb = new HSSFWorkbook(inStr);
        }else{
            throw new Exception("解析的文件格式有误!");
        }
        return wb;
    }

    //对表格中数据进行格式化
    public Object getCellValue(Cell cell){
        Object value = null;
        DecimalFormat df = new DecimalFormat("0");
        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;
    }
}

 前台代码就不写了,可以用form表单上传也可以用ajax上传,下面直接写controller代码

@RequestMapping("importExcel")
@ResponseBody
LaiuiUploadResult importHaha(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws Exception {
    if(file.isEmpty()){
        return new LaiuiUploadResult(1, "error");
    }
    InputStream in = file.getInputStream();
    List<List<Object>> list = new ExcelUtils().getExcel(in, file.getOriginalFilename());
    in.close();
    for (int i = 0; i < list .size(); i++) {
        List<Object> newList = list .get(i);
        Haha haha = new Haha();
        //此处将解析出来的数据set到你要保存的对象中,调用保存方法
        haha.setUserName(String.valueOf(newList.get(0)).trim());
        haha.setPassWord(String.valueOf(newList.get(1)).trim());
        Haha info = hahaService.save(haha);
    }
    return new LaiuiUploadResult(0, "ok");
}

 这里面的LaiuiUploadResult是事先已经封装好的一个实体类,用来返回信息

public class LaiuiUploadResult {
    public LaiuiUploadResult(int code, String msg){
	this.code = code;
	this.msg = msg;
    }
	
    private int code;
    private String msg;
    public int getCode() {
        return code;
    }
    public void setCode(int code) {
	this.code = code;
    }
    public String getMsg() {
	return msg;
    }
    public void setMsg(String msg) {
	this.msg = msg;
    }
}

导入数据完成,下面是导出数据到Excel~

导出Excel:下面上代码

public void exportExcel(HttpServletRequest request, String condition){
    //先查询要导出到表中的实体类
    List<Haha> list = hahaService.selectByCondition(condition);
    //创建webbook对象,对应Excel文件
    HSSFWorkbook wb = new HSSFWorkbook();
    //在webbook中添加一个sheet,对应Excel文件中的sheet
    HSSFSheet sheet = wb.createSheet("哈哈");
    //在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
    HSSFRow row = sheet.createRow(0);
    row.createCell(0).setCellValue("column1");
    row.createCell(1).setCellValue("column2");
    row.createCell(2).setCellValue("column3");
    row.createCell(3).setCellValue("column4");
    //循环向表格中插入数据
    for(int i = 0;i < list.size();i++){
    	row = sheet.createRow(i + 1);
    	row.createCell(0).setCellValue(list.get(i).getcolumn1());
 	row.createCell(1).setCellValue(list.get(i).getcolumn2());
	row.createCell(2).setCellValue(list.get(i).getcolumn3());
        row.createCell(3).setCellValue(list.get(i).getcolumn4());
    }
    try {
        //得到桌面路径,直接放到桌面上了
        File desktopDir = FileSystemView.getFileSystemView().getHomeDirectory();
        String desktopPath = desktopDir.getAbsolutePath();
        String desktopDirPath = desktopPath.replace("\\","\\\\");
        String filePath = desktopDirPath + "\\\\haha.xls";"
	File file = new File(filePath);
	if(file.exists()){
	    try {
	  	file.createNewFile();
	    } catch (IOException e) {
	  	e.printStackTrace();
	    }
	}
	FileOutputStream fos = new FileOutputStream(file);
	if(fos != null){
	    wb.write(fos);
	    fos.flush();
	    fos.close();
	}
    } catch (Exception e) {
	e.printStackTrace();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值