使用poi来解析Excel的xls和xlsx

解析xls:
Java代码   收藏代码
  1. package xls;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import org.apache.poi.hssf.usermodel.HSSFCell;  
  7. import org.apache.poi.hssf.usermodel.HSSFRow;  
  8. import org.apache.poi.hssf.usermodel.HSSFSheet;  
  9. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  10.   
  11. public class XlsMain {  
  12.   
  13.   public static void main( String[] args) throws IOException {  
  14.     XlsMain xlsMain = new XlsMain();  
  15.       
  16.     xlsMain.readXls();  
  17.   }  
  18.   
  19.   private void readXls() throws IOException{  
  20.     InputStream is = new FileInputStream( "D:\\excel\\xls_test2.xls");  
  21.     HSSFWorkbook hssfWorkbook = new HSSFWorkbook( is);   
  22.       
  23.     // 循环工作表Sheet  
  24.     for(int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++){  
  25.       HSSFSheet hssfSheet = hssfWorkbook.getSheetAt( numSheet);  
  26.       if(hssfSheet == null){  
  27.         continue;  
  28.       }  
  29.         
  30.       // 循环行Row   
  31.       for(int rowNum = 0; rowNum <= hssfSheet.getLastRowNum(); rowNum++){  
  32.         HSSFRow hssfRow = hssfSheet.getRow( rowNum);  
  33.         if(hssfRow == null){  
  34.           continue;  
  35.         }  
  36.           
  37.         // 循环列Cell    
  38.         for(int cellNum = 0; cellNum <= hssfRow.getLastCellNum(); cellNum++){  
  39.           HSSFCell hssfCell = hssfRow.getCell( cellNum);  
  40.           if(hssfCell == null){  
  41.             continue;  
  42.           }  
  43.             
  44.           System.out.print("    " + getValue( hssfCell));  
  45.         }  
  46.         System.out.println();  
  47.       }  
  48.     }  
  49.   }  
  50.     
  51.   @SuppressWarnings("static-access")  
  52.   private String getValue(HSSFCell hssfCell){  
  53.     if(hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN){  
  54.       return String.valueOf( hssfCell.getBooleanCellValue());  
  55.     }else if(hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC){  
  56.       return String.valueOf( hssfCell.getNumericCellValue());  
  57.     }else{  
  58.       return String.valueOf( hssfCell.getStringCellValue());  
  59.     }  
  60.   }  
  61.     
  62. }  


解析xlsx:
Java代码   收藏代码
  1. package xlsx;  
  2.   
  3. import java.io.IOException;  
  4. import org.apache.poi.xssf.usermodel.XSSFCell;  
  5. import org.apache.poi.xssf.usermodel.XSSFRow;  
  6. import org.apache.poi.xssf.usermodel.XSSFSheet;  
  7. import org.apache.poi.xssf.usermodel.XSSFWorkbook;  
  8.   
  9. public class XlsxMain {  
  10.   
  11.   public static void main( String[] args) throws IOException {  
  12.     XlsxMain xlsxMain = new XlsxMain();  
  13.       
  14.     xlsxMain.readXlsx();  
  15.   }  
  16.   
  17.   private void readXlsx() throws IOException{  
  18.     String fileName = "D:\\excel\\xlsx_test.xlsx";  
  19.     XSSFWorkbook xssfWorkbook = new XSSFWorkbook( fileName);  
  20.       
  21.     // 循环工作表Sheet  
  22.     for(int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++){  
  23.       XSSFSheet xssfSheet = xssfWorkbook.getSheetAt( numSheet);  
  24.       if(xssfSheet == null){  
  25.         continue;  
  26.       }  
  27.         
  28.       // 循环行Row   
  29.       for(int rowNum = 0; rowNum <= xssfSheet.getLastRowNum(); rowNum++ ){  
  30.         XSSFRow xssfRow = xssfSheet.getRow( rowNum);  
  31.         if(xssfRow == null){  
  32.           continue;  
  33.         }  
  34.           
  35.         // 循环列Cell     
  36.         for(int cellNum = 0; cellNum <= xssfRow.getLastCellNum(); cellNum++){  
  37.           XSSFCell xssfCell = xssfRow.getCell( cellNum);  
  38.           if(xssfCell == null){  
  39.             continue;  
  40.           }  
  41.           System.out.print("   "+getValue(xssfCell));  
  42.         }  
  43.         System.out.println();  
  44.       }  
  45.     }  
  46.   }  
  47.     
  48.   @SuppressWarnings("static-access")  
  49.   private String getValue(XSSFCell xssfCell){  
  50.     if(xssfCell.getCellType() == xssfCell.CELL_TYPE_BOOLEAN){  
  51.       return String.valueOf( xssfCell.getBooleanCellValue());  
  52.     }else if(xssfCell.getCellType() == xssfCell.CELL_TYPE_NUMERIC){  
  53.       return String.valueOf( xssfCell.getNumericCellValue());  
  54.     }else{  
  55.       return String.valueOf( xssfCell.getStringCellValue());  
  56.     }  
  57.   }  
  58.     
  59. }  






由于豆丁网不能复制,只能一行代码一行代码的敲。

  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.     }  

测试类:

  1. public class ExcelReaderTest {  
  2.     /** 
  3.      * @param args 
  4.      */  
  5.     public static void main(String[] args) {  
  6.         try {  
  7.             ExcelReader er = new ExcelReader("D://SAPI//task//CBS00087558//records.xls");  
  8.             String line = er.readLine();  
  9.             while(line != null) {  
  10.                 System.out.println(line);  
  11.                 line = er.readLine();  
  12.             }  
  13.             er.close();  
  14.         }catch(Exception e) {  
  15.             e.printStackTrace();  
  16.         }  
  17.     }  


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值