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 }
时间: 2024-11-03 22:49:07

Excel JAVA 读取代码POI Excel Reader 修改补充的相关文章

Apache POI Java读取100万行Excel性能优化:split vs indexOf+subString,谁性能好

使用Apache POI eventmodel实现一个Excel流式读取类,目标是100万,每行46列,文件大小152MB的Excel文件能在20s读取并处理完.一开始实现的程序需要260s,离目标差太远了,使用jvisualvm分析各方法执行时间,结果如下: 可以看到,程序中的splitLine和getRowNum方法消耗了大量时间.这两个方法都特别简单.splitLine方法将类似“123==hello”这样的字符串分解成{"123","hello"}数组,使用

java操作office和pdf文件java读取word,excel和pdf文档内容

在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应用.如果想深入了解原理.请读者自行研究一些相关源码. 首先我们来认识一下读取相关文档的jar包: 1. 引用POI包读取word文档内容 poi.jar 下载地址 http://apache.freelamp.com/poi/release/bin/poi-bin-3.6-20091214.zip 

Java程序员从笨鸟到菜鸟之(一百零三)java操作office和pdf文件(一)java读取word,excel和pd

在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下java对word.excel.pdf文件的读取.本篇博客只是讲解简单应用.如果想深入了解原理.请读者自行研究一些相关源码. 首先我们来认识一下读取相关文档的jar包: 1. 引用POI包读取word文档内容 poi.jar 下载地址 http://apache.freelamp.com/poi/release/bin/poi-bin-3.6-20091214.ziph

java五行代码导出Excel

目录 先看代码 再看效果 EasyExcel 附: Java按模板导出Excel---基于Aspose实现 Java无模板导出Excel,Apache-POI插件实现 已经写过两种Excel导出插件了.今天再安利一个极简的导出Excel的框架,导出无特殊格式要求的Excel,只需五行代码: 先看代码 再看效果 EasyExcel 本案例用到的框架是阿里推出的EasyExcel,EasyExcel从第一次提交代码(2018年2月)到现在,在GitHub上已经获得6590个Star 以下是官方介绍

Java读取、创建Excel;验签,加密

需要架包:poi相关jar,Md5.jar---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- package com.fanqi.test; import java.io.FileInputSt

使用PHP Excel类读取和生成excel文件

使用PHP来生成Excel的方法有很多,比如使用最简单的回车符,制表符来生成,或者直接使用html 的table格式,但这些方式兼容性都有所欠缺.测试了一下PHPExce类,发现太l强大了,可以输出非常复杂的excel表格,另外说一下还可以读取 Excel文件.闲话少说,放出简要代码: <?php require_once './Classes/PHPExcel.php'; $objExcel = new PHPExcel();   $objWriter = new PHPExcel_Write

把数据导入到本地的EXcel中和读取本地的EXCEL到list中

public class TestCaseManager{ public static final String title_caseID="测试例ID"; public static final String title_caseName="测试名"; public static final String title_testResult="测试结果"; public static final String title_testTime =&q

POI Excel 合并数据相同的行

import java.io.Serializable; /** * POI Excel报表导出,列合并实体<br> * * @author WQ * */ public class PoiModel implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private String content; private String oldContent; private int ro

Java使用POI读取和写入Excel指南

Java使用POI读取和写入Excel指南 做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃,这里基于最新的Apache POI 4.0.1版本来总结一下整个读取和写入Excel的过程,希望能帮助到需要的人 ^_^ 1. 准备工作 1.1 在项目中引入Apache POI相关类库 引入 Apache POI 和 Apache POI-OOXML 这两个类库,Maven坐标如下: <depe