Java操作Excel

我们这里主要使用POI解析excel,POI的官网是:http://poi.apache.org/。

   

  • 使用到的依赖

    <!-- 这个是解析excel文档的poi -->

    <dependency>

    <groupId>org.apache.poi</groupId>

    <artifactId>poi-ooxml</artifactId>

    <version>3.10-FINAL</version>

    </dependency>

  • 操作步骤
    • 读数据的详细操作步骤
      • 打开excel

        Workbook wb = WorkbookFactory.create(new File(excelPath)); // 方式一,传入一个文件

        Workbook wb = WorkbookFactory.create(new FileInputStream(excelPath)); // 方式二:传入一个写入流

      • 获取excel中的sheet

        Sheet sheet = wb.getSheet("Sheet1"); // 根据sheet名获取

        Sheet sheet = wb.getSheetAt(0); // 根据sheet的下标获取,

      • 获取sheet中的行

        Row row = sheet.getRow(0); // 获取一行,通常是从0开始的

      • 获取行中的cell

        Cell cell = row.getCell(0); // 索引是从0开始的

      • 对cell中的数据进行处理

        String str = cell.getStringCellValue(); // 获取String类型cell的值

    • 写数据的详细操作步骤
      • 打开excel

        Workbook wb = WorkbookFactory.create(new File(excelPath));

      • 创建sheet(读取也行)

        Sheet sheet = wb.createSheet("新建一个sheet");

      • 创建行(读取也行)

        Row row = sheet.createRow(2);

      • 创建单元格(读取也行)

        Cell cell = row.createCell(3);

      • 往单元格中写相应的数据类型

        cell.setCellValue("测试数据");

      • 创建写入流

        OutputStream os = new FileOutputStream(new File(excelPath));

      • 写入excel

        wb.write(os);

      • 关闭写入流

        os.close();

    • 其他的小知识
      • 获取共有多少行
        • 不建议使用sheet.getPhysicalNumberOfRows();因为这个方法会自动忽略中间的空行。如果中间存在空行,该方法获取的值就会比实际的少
        • 推荐使用sheet.getLastRowNum();来获取行数,但是处理过程中小心空行
      • 获取共有多少列
        • 不建议使用row.getPhysicalNumberOfCells();同样的原因
        • 推荐使用row.getFirstCellNum()等
    • 一些小知识点
      • HSSFworkbook,XSSFworkbook,SXSSFworkbook,WorkbookFactory的区别于联系
        • HSSFworkbook:操作Excel2003以前的版本,扩展名是.xls
        • XSSFworkbook操作Excel2007以后的版本,扩展名是.xlsx
        • 当行数操作65536行之后,不使用SXSSFworkbook会报错
        • WorkbookFactory自适应的产生HSSFworkbook,XSSFworkbook
  • 集成小demo
    • 读取excel中的所有数据
              package operateExcel;
              
              import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
              import org.apache.poi.ss.usermodel.*;
              
              import java.io.File;
              import java.io.IOException;
              
              /**
               * 获取excel中的所有数据
               */
              public class OperateExcelTest {
                  public static void main(String[] args) {
                      String excelPath = "C:\\Users\\huabingood\\Desktop\\增量图书数据\\20180718新.xlsx";
              
                      Workbook wb = null;
              
                      try {
                          // 1.打开excel
                          wb = WorkbookFactory.create(new File(excelPath));
                          // 2.获取sheet
                          Sheet sheet = wb.getSheetAt(0);
                          int line = sheet.getFirstRowNum();   // 这里实际上是获取的是第一行的行号
                          int lastline = sheet.getLastRowNum();
                          sheet.getPhysicalNumberOfRows();
                          // 循环遍历所有的行
                          for (; line <= lastline; line++) {
                              // 3.获取一行
                              Row row = sheet.getRow(line);
              
                              int cellNum = row.getFirstCellNum();
                              int lastCellNum = row.getLastCellNum();
                              for (; cellNum <= lastCellNum; cellNum++) {
                                  // 防止该行的数据为空
                                  if (null != row) {
                                      // 4.获取一列
                                      Cell cell = row.getCell(cellNum);
                                      if (null != cell) {
                                          // 如果单元格的数据不是string就会出错
                                          String str = cell.getStringCellValue();
                                          System.out.println(str);
                                      }
                                  }
                              }
              
                          }
              
                      } catch (IOException e) {
                          e.printStackTrace();
                      } catch (InvalidFormatException e) {
                          e.printStackTrace();
                      }
                  }
      } 

       


         

    • 往excel中写数据
              package operateExcel;
              
              import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
              import org.apache.poi.ss.usermodel.*;
              
              import java.io.File;
              import java.io.FileOutputStream;
              import java.io.IOException;
              import java.io.OutputStream;
              
              public class OperateExcel2 {
                  public static void main(String[] args) {
                      String excelPath = "C:\\Users\\huabingood\\Desktop\\增量图书数据\\20180718新.xlsx";
                      OutputStream os = null;
              
              
                      Workbook wb = null;
              
                      try {
                          // 1.获取excel
                          wb = WorkbookFactory.create(new File(excelPath));
                          // 2.创建sheet
                          Sheet sheet = wb.createSheet("新建一个sheet");
                          // 3.创建一个新行
                          Row row = sheet.createRow(2);
                          // 4.创建一个新的单元格
                          Cell cell = row.createCell(3);
                          // 5.往单元格中写入相应的数据
                          cell.setCellValue("测试数据");
              
                          // 6.打开一个写入流
                          os = new FileOutputStream(new File(excelPath));
                          // 7.写入
                          wb.write(os);
              
                      } catch (IOException e) {
                          e.printStackTrace();
                      } catch (InvalidFormatException e) {
                          e.printStackTrace();
                      } finally {
                          if (null != os) {
                              try {
                                  // 8.关闭写入流
                                  os.close();
                              } catch (IOException e) {
                                  e.printStackTrace();
                              }
                          }
                      }
                  }
      } 

       

  • 参考资料【感谢你的努力让我进步】

   

  

posted @ 2018-08-23 18:13  huabingood  阅读(436)  评论(0编辑  收藏  举报