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

来源:互联网 发布:ios9 数据流量 开关 编辑:程序博客网 时间:2024/06/08 10:17

今天闲暇了解了一下通过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();        }    }}

错误之处请指正