使用 poi 和fastExcel 包读取excel 表格文件

今年做了一些项目,其中有几个模块中要求能对 excel 表格文件能够操作,比如能把 excel 文件中数据读到程序中或把程序中的数据写入到 excel 表格中去,每次程序写到这里,都会遇到这样或那样的小问题,原因是自己平时没有去好好的总结一下。就用今天的这个时间做个总结吧!!!希望以后大家和我一样,不要在这上面再栽跟头了。(测试用的 excel 文件在附件中)

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);
		
	}
	
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java使用POI库可以实现对Excel文件读取操作。具体的步骤如下: 1. 引用POI库。在Java项目中引入POI相关的jar。 2. 创建文件输入流。使用FileInputStream类创建一个输入流对象,并指定要读取Excel文件路径。 3. 创建工作簿对象。使用HSSFWorkbook类创建一个工作簿对象,将输入流作为参数传入。 4. 获取工作表。使用getSheetAt方法获取指定的工作表,可以通过工作表的索引或名称进行获取。 5. 获取行。使用getRow方法获取指定行的对象,行号作为参数传递给该方法。 6. 获取单元格。使用getCell方法获取指定单元格的对象,行号和列号作为参数传递给该方法。 7. 获取单元格的值。使用getStringCellValue方法获取单元格的值,将其赋给一个字符串变量。 8. 输出结果。使用System.out.println方法将获取到的数据打印出来。 需要注意的是,在读取Excel文件时可能会出现FileNotFoundException和IOException异常,需要进行异常处理。同时,在读取完成后,需要关闭输入流。 下面是一个示例代码,用于演示Java使用POI读取Excel文件: ```java import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class ExcelReader { public static void poiRead() { FileInputStream xlsStream = null; try { // 创建文件输入流 xlsStream = new FileInputStream(new File("C:\\Users\\itour\\Desktop\\poiTest.xls")); // 创建工作簿对象 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(xlsStream); // 获取工作表 HSSFSheet sheetAt = hssfWorkbook.getSheetAt(0); // 获取行 HSSFRow row = sheetAt.getRow(0); // 获取单元格 HSSFCell cell = row.getCell(0); // 获取单元格的值 String cellValue = cell.getStringCellValue(); System.out.println("获取到的数据是:" + cellValue); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (xlsStream != null) { try { xlsStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } ``` 以上代码演示了如何使用POI读取Excel文件中第一个工作表的第一个单元格的值。你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值