poi操作Excel
POI简介
Apache POI是Apache软件基金会开源的一个子项目,POI提供API给JAVA对Excel进行读和写的功能
POI操作Excel (HSSF、XSSF)
HSSF:提供读写Microsoft Excel xls 格式文档的功能,仅支持2007 Microsoft office版本以前的
XSSF:提供读写Miceosoft Excel OOXML 格式文档的功能,支持2007 Microsoft office版本以后的
使用jar包
jar 包下载地址 :https://mvnrepository.com/
创建Excel并写入数据
1 package com.workbook; 2 import org.apache.poi.ss.usermodel.Cell; 3 import org.apache.poi.ss.usermodel.CellStyle; 4 import org.apache.poi.ss.usermodel.CreationHelper; 5 import org.apache.poi.ss.usermodel.Row; 6 import org.apache.poi.xssf.usermodel.XSSFSheet; 7 import org.apache.poi.xssf.usermodel.XSSFWorkbook; 8 import java.io.FileOutputStream; 9 import java.util.Date; 10 11 /** 12 * @AUTHOR SHY 13 * @DATE 2021/1/14 - 20:46 14 */ 15 public class Demo { 16 public static void main(String[] args) { 17 //创建一个工作簿 18 XSSFWorkbook wb = new XSSFWorkbook(); 19 //创建一个sheet页并命名 20 XSSFSheet sheet = wb.createSheet("sheet名"); 21 //创建一行 22 Row row = sheet.createRow(0); // 0代表第一行 23 //创建单元格 24 Cell cell1 = row.createCell(0); // 代表第一个单元格 25 //写入值,字符串 26 cell1.setCellValue("字符串"); 27 //创建第二个单元格 28 Cell cell2 = row.createCell(1); 29 //写入值,数值 30 cell2.setCellValue(123456); 31 //创建第三个单元格 32 Cell cell3 = row.createCell(2); 33 //写入值,boolean 34 cell3.setCellValue(true); 35 //创建第四个单元格 36 Cell cell4 = row.createCell(3); 37 //写入值,日期类型 38 CreationHelper helper = wb.getCreationHelper(); 39 //创建单元格样式 40 CellStyle style = wb.createCellStyle(); 41 //设置日期样式 42 style.setDataFormat(helper.createDataFormat().getFormat("yyyy-MM-dd")); 43 Date date = new Date(); 44 //放入值 45 cell4.setCellValue(date); 46 //放入样式 47 cell4.setCellStyle(style); 48 49 try { 50 // 输出流 51 FileOutputStream outputStream = new FileOutputStream("d:\\这是Excel.xlsx"); 52 // 写进Excel 53 wb.write(outputStream); 54 // 关闭流 55 outputStream.close(); 56 } catch (Exception e) { 57 e.printStackTrace(); 58 } 59 } 60 }
读取Excel数据
1 package com.workbook; 2 import org.apache.poi.hssf.usermodel.HSSFDateUtil; 3 import org.apache.poi.ss.usermodel.Cell; 4 import org.apache.poi.ss.usermodel.Row; 5 import org.apache.poi.xssf.usermodel.XSSFSheet; 6 import org.apache.poi.xssf.usermodel.XSSFWorkbook; 7 import java.io.FileInputStream; 8 import java.text.SimpleDateFormat; 9 import java.util.Date; 10 11 /** 12 * @AUTHOR SHY 13 * @DATE 2021/1/15 - 20:10 14 */ 15 public class ReadExcel { 16 public static void main(String[] args) { 17 ReadExcel readExcel = new ReadExcel(); 18 try { 19 readExcel.poiExcel(); 20 } catch (Exception e) { 21 e.printStackTrace(); 22 } 23 } 24 /** 25 * 单元格类型判断,输出字符串。 26 */ 27 public static String getCellStringValue(Cell cell){ 28 String cellValue = ""; 29 if(cell!=null){ //cell不为空 30 if(cell.getCellType()==Cell.CELL_TYPE_BLANK){ //空值 31 cellValue = null; 32 }else if(cell.getCellType()==Cell.CELL_TYPE_NUMERIC){ //数值 33 cellValue = String.valueOf(cell.getNumericCellValue()); 34 }else if(cell.getCellType()==Cell.CELL_TYPE_BOOLEAN){ //布尔值 35 cellValue = String.valueOf(cell.getBooleanCellValue()); 36 }else if(cell.getCellType()==Cell.CELL_TYPE_FORMULA){ //公式 37 try { 38 cellValue = String.valueOf(cell.getNumericCellValue()); 39 } catch (IllegalStateException e) { 40 cellValue = String.valueOf(cell.getRichStringCellValue()); 41 } 42 }else if(cell.getCellType()==Cell.CELL_TYPE_STRING){ //字符串 43 cellValue = cell.getStringCellValue(); 44 } 45 } 46 return cellValue; 47 } 48 49 /** 50 * 取单元格日期,输出字符串。 51 */ 52 public static String getCellDateValue(Cell cell){ 53 String cellDateValue = ""; 54 if(cell!=null && cell.getCellType() != Cell.CELL_TYPE_BLANK){ 55 //设置日期格式 56 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 57 Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue()); 58 cellDateValue = sdf.format(date); 59 return cellDateValue; 60 } 61 return cellDateValue; 62 } 63 64 /** 65 * 读取Excel 66 * @throws Exception 67 */ 68 public void poiExcel() throws Exception{ 69 //获取输入流 70 FileInputStream inputStream = new FileInputStream("d:\\这是Excel.xlsx"); 71 //创建一个工作簿 72 XSSFWorkbook wb = new XSSFWorkbook(inputStream); 73 //获取第一个sheet页 74 XSSFSheet sheet = wb.getSheetAt(0); 75 //获取sheet页有效的行数,从0开始 76 int rowNum = sheet.getLastRowNum(); 77 //遍历sheet页 78 for(int r=0;r<=rowNum;r++){ 79 //获取一行 80 Row row = sheet.getRow(r); 81 //获取有效的单元格数 82 int cellNum = row.getLastCellNum(); 83 for(int c=0;c<cellNum;c++){ 84 Cell cell = row.getCell(c); 85 //把得到的Cell值进行类型判断,输出字符串类型 86 String cellValue = getCellStringValue(cell); 87 System.out.print(cellValue+"\t"); 88 } 89 System.out.println(); 90 } 91 92 //日期取出是数值问题,2020-01-15 会取出 43845,需要单独对日期单元格进行取值。 93 System.out.println(getCellDateValue(sheet.getRow(0).getCell(3))); 94 System.out.println("执行完毕"); 95 } 96 }
取合并单元格的值
1 /** 2 * 取合并单元格的值 3 */ 4 public static String getMergedRegionsValue(XSSFSheet sheet,int rowNum,int cellColumn) { 5 //获取sheet页有多少个合并单元格 6 int mergedRegionsCount = sheet.getNumMergedRegions(); 7 for(int i=0;i<mergedRegionsCount;i++){ 8 //获取单元格范围 9 CellRangeAddress rangeAddress = sheet.getMergedRegion(i); 10 int firstRow = rangeAddress.getFirstRow(); //获取合并单元格第一行 11 int lastRow = rangeAddress.getLastRow(); //获取合并单元格最后一行 12 int firstColumn = rangeAddress.getFirstColumn(); //获取合并单元格第一列 13 int lastColumn = rangeAddress.getLastColumn(); //获取合并单元格最后一列 14 if(rowNum>=firstRow && rowNum<=lastRow){ 15 if(cellColumn>=firstColumn && cellColumn<=lastColumn){ 16 Row row = sheet.getRow(firstRow); //取合并单元格第一行 17 Cell cell = row.getCell(firstColumn); //第一个单元格的值 18 //返回字符串 19 return getCellStringValue(cell); 20 } 21 } 22 } 23 return null; 24 }
读取单元格时间
1 // 取单元格时间,输出字符串 2 public static String getCellTimeValue(Cell cell) { 3 String cellTimeValue = ""; 4 if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK) { 5 // 设置日期格式 6 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 7 Date date = cell.getDateCellValue(); 8 cellTimeValue = sdf.format(date); 9 return cellTimeValue; 10 } 11 return cellTimeValue; 12 }