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(); } } } } }
-
-
参考资料【感谢你的努力让我进步】