美文网首页work
Java 使用Apache POI读取和写入Excel表格

Java 使用Apache POI读取和写入Excel表格

作者: Michaelhbjian | 来源:发表于2017-09-02 21:37 被阅读4056次

    在实际项目中可能出现将数据生成Excel表格,然后导入到本地。或者使用Excel模板将数据导出,这个或许在项目中比较常用。

    认识Excel表格

    image.png

    使用POI创建Excel

    通过Apache POI文档可以清楚的了解到如何去创建一个Excel表格。

    * Excel 2003: HSSFWorkbook, HSSFSheet, HSSFRow, HSSFCell, etc.(对于2003)
    * Excel 2007: XSSFWorkbook, XSSFSheet, XSSFRow, XSSFCell, etc.(对于2007)
    

    1.HSSFWorkbook : 相当于一个excel文件

    Workbook wb = new HSSFWorkbook();

    2.HSSFSheet:一张excel表,excel左下角的sheet0,sheet1..

    Sheet sheet1 = wb.createSheet("new sheet");//参数new sheet是工作表的表名

    3.HSSFRow:一张表格中的某一行

    Row row = sheet.createRow((short)0);//参数表示创建第几行,索引从0开始

    4.创建一个单元格

    HSSFCell cell = row.createCell(0);//参数表示创建第几列,索引从0开始

    到这里就可以新建一个简单的Excel表格了。

    写入数据到Excel并导出

     private static void createExcel(ArrayList<String> list) {
    
            //获取当前时间
            SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置日期格式
            String date = df.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳
    
            //存储路径--获取桌面位置
            FileSystemView view = FileSystemView.getFileSystemView();
            File directory = view.getHomeDirectory();
            System.out.println(directory);
            //存储Excel的路径
            String path = directory+"\\"+date+".xlsx";
            System.out.println(path);
            try {
    
                //定义一个Excel表格
                XSSFWorkbook wb = new XSSFWorkbook();  //创建工作薄
                XSSFSheet sheet = wb.createSheet("sheet1"); //创建工作表
                XSSFRow row = sheet.createRow(0); //行
                XSSFCell cell;  //单元格
    
                //添加表头数据
                for (int i = 0; i < list.size(); i++) {
                    //从前端接受到的参数封装成list集合,然后遍历下标从而取出对应的值
                    String value = list.get(i);
                    //将取到的值依次写到Excel的第一行的cell中
                    row.createCell(i).setCellValue(value);
                }
    
                //输出流,下载时候的位置
    //            FileWriter outputStream1 = new FileWriter(path);
                FileOutputStream outputStream = new FileOutputStream(path);
                wb.write(outputStream);
                outputStream.flush();
                outputStream.close();
                System.out.println("写入成功");
            } catch (Exception e) {
                System.out.println("写入失败");
                e.printStackTrace();
            }
        }
    

    读出Excel表格

     
       /**
         * 从指定路径读取Excel文件,返回类型为List<Map<String,String>>
         *
         * @param path
         * @throws IOException
         */
        private static ArrayList<Map<String, String>> readExcel(String path) throws Exception {
    
    
            ArrayList<Map<String, String>> mapList = new ArrayList<>();
            File file = new File(path);
            //判断文件是否存在
            if (file.isFile() && file.exists()) {
                System.out.println(file.getPath());
                //获取文件的后缀名 \\ .是特殊字符
                String[] split = file.getName().split("\\.");
                System.out.println(split[1]);
                Workbook wb;
                //根据文件后缀(xls/xlsx)进行判断
                if ("xls".equals(split[1])) {
    //              //获取文件流对象
                    FileInputStream inputStream = new FileInputStream(file);
                    wb = new HSSFWorkbook(inputStream);
                }else if ("xlsx".equals(split[1])){
                wb = new XSSFWorkbook(file);
                }else {
                    System.out.println("文件类型错误");
                    return null;
                }
    
                //开始解析
                Sheet sheet = wb.getSheetAt(0);
                //第一行是列名,所以从第二行开始遍历
                int firstRowNum = sheet.getFirstRowNum() + 1;
                int lastRowNum = sheet.getLastRowNum();
    
                //遍历行
                for (int rIndex = firstRowNum; rIndex <= lastRowNum; rIndex++) {
                    Map map =new HashMap();
                    //获取当前行的内容
                    Row row = sheet.getRow(rIndex);
                    if (row != null) {
                        int firstCellNum = row.getFirstCellNum();
                        int lastCellNum = row.getLastCellNum();
                        for (int cIndex = firstCellNum; cIndex < lastCellNum; cIndex++) {
                            row.getCell(cIndex).setCellType(Cell.CELL_TYPE_STRING);
                            //获取单元格的值
                            String value = row.getCell(cIndex).getStringCellValue();
                            System.out.println(value);
                            //获取此单元格对应第一行的值
                            String key = sheet.getRow(0).getCell(cIndex).getStringCellValue();
                            System.out.println(key);
                            //第一行中的作为键,第n行的作为值
                            map.put(key, value);
                            System.out.println(map);
                        }
                    }
                    mapList.add(map);
                    System.out.println("读取成功");
                    System.out.println(mapList);
                }
    
            }
    
            return mapList;
    
        }
    

    这就使用POI对Excel的基本操作,还有更多的复杂的操作请参考官方文档。

    可能需要添加的包

      <!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
            <dependency>
                <groupId>commons-beanutils</groupId>
                <artifactId>commons-beanutils</artifactId>
                <version>1.8.2</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
            <dependency>
                <groupId>commons-collections</groupId>
                <artifactId>commons-collections</artifactId>
                <version>3.2.1</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-collections4</artifactId>
                <version>4.1</version>
            </dependency>
    

    相关文章

      网友评论

        本文标题:Java 使用Apache POI读取和写入Excel表格

        本文链接:https://www.haomeiwen.com/subject/pqvrjxtx.html