Excel JAVA 读取代码POI Excel Reader 修改补充

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Excel JAVA 读取代码POI Excel Reader 修改补充相关的知识,希望对你有一定的参考价值。

 

 

主要调整了一下代码类的封装。

以前的代码sheetIndex散落在多个方法上,而方法是要求按顺序执行的,没有被封装起来,会导致直接用部分方法会报错。

 

  1 import java.io.FileInputStream;
  2 import java.io.InputStream;
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 
  6 import org.apache.logging.log4j.LogManager;
  7 import org.apache.logging.log4j.Logger;
  8 import org.apache.poi.ss.usermodel.Cell;
  9 import org.apache.poi.ss.usermodel.DateUtil;
 10 import org.apache.poi.ss.usermodel.Row;
 11 import org.apache.poi.ss.usermodel.Sheet;
 12 import org.apache.poi.ss.usermodel.Workbook;
 13 import org.apache.poi.ss.usermodel.WorkbookFactory;
 14 
 15 /**
 16  * ClassName:ExcelReader.java Author: wenbin.ji CreateTime: Jan 28, 2011
 17  * 11:16:29 AM Description:Excel数据读取工具类,POI实现,兼容Excel2003,及Excel2007
 18  **/
 19 
 20 public class ExcelReader {
 21     
 22     private static Logger logger = LogManager.getLogger(ExcelReader.class);
 23     
 24     private Sheet sheet=null;
 25     private List<String[]> dataList = null;
 26     
 27     
 28     public ExcelReader(String path,int sheetIndex) {
 29         try {
 30             InputStream inp = new FileInputStream(path);
 31             Workbook wb = WorkbookFactory.create(inp);
 32             sheet = wb.getSheetAt(sheetIndex);
 33             dataList=this.getAllData();
 34         } catch (Exception e) {
 35             e.printStackTrace();
 36         }
 37     }
 38 
 39     /**
 40      * 得到正式数据,头部除外
 41      * @param sheetIndex
 42      * @param startRow
 43      * @return
 44      */
 45     public List<String[]> getBodyData(int startRow) {
 46         List<String[]> allData = this.getAllData();
 47         return allData.subList(startRow,allData.size());
 48     }
 49 
 50     
 51     /**
 52      * 获得最大数量的表格行。不考虑无数据行
 53      * @param sheetIndex
 54      * @return
 55      */
 56     private List<String[]> getAllData() {
 57         return this.getAllData(Integer.MAX_VALUE);
 58     }
 59     
 60     /**
 61      * 取Excel所有数据,包含header
 62      * @return List<String[]>
 63      */
 64     private List<String[]> getAllData(int endRow) {
 65         int columnNum = 0;
 66         dataList = new ArrayList<String[]>(100);
 67         int lastRow=this.getRowNum();
 68         //如果总行数大于指定结束行。那么以指定行为准
 69         lastRow=lastRow>endRow?endRow:lastRow;
 70         logger.error("lastRow=========>:"+lastRow);
 71         if (sheet.getRow(0) != null) {
 72             columnNum = sheet.getRow(0).getLastCellNum()
 73                     - sheet.getRow(0).getFirstCellNum();
 74         }
 75         if (columnNum > 0) {
 76             for (Row row : sheet) {
 77                 //到最后一行结束循环
 78                 if(row.getRowNum()>lastRow){
 79                     break;
 80                 }
 81                 
 82                 String[] singleRow = new String[columnNum];
 83                 int n = 0;
 84                 for (int i = 0; i < columnNum; i++) {
 85                     Cell cell = row.getCell(i, Row.CREATE_NULL_AS_BLANK);
 86                     switch (cell.getCellType()) {
 87                     case Cell.CELL_TYPE_BLANK:
 88                         singleRow[n] = "";
 89                         break;
 90                     case Cell.CELL_TYPE_BOOLEAN:
 91                         singleRow[n] = Boolean.toString(cell
 92                                 .getBooleanCellValue());
 93                         break;
 94                     // 数值
 95                     case Cell.CELL_TYPE_NUMERIC:
 96                         if (DateUtil.isCellDateFormatted(cell)) {
 97                             singleRow[n] = String.valueOf(cell
 98                                     .getDateCellValue());
 99                         } else {
100                             cell.setCellType(Cell.CELL_TYPE_STRING);
101                             String temp = cell.getStringCellValue();
102                             // 判断是否包含小数点,如果不含小数点,则以字符串读取,如果含小数点,则转换为Double类型的字符串
103                             if (temp.indexOf(".") > -1) {
104                                 singleRow[n] = String.valueOf(new Double(temp))
105                                         .trim();
106                             } else {
107                                 singleRow[n] = temp.trim();
108                             }
109                         }
110                         break;
111                     case Cell.CELL_TYPE_STRING:
112                         singleRow[n] = cell.getStringCellValue().trim();
113                         break;
114                     case Cell.CELL_TYPE_ERROR:
115                         singleRow[n] = "";
116                         break;
117                     case Cell.CELL_TYPE_FORMULA:
118                         cell.setCellType(Cell.CELL_TYPE_STRING);
119                         singleRow[n] = cell.getStringCellValue();
120                         if (singleRow[n] != null) {
121                             singleRow[n] = singleRow[n].replaceAll("#N/A", "")
122                                     .trim();
123                         }
124                         break;
125                     default:
126                         singleRow[n] = "";
127                         break;
128                     }
129                     n++;
130                 }
131                 if ("".equals(singleRow[0])) {
132                     continue;
133                 }// 如果第一行为空,跳过
134                 dataList.add(singleRow);
135             }
136         }
137         return dataList;
138     }
139 
140     /**
141      * 返回Excel最大行index值,实际行数要加1
142      * 
143      * @return
144      */
145     public int getRowNum() {
146         return sheet.getLastRowNum();
147     }
148 
149     /**
150      * 返回数据的列数
151      * 
152      * @return
153      */
154     public int getColumnNum() {
155         Row row = sheet.getRow(0);
156         if (row != null && row.getLastCellNum() > 0) {
157             return row.getLastCellNum();
158         }
159         return 0;
160     }
161 
162     /**
163      * 获取某一行数据
164      * @param rowIndex
165      *            计数从0开始,rowIndex为0代表header行
166      * @return
167      */
168     public String[] getRowData(int rowIndex) {
169         String[] dataArray = null;
170         if (rowIndex > this.getRowNum()) {
171             return dataArray;
172         } else {
173             dataArray = new String[this.getColumnNum()];
174             return this.dataList.get(rowIndex);
175         }
176 
177     }
178 
179     /**
180      * 获取某一列数据
181      * 
182      * @param colIndex
183      * @return
184      */
185     public String[] getColumnData(int colIndex) {
186         String[] dataArray = null;
187         if (colIndex > this.getColumnNum()) {
188             return dataArray;
189         } else {
190             if (this.dataList != null && this.dataList.size() > 0) {
191                 dataArray = new String[this.getRowNum() + 1];
192                 int index = 0;
193                 for (String[] rowData : dataList) {
194                     if (rowData != null) {
195                         dataArray[index] = rowData[colIndex];
196                         index++;
197                     }
198                 }
199             }
200         }
201         return dataArray;
202 
203     }
204 }

 

以上是关于Excel JAVA 读取代码POI Excel Reader 修改补充的主要内容,如果未能解决你的问题,请参考以下文章

用java的poi类读取一个excel表格的内容后再写入到一个新excel表格中的完整代码

org.apache.poi.hssf.usermodel.HSSFWorkbookorg.apache.poi.xssf.usermodel.XSSFWorkbook excel2003 exce

java使用poi读取excel时,电话号码变成了科学计数法,整数变成double,怎么改过来

java如何导出excel表格,如果用poi,java代码如何实现.,求代码!!!

java poi 读取excel 数字类型

java poi读取Excel,怎么判断空行