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     }

 

posted @ 2021-01-17 22:08  孙浩月  阅读(86)  评论(0编辑  收藏  举报