java实现excel、word的读取(几行几列)

今天闲暇了解了一下通过POI实现EXCEL内容的读取:
需要jar包:poi-3.2-FINAL-20081019.jar、poi-contrib-3.2-FINAL-20081019.jar、poi-scratchpad-3.2-FINAL-20081019.jar
详见代码:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Date;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ExcelReader {

    //创建文件输入流
    private BufferedReader reader = null;
    //文件类型
    private String filetype;
    //文件二进制输入流
    private InputStream is = null;
    //当前的Sheet
    private int currSheet;
    //当前位置
    private int currPosition;
    //Sheet数量
    private int numOfSheets;
    //HSSFWorkbook
    HSSFWorkbook workbook = null;
    //设置Cell之间以空格分隔
    private static String EXCEL_LINE_DELIMITER = "";
    //设置最大列数
    private static int MAX_EXCEL_COLUMNS = 64;

    //构造函数创建一个ExcelReader
    public ExcelReader(String inputfile) throws IOException,Exception{

        //判断参数是否为空或者没有意义
        if(inputfile == null || inputfile.trim().equals("")){
            throw new IOException("no input file specified");
        }

        //取得文件名的后缀名赋值给filetype
        this.filetype = inputfile.substring(inputfile.lastIndexOf(".")+1);

        //设置开始行为0
        currPosition = 0;

        //设置当前位置为0
        currSheet = 0;

        //创建文件输入流
        is = new FileInputStream(inputfile);

        //判断文件格式
        if(filetype.equalsIgnoreCase("txt")){

            //如果是txt则直接创建BufferedReader读取
            reader = new BufferedReader(new InputStreamReader(is));
        }else if(filetype.equalsIgnoreCase("xls")){

            //如果是Excel文件则创建HSSFWorkbook读取
            workbook = new HSSFWorkbook(is);
            //设置Sheet
            numOfSheets = workbook.getNumberOfSheets();
        }else{
            throw new Exception("不支持的文件类型");
        }

    }

    //函数readLine读取文件的一行
    public String readLine() throws IOException{

        //如果是txt文件则通过reader读取
        if(filetype.equalsIgnoreCase("txt")){
            String str = reader.readLine();
            //空行则略去,直接读取下一行
            while(str.trim().equals("")){
                str = reader.readLine();
            }
            return str;
        //如果是XLS文件则通过POI提供的API读取文件
        }else if(filetype.equalsIgnoreCase("xls")){
            //根据currSheet值获得当前的sheet
            HSSFSheet sheet = workbook.getSheetAt(currSheet);
            //判断当前行是否到Sheet的结尾
            if(currPosition>sheet.getLastRowNum()){
                //当前行位置清零
                currPosition = 0;
                //判断是否还有Sheet
                while(currSheet != numOfSheets-1){
                    //得到下一张Sheet
                    sheet = workbook.getSheetAt(currSheet+1);
                    //当前行数是否已经到达文件末尾
                    if(currPosition == sheet.getLastRowNum()){
                        //当前Sheet指向下一张Sheet
                        currSheet++;
                        continue;
                    }else{
                        //获取当前行数
                        int row = currPosition;
                        currPosition++;
                        //读取当前行数据
                        return getLine(sheet,row);
                    }

                }
                return null;
            }
            //获取当前行数
            int row = currPosition;
            currPosition++;
            //读取当前行数据
            return getLine(sheet,row);

        }
        return null;

    }


    //函数getLine返回Sheet的一行数据
    private String getLine(HSSFSheet sheet,int row){
        //根据行数取得Sheet的一行
        HSSFRow rowline = sheet.getRow(row);
        //创建字符缓冲区
        StringBuffer buffer = new StringBuffer();
        //获取当前行的列数
        int filledColumns = rowline.getLastCellNum();
        HSSFCell cell = null;
        //循环遍历所有列
        for(int i = 0;i < filledColumns;i++){
            //取得当前Cell
            cell = rowline.getCell(i);          //该方法可以得到第几列的参数
            String cellvalue = null;
            if(cell != null){
                //判断当前Cell的Type
                switch(cell.getCellType()){

                //如果当前cell的Type为NUMERIC
                case HSSFCell.CELL_TYPE_NUMERIC:{
                    //判断当前的cell是否为Date
                    if(HSSFDateUtil.isCellDateFormatted(cell)){
                        //如果是Date类型,则得到该cell的Date值
                        Date date = cell.getDateCellValue();
                        //把Date转换为本地格式的字符串
                        cellvalue = cell.getDateCellValue().toLocaleString();
                    }else{
                        //如果是纯数字
                        //取得当前Cell的数值
                        Integer num = new Integer((int) cell.getNumericCellValue());
                        cellvalue = String.valueOf(num);

                    }
                    break;
                }

                //如果当前Cell的Type为STRIN
                case HSSFCell.CELL_TYPE_STRING:
                    //取得当前的Cell字符串
                    cellvalue = cell.getStringCellValue().replaceAll("", "");
                    break;

                //默认的Cell值
                default:
                    cellvalue = " ";
                }
            }else{
                cellvalue="";
            }

            //在每个字段之间插入分隔符
            buffer.append(cellvalue).append(EXCEL_LINE_DELIMITER);

        }

        //以字符串返回该行的数据
        return buffer.toString();

    }


    //close函数执行流的关闭操作
    public void close(){

        //如果is不为空,则关闭InputStream文件输入流
        if(is != null){
            try {
                is.close();
            } catch (IOException e) {
                // TODO: handle exception
                is = null;
            }
        }

        //如果reader不为空,则关闭BufferedReader文件输入流
        if(reader != null){
            try{
                reader.close();
            } catch (IOException e) {
                reader = null;
            }
        }

    }



    public static void main(String[] args) {

        try{

            ExcelReader er = new ExcelReader("D:/11.xls");  //该处的地址符号为:“/”
            String line = er.readLine();

            /**
             * 得到某一行的总列数(会将空格排除)
             */
            HSSFSheet sheet = er.workbook.getSheetAt(er.currSheet);
            HSSFRow rowline = sheet.getRow(10);
            int columnNum=rowline.getPhysicalNumberOfCells();   
            System.out.println("第15行的总列数为:"+columnNum);

            for (int i = 0; i < columnNum; i++) {

                //通过循环得到某一行某一列的数据
                HSSFCell cellinfo = rowline.getCell(i);
                System.out.println(cellinfo);
            }


            /**
             * 循环得到整张表
             */
            while(line != null){

                System.out.println(line);
                line = er.readLine();
            }

            er.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }




}

错误之处请指正

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值