A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© YC匪帮 中级黑马   /  2015-9-21 20:37  /  382 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.s2sh.test;
  2. import java.io.BufferedReader;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.util.Date;
  8. import org.apache.poi.hssf.usermodel.HSSFCell;
  9. import org.apache.poi.hssf.usermodel.HSSFDateUtil;
  10. import org.apache.poi.hssf.usermodel.HSSFRow;
  11. import org.apache.poi.hssf.usermodel.HSSFSheet;
  12. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  13. public class ExcelReader {
  14.         //创建文件输入流
  15.         private BufferedReader reader = null;
  16.         //文件类型
  17.         private String fileType;
  18.        
  19.         //文件二进制输入流
  20.         private InputStream is = null;
  21.         //当前sheet
  22.         private int currSheet;
  23.         //当前位置
  24.         private int currPosition;
  25.         //sheet数量
  26.         private int numOfSheets;
  27.         //HSSFWorkbook
  28.         HSSFWorkbook workbook = null;
  29.         //设置cell之间以空格分隔
  30.         private static String EXCEL_LINE_DELIMITER = "";
  31.         //设置最大列数
  32.         private static int MAX_EXCEL_COLUMNS = 64;
  33.        
  34.         //构造函数创建一个ExcelReader
  35.         public ExcelReader(String inputfile) throws IOException,Exception {
  36.                 //判断参数是否为空或者没有意义
  37.                 if(null == inputfile && "".equals(inputfile.trim())) {
  38.                         throw new IOException("no input file specified");
  39.                 }
  40.                 //取得文件名后缀赋值给fileType
  41.                 this.fileType = inputfile.substring(inputfile.lastIndexOf(".")+1);
  42.                 //设置开始行为0
  43.                 currPosition = 0;
  44.                 //设置当前位置为0
  45.                 currSheet = 0;
  46.                 //创建输入流
  47.                 is = new FileInputStream(inputfile);
  48.                 //判断文件格式
  49.                 if(fileType.equalsIgnoreCase("txt")) {
  50.                         //如果是txt则直接创建BufferReader读取
  51.                         reader = new BufferedReader(new InputStreamReader(is));
  52.                 }
  53.                 else if(fileType.equalsIgnoreCase("xls")) {
  54.                         //如果是Excel文件则创建HSSFWorkbook读取
  55.                         workbook = new HSSFWorkbook(is);
  56.                         //设置sheet数
  57.                         numOfSheets = workbook.getNumberOfSheets();
  58.                 }else {
  59.                         throw new Exception("File Type not Supported");
  60.                 }
  61.                
  62.         }
  63.        
  64.         //函数readLine读取文本的一行
  65.         public String readLine() throws IOException {
  66.                 //如果是txt则通过reader读取
  67.                 if(fileType.equalsIgnoreCase("txt")) {
  68.                         String str = reader.readLine();
  69.                         //空行则略去,直接读取下一行
  70.                         while(str.trim().equals("")) {
  71.                                 str = reader.readLine();
  72.                         }
  73.                         return str;
  74.                 }
  75.                 //如果是xls文件则通过POI提供给的API读取文件
  76.                 else if(fileType.equalsIgnoreCase("xls")) {
  77.                         //根据currSheet值获得当前的sheet
  78.                         HSSFSheet sheet = workbook.getSheetAt(currSheet);
  79.                         //判断当前行是否到当前sheet的结尾
  80.                         if(currPosition > sheet.getLastRowNum()) {
  81.                                 //当前行位置清零
  82.                                 currPosition = 0;
  83.                                 //判断是否还有Sheet
  84.                                 while(currSheet != numOfSheets -1){
  85.                                         //得到下一个sheet
  86.                                         sheet = workbook.getSheetAt(currSheet+1);
  87.                                         //判断当前行是否到当前sheet的结尾
  88.                                         if(currPosition == sheet.getLastRowNum()) {
  89.                                                 currSheet++;
  90.                                                 continue;
  91.                                         }else {
  92.                                                 //获取当前行数
  93.                                                 int row = currPosition;
  94.                                                 currPosition++;
  95.                                                 //读取当前行数据
  96.                                                 return getLine(sheet,row);
  97.                                         }
  98.                                 }
  99.                                 return null;
  100.                         }
  101.                         //获取当前行数
  102.                         int row = currPosition;
  103.                         currPosition++;
  104.                         //读取当前行数据
  105.                         return getLine(sheet,row);
  106.                 }
  107.                 return null;
  108.         }
  109.         //函数getLine返回sheet的一行数据
  110.         private String getLine (HSSFSheet sheet,int row) {
  111.                 //根据行数取得sheet的一行
  112.                 HSSFRow rowLine = sheet.getRow(row);
  113.                 //创建字符串缓冲区
  114.                 StringBuffer buffer = new StringBuffer();
  115.                 //获取挡前行的列数
  116.                 int filledColumns = rowLine.getLastCellNum();
  117.                 HSSFCell cell = null;
  118.                 //循环遍历所有列
  119.                 for(int i=0;i<filledColumns;i++) {
  120.                         //取得当前cell
  121.                         cell = rowLine.getCell(i);
  122.                         String cellValue = null;
  123.                         if(null != cell) {
  124.                                 //判断当前cell的type
  125.                                 switch(cell.getCellType()) {
  126.                                         //如果当前cell的type为NUMERIC
  127.                                         case HSSFCell.CELL_TYPE_NUMERIC : {
  128.                                                 //判断当前cell是否为Date
  129.                                                 if(HSSFDateUtil.isCellDateFormatted(cell)){
  130.                                                         //如果是Date类型,取得该Cell的Date值
  131.                                                         Date date = cell.getDateCellValue();
  132.                                                         //把Date转换成本地格式的字符串
  133.                                                         cellValue = new  java.text.SimpleDateFormat( " yyyy-MM-dd HH:mm " ).format(cell.getDateCellValue());
  134.                                                 }
  135.                                                 //如果是纯数字
  136.                                                 else {
  137.                                                         //取得当前cell的数值
  138.                                                         Integer num = new Integer((int)cell.getNumericCellValue());//默认返回时double类型
  139.                                                         cellValue = String.valueOf(num);
  140.                                                 }
  141.                                                 break;
  142.                                         }
  143.                                         //如果当前cell的type为String
  144.                                         case HSSFCell.CELL_TYPE_STRING :
  145.                                                 //取得当前shell的字符串
  146.                                                 cellValue = cell.getStringCellValue().replaceAll("/'", "/"");
  147.                                                 break;
  148.                                         //默认的cell值
  149.                                         default:
  150.                                                 cellValue = "";
  151.                                 }
  152.                         }else {
  153.                                 cellValue = "";
  154.                         }
  155.                         //在每个字段之间插入分隔符
  156.                         buffer.append(cellValue).append(EXCEL_LINE_DELIMITER);
  157.                 }
  158.                 //以字符串返回该行的数据
  159.                 return buffer.toString();
  160.         }
  161.        
  162.         //close函数执行流的关闭操作
  163.         public void close() {
  164.                 //如果id不为空,则关闭InputStream文件输入流
  165.                 if(is != null) {
  166.                         try {
  167.                                 is.close();
  168.                         }catch(IOException e) {
  169.                                 is = null;
  170.                         }
  171.                 }
  172.                
  173.                 //如果reader不为空,则关闭BufferedReader文件输入流
  174.                 if(reader != null) {
  175.                         try {
  176.                                 reader.close();
  177.                         }catch(IOException e) {
  178.                                 reader = null;
  179.                         }
  180.                 }
  181.         }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马