【JavaWeb开发】使用java实现简单的Excel文件的导入与导出(POI)

前言:在实际的开发中,我们经常需要用户在界面中输入大量重复且有规律的数据,但是一个表单一个表单的填写效率过慢,而且过多的表单也会给JavaWeb的业务逻辑开发带来不小的困扰,所以我们可以使用一个Excel文件来代替这些大量重复且有规律的数据。

使用java实现简单的Excel文件的导入与导出 (POI)

  • 需要导入的jar包:

    由于POI也是apache的一个子项目,所以我们直接去apache的官网直接下载即可:POI官网下载链接

  • Excel转ArrayList

    /**
     * 
     * 描述:excel转list
     * 方法名: excelToList
     * 类名:ExamServiceImpl
     * 返回值类型:ArrayList<StudentInfoEntity>
     * 开发者:暴沸
     * 创建时间:2016年8月30日 下午8:48:17
     * @param file
     * @return
     * @throws IOException 
     */
     //代码解释:此方法主要用于将Excel中的内容转为ArrayList
    public ArrayList<StudentInfoEntity> excelToList(String URL) throws IOException {
        //代码解释:此方法将传入一个URL,即为当前用户所上传的Excel的目标路径,然后返回一个泛型为StudentInfoEntity的ArrayList
        //代码解释:实例化一个新的泛型为StudentInfoEntity的ArrayList对象,用于后面存放从Excel中解析到的内容
        ArrayList<StudentInfoEntity> list = new ArrayList<>();

        //代码解释:创建这个需要解析的Excel文件
        File file = new File(URL);
        //代码解释:创建Excel,读取文件内容,此处使用的是XSSFWorkbook,默认是2013版本,如果是比较老的版本,请使用HSSFWorkbook,其他均需要将X改为H
        XSSFWorkbook workbook = new XSSFWorkbook(FileUtils.openInputStream(file));
        //代码解释:读取默认第一个工作表sheet
        XSSFSheet sheet = workbook.getSheetAt(0);
        //代码解释:获取sheet中最后一行行号
        int lastRowNum = sheet.getLastRowNum();
        //代码解释:循环所有行
        for (int i = 1; i <= lastRowNum; i++) {
            //代码解释:获取当前行中的内容
            XSSFRow row = sheet.getRow(i);
            //代码解释:由于本人在Excel模版中设定的内容仅有两列有效,并且在其他行中,我存放了提示,所以这里不能使用自动获取最后一列,否则程序将出现错误。此处设置当前行最后单元格列号为2(为了避免因为我设置的提示而导致的错误)
            int lastCellNum = 2;
            //代码解释:循环单元格列号,此处主要是用于解析一行中的所有列,将其转化为集合(数组也可以),主要是为了方便后面的操作,此步骤非必须
            ArrayList<String> list2 = new ArrayList<>();
            int index=0;
            //代码解释:获取该行中的数据,并存入集合中(数组也可以)
            for (int j = 0; j < lastCellNum; j++) {
                XSSFCell cell = row.getCell(j);
                if(index<lastCellNum){
                    list2.add(cell.getStringCellValue());
                }
            }
            //代码解释:实例化一个新的StudentInfoEntity对象用于存放上一个for循环中读取并将该行的数据存入即将返回的ArrayList中
            StudentInfoEntity studentInfoEntity = new StudentInfoEntity();
            studentInfoEntity.setStudentName(list2.get(0));
            studentInfoEntity.setStudentNumber(list2.get(1));
            list.add(studentInfoEntity);
        }
        return list;
    }
  • ArrayList转Excel
    /**
     * 从数据库中获取数据,并利用POS生成Excel文件
     * POI生成Excel文件
     * 
     */
    public String downloadGrade(int examId,String contextPath,String examName) {

        //从数据库中获取到的该考试所有考生的成绩的结果集
        ArrayList<MarkEntity> markEntities = studentGradeDao.getStudentGrade(examId);

        String[] title = {"学号","姓名","成绩","ip"};

        //创建Excel工作簿
        XSSFWorkbook workbook = new XSSFWorkbook();
        //创建一个工作表sheet
        XSSFSheet sheet = workbook.createSheet();
        //创建第一行
        XSSFRow row = sheet.createRow(0);
        XSSFCell cell = null;
        //插入第一行数据 学号,姓名,成绩,ip地址
        for (int i = 0; i < title.length; i++) {
            cell = row.createCell(i);
            cell.setCellValue(title[i]);
        }
        //追加数据
        int j = 1;
        for (int i = 0; i < markEntities.size(); i++) {
            MarkEntity markEntity = markEntities.get(i);
            XSSFRow nextrow = sheet.createRow(j);
            XSSFCell cell2 = nextrow.createCell(0);
            cell2.setCellValue(markEntity.getStudentNumber());
            cell2 = nextrow.createCell(1);
            cell2.setCellValue(markEntity.getStudentName() );
            cell2 = nextrow.createCell(2);
            cell2.setCellValue(markEntity.getMark() );
            cell2 = nextrow.createCell(3);
            cell2.setCellValue(markEntity.getIp() );
            j++;
        }
        //创建一个文件
        String path = contextPath+"/"+examName+".xlsx";
        File file = new File(path);
        try {
            file.createNewFile();
            //将Excel内容存盘
            FileOutputStream stream = FileUtils.openOutputStream(file);
            workbook.write(stream);
            stream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return path;
    }
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值