zoukankan      html  css  js  c++  java
  • Apache POI解析excel文件

    这里需要用到poi.jar和poi-ooxml.jar  没有的可以去http://mvnrepository.com/下载

      1 import org.apache.poi.POIXMLDocument;
      2 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
      3 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
      4 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
      5 import org.apache.poi.openxml4j.opc.OPCPackage;
      6 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
      7 import org.apache.poi.ss.usermodel.Cell;
      8 import org.apache.poi.ss.usermodel.Row;
      9 import org.apache.poi.ss.usermodel.Sheet;
     10 import org.apache.poi.ss.usermodel.Workbook;
     11 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
     12 
     13 import java.io.FileInputStream;
     14 import java.io.IOException;
     15 import java.io.InputStream;
     16 import java.io.PushbackInputStream;
     17 import java.text.SimpleDateFormat;
     18 import java.util.*;
     19 
     20 /**
     21  * Created by Donge on 2017/1/3.
     22  */
     23 public class ReadExcel {
     24 
     25     static private Workbook wb;
     26     static private Sheet sheet;
     27     static private Row row;
     28 
     29     /**
     30      * 读取 Excel 标题
     31      * @param fileName
     32      * @return
     33      */
     34     public static String[] readExcelTitle(String fileName) {
     35         try {
     36             wb = createWorkbook(new FileInputStream(fileName));
     37         } catch (IOException e) {
     38             e.printStackTrace();
     39         } catch (InvalidFormatException e) {
     40             e.printStackTrace();
     41         }
     42         sheet = wb.getSheetAt(0);
     43         row = sheet.getRow(0);// 获取第一行(约定第一行是标题行)
     44         int colNum = row.getLastCellNum();// 获取行的列数
     45         String[] titles = new String[colNum];
     46         for (int i = 0; i < titles.length; i++) {
     47             titles[i] = getCellFormatValue(row.getCell(i));
     48         }
     49         return titles;
     50     }
     51 
     52     /**
     53      * 读取 Excel 内容
     54      * @param fileName
     55      * @return
     56      */
     57     public static List<Map<String, String>> readExcelContent(String fileName) {
     58         List<Map<String, String>> list = new ArrayList<>();
     59         Map<String, String> content;
     60         try {
     61             wb = createWorkbook(new FileInputStream(fileName));
     62         } catch (IOException e) {
     63             e.printStackTrace();
     64         } catch (InvalidFormatException e) {
     65             e.printStackTrace();
     66         }
     67         sheet = wb.getSheetAt(0);
     68         int rowNum = sheet.getLastRowNum()+1;// 得到总行数
     69         row = sheet.getRow(0);
     70         int colNum = row.getLastCellNum();// 得到总列数
     71         String titles[] = readExcelTitle(fileName);
     72         // 正文内容应该从第二行开始,第一行为表头的标题
     73         for (int i = 1; i < rowNum; i++) {
     74             int j = 0;
     75             row = sheet.getRow(i);
     76             content = new LinkedHashMap<>();
     77             do {
     78                 content.put(titles[j], getCellFormatValue(row.getCell(j)).trim());
     79                 j++;
     80             } while (j < colNum);
     81             list.add(content);
     82         }
     83         return list;
     84     }
     85 
     86     /**
     87      * 根据Cell类型设置数据
     88      * @param cell
     89      * @return
     90      */
     91     private static String getCellFormatValue(Cell cell) {
     92         String cellValue = " ";
     93         if (cell != null) {
     94             // 判断当前Cell的Type
     95             switch (cell.getCellType()) {
     96                 // 如果当前Cell的Type为NUMERIC
     97                 case Cell.CELL_TYPE_NUMERIC:
     98                 case Cell.CELL_TYPE_FORMULA: {
     99                     // 判断当前的cell是否为Date
    100                     if (HSSFDateUtil.isCellDateFormatted(cell)) {
    101                         Date date = cell.getDateCellValue();
    102                         cellValue = new SimpleDateFormat("yyyy-MM-dd").format(date);// 时间格式化显示:2012-12-31
    103                     } else {
    104                         // 如果是纯数字取得当前Cell的数值
    105                         cellValue = String.valueOf(cell.getNumericCellValue());
    106                     }
    107                     break;
    108                 }
    109                 // 如果当前Cell的Type为STRIN
    110                 case Cell.CELL_TYPE_STRING:
    111                     cellValue = cell.getRichStringCellValue().getString();
    112                     break;
    113                 default:
    114                     // 默认的Cell值
    115                     cellValue = " ";
    116             }
    117         }
    118         return cellValue;
    119 
    120     }
    121 
    122     /**
    123      * 创建 Workbook
    124      * @param is
    125      * @return
    126      * @throws IOException
    127      * @throws InvalidFormatException
    128      */
    129     public static Workbook createWorkbook(InputStream is) throws IOException,InvalidFormatException {
    130         if (!is.markSupported()) {
    131             is = new PushbackInputStream(is, 8);
    132         }
    133         if (POIFSFileSystem.hasPOIFSHeader(is)) {
    134             return new HSSFWorkbook(is);
    135         }
    136         if (POIXMLDocument.hasOOXMLHeader(is)) {
    137             return new XSSFWorkbook(OPCPackage.open(is));
    138         }
    139         throw new IllegalArgumentException("POI解析不了您当前的Excel版本");
    140     }
    141 
    142     /**
    143      * 测试
    144      * @param args
    145      */
    146     public static void main(String args[]) {
    147         String filePath = "D:\\Test.xls";
    148         List<Map<String, String>> list = readExcelContent(filePath);
    149         Map<String, String> map;
    150         for (int i = 0; i < list.size(); i++) {
    151             map = list.get(i);
    152             System.out.println("**************THE START OF ROW("+(i+1)+")**************");
    153             for (String key : map.keySet()) {
    154                 System.out.println(key + " : " + map.get(key));
    155             }
    156         }
    157     }
    158 }
  • 相关阅读:
    leetcode 851. Loud and Rich
    674. 最长连续递增序列
    896. 单调数列
    905. 按奇偶排序数组
    917. 仅仅反转字母
    922. 按奇偶排序数组 II
    925. 长按键入
    929. 独特的电子邮件地址
    933. 最近的请求次数
    自己动手丰衣足食写java贪吃蛇
  • 原文地址:https://www.cnblogs.com/liqingdong/p/6245468.html
Copyright © 2011-2022 走看看