`

poi&fastExcel读excel

    博客分类:
  • poi
阅读更多
package com.jim.tools;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import java.io.*;
import java.util.ArrayList;

/**
 * 此类采用 poi包 实现了读 .xls 文件的功能,
 * 用 poi 读 excel 相对而言要比 fastExcel 麻烦,而且速度上也没有 fastExcel 快
 * @author  hellojim
 * @company cxtech
 */
public class POIReadFromExcel {

	private String URL; //要读取的 .xls 文件的目录
	private int index = 0; //要读取的 .xls 文件的那个 Sheet , 默认为第0个(Sheet1)
	private int beginRow = 0; //要读取的 Sheet 的开始行, 默认为第0行
	private int beginCol = 0; //要读取的 Sheet 的开始列, 默认为第0列
	
	private final static int defaultRow = 0;
	
	/**
	 *  URL 要读取的那个 .xls 文件的地址
	 */
	public POIReadFromExcel(String URL) {
		//这里简单的做了个判断
		if(URL == null || URL.trim().equals("")) { 
			System.out.println("文件不能为空!");
		}else if(URL.trim().indexOf(".xls") == -1 && URL.trim().indexOf(".XLS") == -1) {
			System.out.println("文件格式不正确!");
		}else {
			this.URL = URL;
		}
	}
	/**
	 *  URL 要读取的那个 .xls 文件的地址
	 *  index 要读取的那个 Sheet , 默认为第一个(Sheet1)
	 */
	public POIReadFromExcel(String URL, int index) {
		this(URL);
		this.index = index;
	}
	/**
	 *  URL 要读取的那个 .xls 文件的地址
	 *  index 要读取的那个 Sheet , 默认为第一个(Sheet1)
	 *  beginRow 要读取的 Sheet 的开始行
	 *  beginCol 要读取的 Sheet 的开始列
	 */
	public POIReadFromExcel(String URL,int index,int beginRow,int beginCol) {
		this(URL,index);
		this.beginRow = beginRow;
		this.beginCol = beginCol;
	}
	
	public int getIndex() {
		return index;
	}
	public void setIndex(int index) {
		this.index = index;
	}
	public String getURL() {
		return URL;
	}
	public void setURL(String URL) {
		this.URL = URL;
	}
	
	public int getBeginCol() {
		return beginCol;
	}
	public void setBeginCol(int beginCol) {
		this.beginCol = beginCol;
	}
	public int getBeginRow() {
		return beginRow;
	}
	public void setBeginRow(int beginRow) {
		this.beginRow = beginRow;
	}
  
  public String[][] read() throws Exception {

    String[][] strArray = null;
    String value = null;
    File f = new File(this.URL);
    
    FileInputStream fos = new FileInputStream(f);  //把要读取的 .xls 文件 包装起来
    HSSFWorkbook workbook = new HSSFWorkbook(fos); //得到 excel 工作簿对应的 HSSFWorkbook 对象
    
    HSSFSheet sheet = null;
    
    try {
    	sheet = workbook.getSheetAt(this.index); //得到 excel 工作簿中 某个Sheet 对应的 HSSFSheet 对象
    }catch(IndexOutOfBoundsException ex) {
    	return null;
    }
    
    HSSFRow row = sheet.getRow(defaultRow); //得到某个 Sheet 中的第 0 行(默认为第 0 行)
    
    int rows = sheet.getLastRowNum() - this.beginRow;  //得到共有多少行
    int cols = row.getLastCellNum() - this.beginCol;   //得到共有多少列
    
    strArray = new String[rows+1][cols];
    
    for (int i = this.beginRow,m=0; i <= rows+this.beginRow; i++,m++) {
      row = sheet.getRow(i); //得到此工作区中的某一得数据
      for (int j = this.beginCol,n=0; j < row.getLastCellNum(); j++,n++) {

        HSSFCell mycell = row.getCell( (short) j); //得到一个具体的单元格
        try {
        	
        	if(mycell != null) {//[注意]: 这里一定要加上这个判断,如果某个单元格为空,这里的 mycell 就为 null,易发生 NullProintException
        		/* [注意]:这里在得到某个单元格中内容前,一定要先判断这个单元格中内容的数据类型,
        		然后根据数据类型用对应的getXxxCellValue这样的方法来得到具体内容,如果不做这样的判断可能出现 int 型数据而你用了 
        		getStringCellValue()这样的方法去取数据,就会报错,这也是 POI 取 Excel 中数据的一个缺点。 
        		本个在以上两个"注意"点上栽了不少跟头,相反如果是用 fastExcel 这两个问题根本不存在 */
        		if(mycell.getCellType() == HSSFCell.CELL_TYPE_STRING) { //如果单元格里的数据类型为 String 型
            		value = mycell.getStringCellValue().trim();
            	}else if(mycell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) { //如果单元格里的数据类型为 Number 型
            		//这里总是返回的是 double 型,如果数据确实为 int 型,象下面这样可以在这里做个强行转换
            		value = String.valueOf((int)mycell.getNumericCellValue()).trim();
            	}else if(mycell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) { //如果单元格里的数据类型为 Boolean 型
            		value = String.valueOf(mycell.getBooleanCellValue()).trim();
            	}
        	}else {
        		value = null;
        	}
        	if(value == null || value.trim().equals("")) {
                strArray[m][n] = "";
            }else {
                strArray[m][n] = value;
            }
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
    return strArray;
  }
  
  	/** 
	 * 返回 若干个 sheet, 若干个 sheet 存放于 ArrayList 中
	 * */
  public ArrayList readAll() throws Exception {
		
	  ArrayList al = new ArrayList(); 
	  
	  String[][] strArr = null;
	  
	  while(true) {
		    strArr = read();
		    if(strArr == null) {
		    	break;
		    }else {
		    	al.add(strArr);
		    	this.index ++;
		    }
	  }
	  return al;
  }
	
  public static void printArr(String[][] strArr) {
	  
		for(int i=0; i<strArr.length; i++) {
			for(int j=0; j<strArr[i].length; j++) {
				System.out.print(strArr[i][j] + "	");
			}
			System.out.println();
		}
		
		System.out.println("______________________________________________________________________");
		
  }
  
  public static void main(String [] args) throws Exception {
    
	  
	  	POIReadFromExcel readExcel = new POIReadFromExcel("d:\\test.xls");
		readExcel.setIndex(1);
		readExcel.setBeginRow(1);
		readExcel.setBeginCol(1);
		//读某一个 Sheet 
		String[][] strArr2 = readExcel.read();
		printArr(strArr2);
		
		//读所有的 Sheet
		readExcel.setIndex(0);
		ArrayList al = readExcel.readAll();
		if(al != null && al.size() > 0) {
			
			for(int i=0; i<al.size(); i++) {
				
				String[][] strArr = (String[][])al.get(i);
				printArr(strArr);
			}
		}
  }
}




package com.jim.tools;

import java.io.File;
import java.util.ArrayList;

import edu.npu.fastexcel.FastExcel;
import edu.npu.fastexcel.Sheet;
import edu.npu.fastexcel.Workbook;

/**
 * 此类采用 fastExcel包 实现了读 .xls 文件的功能,目前为止,FastExcel 还没有提供向 Excel 中写入的功能
 * @author  hellojim
 * @company cxtech
 */
public class FEReadFromExcel {
	
	private String URL; //要读取的 .xls 文件的目录
	private int index = 0; //要读取的 .xls 文件的那个 Sheet , 默认为第0个(Sheet1)
	private int beginRow = 0; //要读取的 Sheet 的开始行, 默认为第0行
	private int beginCol = 0; //要读取的 Sheet 的开始列, 默认为第0列
	
	/**
	 *  URL 要读取的那个 .xls 文件的地址
	 */
	public FEReadFromExcel(String URL) {
		//这里简单的做了个判断
		if(URL == null || URL.trim().equals("")) { 
			System.out.println("文件不能为空!");
		}else if(URL.trim().indexOf(".xls") == -1 && URL.trim().indexOf(".XLS") == -1) {
			System.out.println("文件格式不正确!");
		}else {
			this.URL = URL;
		}
	}
	/**
	 *  URL 要读取的那个 .xls 文件的地址
	 *  index 要读取的那个 Sheet , 默认为第一个(Sheet1)
	 */
	public FEReadFromExcel(String URL, int index) {
		this(URL);
		this.index = index;
	}
	/**
	 *  URL 要读取的那个 .xls 文件的地址
	 *  index 要读取的那个 Sheet , 默认为第一个(Sheet1)
	 *  beginRow 要读取的 Sheet 的开始行
	 *  beginCol 要读取的 Sheet 的开始列
	 */
	public FEReadFromExcel(String URL,int index,int beginRow,int beginCol) {
		this(URL,index);
		this.beginRow = beginRow;
		this.beginCol = beginCol;
	}
	
	public int getIndex() {
		return index;
	}
	public void setIndex(int index) {
		this.index = index;
	}
	public String getURL() {
		return URL;
	}
	public void setURL(String URL) {
		this.URL = URL;
	}
	
	public int getBeginCol() {
		return beginCol;
	}
	public void setBeginCol(int beginCol) {
		this.beginCol = beginCol;
	}
	public int getBeginRow() {
		return beginRow;
	}
	public void setBeginRow(int beginRow) {
		this.beginRow = beginRow;
	}
	
	/** 
	 * 返回 某一个 sheet
	 */
	public String[][] read() throws Exception {
		
		Workbook workBook = FastExcel.createReadableWorkbook(new File(this.URL));
		workBook.open();
		Sheet s = workBook.getSheet(this.index);
		String cell = null;
		String[][] cellArr = new String[s.getLastRow()-this.beginRow][s.getLastColumn()-this.beginCol];
		
		for(int i=s.getFirstRow()+this.beginRow,row=0; i<s.getLastRow(); i++,row++) {
			
			for(int j=s.getFirstColumn()+this.beginCol,col = 0; j<s.getLastColumn() ; j++,col++) {
				
				cell = s.getCell(i,j);
				if(cell == null || cell.trim().equals("")) {
					cell = "";
				}else {
					cell = cell.trim();
				}
				cellArr[row][col] = cell;
			}
		}
		workBook.close();
		
		return cellArr;
	}
	
	/** 
	 * 返回 若干个 sheet, 若干个 sheet 存放于 ArrayList 中
	 * */
	public ArrayList readAll() throws Exception {
		
		Workbook workBook = FastExcel.createReadableWorkbook(new File(this.URL));
		workBook.open();
		
		Sheet s = null;
		String cell;
		int index = this.index; //读出所有的 Sheet,默认从第0个Sheet 开始读
		int sumRow = 0; //所有的 Sheet 共有记录多少行
		int sumCol = 0; //所有的 Sheet 共有记录多少列
		String[][] cellArr = null;
		ArrayList  al = new ArrayList();
		
		while(true) {
			
			s = workBook.getSheet(index++);
			if(s == null) {
				break;
			}else {
				sumRow += s.getLastRow()-this.beginRow;
				
				if(s.getLastColumn() > sumCol) {
					sumCol = s.getLastColumn();
				}
				
				cellArr = new String[s.getLastRow() - this.beginRow][s.getLastColumn() - this.beginCol];
			}
			
			for (int i = s.getFirstRow()+this.beginRow,row=0; i < s.getLastRow(); i++,row++) {
				for (int j = s.getFirstColumn() + this.beginCol,col=0; j < s.getLastColumn(); j++,col++) {
					cell = s.getCell(i, j);
					if(cell == null || cell.trim().equals("")) {
						cell = "";
					}else {
						cell = cell.trim();
					}
					cellArr[row][col] = cell;
				}
			}
			al.add(cellArr);
		}
		
		workBook.close();
		return al;
	}
	
	public static void printArr(String[][] strArr) {
		
		for(int i=0; i<strArr.length; i++) {
			for(int j=0; j<strArr[i].length; j++) {
				System.out.print(strArr[i][j] + "	");
			}
			System.out.println();
		}
		System.out.println("______________________________________________________________________");
	}
	
	public static void main(String[] args) throws Exception {
		
		FEReadFromExcel readExcel = new FEReadFromExcel("d:\\test.xls");
		readExcel.setIndex(0);
		readExcel.setBeginRow(0);
		readExcel.setBeginCol(0);
		
		ArrayList al = readExcel.readAll(); //这里表示所有的sheet
		if(al != null && al.size() > 0) {
			
			for(int i=0; i<al.size(); i++) {
				String[][] strArr = (String[][])al.get(i);
				printArr(strArr);
			}
		}
		
		readExcel.setIndex(1);
		readExcel.setBeginRow(1);
		readExcel.setBeginCol(1);
		String[][] strArr = readExcel.read(); //这里表示读 sheet1
		printArr(strArr);
		
	}
	
}
分享到:
评论

相关推荐

    poi excel poi excel poi excel

    ### POI Excel知识点详解 #### 一、Jakarta POI简介与Apache POI的作用 Jakarta POI 是 Apache POI 的早期项目名称,它提供了一组 API 来处理 Microsoft Office 文件格式,特别是针对 Excel(`.xls` 和 `.xlsx`)...

    poi log4j excel poi log4j excel poi log4j excel

    poi log4j excel poi log4j excel poi log4j excel poi log4j excel poi log4j excel poi log4j excel poi log4j excel

    高德地图地位&poi&定位.rar

    高德地图显示&定位&poi&设置中心点 1:显示当前位置 2:设置中心点 3:poi周围设置搜索位置并设置地图中心点 4:MainActivity 显示地图、定位、poi、改变中心点 5:TestActivity单独定位功能

    springboot+poi导出指定格式Excel模板

    springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式...

    利用POI合并多个Excel表

    在IT领域,Apache POI是一个广泛使用的Java库,它允许开发者读取、写入和修改Microsoft Office格式的文件,特别是Excel工作簿。本教程将深入探讨如何利用Apache POI库来合并多个Excel工作表,这对于处理大量数据或者...

    报表技术POI&EasyPOI导入导出操作Excel、Word、CSV(讲义、源码、资料).zip

    6. **资源利用**:提供的"报表技术POI&EasyPOI导入导出操作Excel、Word、CSV(讲义、源码、资料)"压缩包,包含了课程的讲义、源代码和相关资料,是学习和实践POI及EasyPOI的好资源。通过学习这些材料,你可以深入理解...

    POI生成Excel POI操作Excel POI读取Excel POI类库

    Apache POI是一个强大的Java库,专门用于处理Microsoft Office格式的文件,尤其是Excel。在这个场景中,我们关注的是如何使用POI来创建、读取和操作Excel文档。在Web项目中,这种功能通常用于数据导入导出,报表生成...

    使用POI和IText将Excel转换成PDF

    Apache POI是一个开源项目,它提供了读取和写入Microsoft Office格式文件的能力,包括Excel(.xlsx和.xls)。而iText则是一个用于创建和处理PDF文档的Java库。结合这两个库,我们可以将Excel的工作表内容导出到PDF中...

    fastexcel导入导出例子

    传统的Java Excel处理库如Apache POI在处理大量数据时可能会遇到性能瓶颈,因为它们会加载整个工作簿到内存中。而FastExcel则采用流式处理方式,只处理当前需要的数据,降低了内存占用,提高了处理速度。 在导入...

    fastexcel操作excel(含实例和开发包)

    与Apache POI相比,FastExcel通过采用数组方式存储数据,显著减少了内存消耗,这对于处理大型Excel文件尤其有利。 FastExcel的核心优势在于它的性能和内存效率。由于它不支持复杂的样式设置,因此在进行基础的读写...

    poi导出根据模板导出excel和简单列表导出excel源码

    Apache POI 是一个开源项目,专门用于处理 Microsoft Office 格式的文件,如 Word、Excel 和 PowerPoint。在本案例中,我们关注的是如何使用 Apache POI 库来导出 Excel 文件,特别是根据模板导出和简单列表导出。...

    使用poi+itext将excel转为pdf

    看到现在网上excel转pdf的代码很少,在csdn上找到一个还不能用,只能做简单的转换,只好自己写了一个,代码是一个maven工程,用eclipse创建,支持单元格合并等复杂的excel,同时能同步单元格样式到pdf中。...

    POI 3.14 读excel hssf && xssf

    标题中的"POI 3.14 读excel hssf && xssf"指的是Apache POI库的3.14版本,这是一个广泛使用的Java API,用于处理Microsoft Office格式的文件,特别是Excel。Apache POI提供了HSSF(Horrible Spreadsheet Format)和...

    使用poi从数据库导出excel表的示例

    在本示例中,我们将探讨如何使用Apache POI库从数据库导出数据到Excel表格,这在数据分析、报告生成或批量数据处理场景中非常常见。Apache POI是一个开源项目,它允许Java开发者创建、修改和显示Microsoft Office...

    POI按照模板导出Excel

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。在Java环境中,POI提供了一套API,使得开发者能够读取、创建、修改这些文件。本教程将深入讲解如何使用Apache POI...

    POI导出Excel文件

    Apache POI是一个流行的Java库,用于读取和写入Microsoft Office格式的文件,尤其是Excel(.xlsx和.xls)文件。这个实例提供了两种方法来导出Excel文件:通过Servlet和通过main方法。这两种方法都是在Java环境中操作...

    使用POI筛选字段导出Excel,以及条件查询和指定数据导出

    使用POI筛选字段导出Excel,以及条件查询和指定数据导出

    POI实现word和excel在线预览

    在IT行业中,Apache POI是一个广泛使用的库,主要用于读取、写入Microsoft Office格式的文件,包括Word(.doc/.docx)和Excel(.xls/.xlsx)文档。本项目提供的"POI实现word和excel在线预览"是基于Apache POI的一个...

    使用poi读取、写入复杂excel工具类(包含样式)

    使用poi读取写入复杂excel内容包括样式,工具类

    poi读取大文件Excel,使用xml格式解析,速度实测50mb文件13s,可指定sheet页内容,带工具类和测试类

    Apache POI 是一个广泛使用的Java库,用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。在处理大型Excel文件时,传统的HSSF和XSSF模型可能会遇到性能瓶颈,因为它们将整个工作簿加载到内存中。为了...

Global site tag (gtag.js) - Google Analytics