JavaWeb中使用poi进行excel的导入

版权声明:本文为博主原创文章,转载请注明原帖地址,谢谢 https://blog.csdn.net/AooMiao/article/details/81780627

接在上次文章说的excel的下载,这次说明excel的导入,既然是导入肯定要涉及到文件的上传,下面代码的环境是spingMVC环境,若需使用下面代码,请配置spring环境

1.maven中导入依赖包

<dependency><!-- excel2003 -->
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.8</version>5
</dependency>
<dependency><!-- excel2007以上 -->
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.8</version>
</dependency>

2.代码

@RequestMapping("doImport")
public String doImport(@RequestParam("files[]") MultipartFile file, HttpServletRequest request, HttpServletResponse response)
        throws Exception {
    _Log.info("处理上传的文件--开始");
    byte[] bytes = file.getBytes();
    String uploadPath = request.getSession().getServletContext().getRealPath("/upload/");//获取保存文件路径,绝对路径例如:d/tomcat/demo/upload/...
    _Log.info(uploadPath);
    Path path = Paths.get(uploadPath + file.getOriginalFilename());
    path = Files.write(path, bytes);//写入文件二进制数据
    _Log.info("处理上传的文件--结束");
    //这里的文件上传处理明显过于简单,因为这边文章重点是excel的导入,详细的文件上传处理大家可以等待下篇文章
    /**
     * 注意这里应该判断文件的扩展名来判断是xls(2003)或xlxs(2007以上)
     * 因为xls和xlxs用的poi的api都不一样
     * xls:HSSFWorkbook
     * xlxs:XSSFworkbook
     * 由于下载模板(看开头)我选用了xls,这里我就不判断了
     */
    List<List<Object>> list = ImportExcelUtil.read2003Excel(path.toFile(), false, 3, "");//封装excel的内容返回list列表
    //接下来就是导入的逻辑代码
    list = deleteAllEmptyElement(list);//清空导入列表的空白行,节省遍历时间
    for (List<Object> objectList : list) {
        Object[] rows = objectList.toArray();
        _Log.info(rows[0].toString());//字段1
        _Log.info(rows[1].toString());//字段2
        _Log.info(rows[2].toString());//字段3
    }
    return "/excel/import";
}

上面代码中比较重要的就是ImportExcelUtil.read2003Excel(path.toFile(), false, 3, “”);这句,这里接受一个file参数,经过处理就可以把excel数据封装成list列表返回,直接上代码

/**
 * 读取Office 2003 excel
 * @param file excel文件
 * @param lastcellnum 读取列数(excel的列数)
 * @param sheetName 指定工作表的名称
 * @return
 * @throws IOException
 */
public static List<List<Object>> read2003Excel(File file,boolean isReadColumn,int lastcellnum,String sheetName)
    throws IOException {
    List<List<Object>> list = new ArrayList<List<Object>>();
    HSSFWorkbook hwb = new HSSFWorkbook(new FileInputStream(file));
    HSSFSheet sheet = null;
    if (null != sheetName && sheetName.length() > 0) {
        sheet = hwb.getSheet(sheetName);// 获取指定工作表的excel内容
    } else {
        sheet = hwb.getSheetAt(0);// 默认获取第一个工作表
    }
    if (null != sheet) {
        Object value = null;
        HSSFRow row = null;
        HSSFCell cell = null;
        for (int i = 1; i <= sheet.getPhysicalNumberOfRows(); i++) {//从一行遍历到物理行数(包括空行)
            row = sheet.getRow(i);
            if (row == null) {//行为空,跳过
                continue;
            }
            List<Object> linked = new ArrayList<Object>();//记录行的内容
            for (int j = row.getFirstCellNum(); j < lastcellnum; j++) {//该行第一个单元格遍历到列数,简单来说就是行的内容遍历
                cell = row.getCell(j);//取出当前单元格
                if (cell == null) {
                    linked.add("");
                    continue;
                }
                DecimalFormat df = new DecimalFormat("0");// 格式化 number
                                                          // String
                // 字符
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期字符串
                DecimalFormat nf = new DecimalFormat("#");// 格式化数字
                DecimalFormat mf = new DecimalFormat("######0.00");// 保留两位小数
                switch (cell.getCellType()) {//判断当前单元格的格式,对value进行适当的类型转换
                case XSSFCell.CELL_TYPE_STRING:
                    value = cell.getStringCellValue();
                    break;
                case XSSFCell.CELL_TYPE_NUMERIC:
                    if ("@".equals(cell.getCellStyle().getDataFormatString())) {
                        value = df.format(cell.getNumericCellValue());

                    } else if ("General".equals(cell.getCellStyle().getDataFormatString())) {
                        value = nf.format(cell.getNumericCellValue());
                    } else if ("0.00_ ".equals(cell.getCellStyle().getDataFormatString())) {
                        value = mf.format(cell.getNumericCellValue());
                    } else if ("#,##0.00".equals(cell.getCellStyle().getDataFormatString())) {
                        value = mf.format(cell.getNumericCellValue());
                    } else {
                        value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
                    }
                    break;
                case XSSFCell.CELL_TYPE_BOOLEAN:
                    value = cell.getBooleanCellValue();
                    break;
                case XSSFCell.CELL_TYPE_BLANK:
                    value = "";
                    break;
                default:
                    value = cell.toString();
                }
                linked.add(value);
            }
            list.add(linked);
        }

    }
    return list;
}

最后,代码的注释应该很清楚了,有什么不明白的地方或者有更好的建议请留言,我会很感激你,一起进步,谢谢。

猜你喜欢

转载自blog.csdn.net/AooMiao/article/details/81780627
今日推荐