好久没用 最近项目有冲突 所以又用到了这个

谁知道以后还会不会用 先记下来吧 直接扔项目里 调方法就OK 了。

记录一下。。。。不想再写类似这样的东西了

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class ReadExcelUtil {
     private POIFSFileSystem fs;
        private HSSFWorkbook wb;
        private HSSFSheet sheet;
        private HSSFRow row;

/**
         * 读取Excel表格表头的内容
         * @param is
         * @return String 表头内容的数组
         */
        public String[] readExcelTitle(InputStream is) {
            try {
                fs = new POIFSFileSystem(is);
                wb = new HSSFWorkbook(fs);
            } catch (IOException e) {
                e.printStackTrace();
            }
            sheet = wb.getSheetAt(0);
            //得到首行的row
            row = sheet.getRow(0);
            // 标题总列数
            int colNum = row.getPhysicalNumberOfCells();
            String[] title = new String[colNum];
            for (int i = 0; i < colNum; i++) {
                title[i] = getCellFormatValue(row.getCell((short) i));
            }
            return title;
        }

/**
         * 读取Excel数据内容
         * @param is
         * @return Map 包含单元格数据内容的Map对象
         */
        public Map<Integer, String> readExcelContent(InputStream is) {
            Map<Integer, String> content = new HashMap<Integer, String>();
            String str = "";
            String strCell = "";
            try {
                fs = new POIFSFileSystem(is);
                wb = new HSSFWorkbook(fs);
            } catch (IOException e) {
                e.printStackTrace();
            }
            sheet = wb.getSheetAt(0);
            // 得到总行数
            int rowNum = sheet.getLastRowNum();
            //由于第0行和第一行已经合并了  在这里索引从2开始
            row = sheet.getRow(2);
            int colNum = row.getPhysicalNumberOfCells();
            // 正文内容应该从第二行开始,第一行为表头的标题
            for (int i = 2; i <= rowNum; i++) {
                row = sheet.getRow(i);
                int j = 0;
                while (j < colNum) {
                    strCell = getStringCellValue(row.getCell(j));
                    str += strCell + "-";
                   // str +=row.getCell((short) j) + "^";
                    j++;
                }
                content.put(i, str);
                str = "";
            }
            return content;
        }

/**
         * 获取单元格数据内容为字符串类型的数据
         *
         * @param cell Excel单元格
         * @return String 单元格数据内容
         */
        private String getStringCellValue(HSSFCell cell) {
            String strCell = "";
            switch (cell.getCellType()) {
                case HSSFCell.CELL_TYPE_STRING:
                    strCell = cell.getStringCellValue();
                    break;
                case HSSFCell.CELL_TYPE_NUMERIC:
                    strCell = String.valueOf((int)cell.getNumericCellValue());
                    break;
                case HSSFCell.CELL_TYPE_BOOLEAN:
                    strCell = String.valueOf(cell.getBooleanCellValue());
                    break;
                case HSSFCell.CELL_TYPE_BLANK:
                    strCell = "";
                    break;
                default:
                    strCell = "";
                    break;
            }
            if (strCell.equals("") || strCell == null) {
                return "";
            }
            if (cell == null) {
                return "";
            }
            return strCell;
        }

/**
         * 获取单元格数据内容为日期类型的数据
         *
         * @param cell
         *            Excel单元格
         * @return String 单元格数据内容
         */
        private String getDateCellValue(HSSFCell cell) {
            String result = "";
            try {
                int cellType = cell.getCellType();
                if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
                    Date date = cell.getDateCellValue();
                    result = (date.getYear() + 1900) + "-" + (date.getMonth() + 1)
                            + "-" + date.getDate();
                } else if (cellType == HSSFCell.CELL_TYPE_STRING) {
                    String date = getStringCellValue(cell);
                    result = date.replaceAll("[年月]", "-").replace("日", "").trim();
                } else if (cellType == HSSFCell.CELL_TYPE_BLANK) {
                    result = "";
                }
            } catch (Exception e) {
                System.out.println("日期格式不正确!");
                e.printStackTrace();
            }
            return result;
        }

/**
         * 根据HSSFCell类型设置数据
         * @param cell
         * @return
         */
        private String getCellFormatValue(HSSFCell cell) {
            String cellvalue = "";
            if (cell != null) {
                // 判断当前Cell的Type
                switch (cell.getCellType()) {
                    // 如果当前Cell的Type为NUMERIC
                    case HSSFCell.CELL_TYPE_NUMERIC:
                    case HSSFCell.CELL_TYPE_FORMULA: {
                        // 判断当前的cell是否为Date
                        if (HSSFDateUtil.isCellDateFormatted(cell)) {
                            Date date = cell.getDateCellValue();
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                            cellvalue = sdf.format(date);
                        }
                        // 如果是纯数字
                        else {
                            // 取得当前Cell的数值
                            cellvalue = String.valueOf(cell.getNumericCellValue());
                        }
                        break;
                    }
                    // 如果当前Cell的Type为STRIN
                    case HSSFCell.CELL_TYPE_STRING:
                        // 取得当前的Cell字符串
                        cellvalue = cell.getRichStringCellValue().getString();
                        break;
                    // 默认的Cell值
                    default:
                        cellvalue = " ";
                }
            } else {
                cellvalue = "";
            }
            return cellvalue;

}

public static void main(String[] args) {
            try {
                // 对读取Excel表格标题测试
                InputStream is = new FileInputStream("d:\\test2.xls");
                ReadExcelUtil excelReader = new ReadExcelUtil();
                String[] title = excelReader.readExcelTitle(is);
                System.out.println("获得Excel表格的标题:");
                for (String s : title) {
                    System.out.print(s + " ");
                }
                System.out.println();

// 对读取Excel表格内容测试
                InputStream is2 = new FileInputStream("d:\\test2.xls");
                Map<Integer, String> map = excelReader.readExcelContent(is2);
                System.out.println("获得Excel表格的内容:");
                //这里由于xls合并了单元格需要对索引特殊处理
                for (int i = 2; i <= map.size()+1; i++) {
                    System.out.println(map.get(i));
                }

} catch (FileNotFoundException e) {
                System.out.println("未找到指定路径的文件!");
                e.printStackTrace();
            }
        }

}
 
---------------------

POI原生导入读取EXCEL的更多相关文章

  1. POI 4.0 读取Excel

    ... package POIXLS; import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; ...

  2. 使用Apache下poi创建和读取excel文件

    一:使用apache下poi创建excel文档 @Test /* * 使用Apache poi创建excel文件 */ public void testCreateExcel() { // 1:创建一 ...

  3. Java利用POI实现导入导出Excel表格示例代码

    转自:https://www.jb51.net/article/95526.htm 介绍 Jakarta POI 是一套用于访问微软格式文档的Java API.Jakarta POI有很多组件组成,其 ...

  4. Java小知识----POI事件模式读取Excel 2007

    一.知识背景 1.读取excel的方法选择问题 java中读excel中的时间,我们通常用POI去解析,在使用new HSSFWorkbook(NEW FileInputStream(excelFil ...

  5. 结合Poi实现可读取Excel的文件选择对话框

    第一步:ApachePoi的jar包导全,不全会出现异常. 第二步:写就完事了:此例为读取特定模板的excel,仅供参考,根据实际需求改写. package 自建包; import java.awt. ...

  6. java使用poi.3.10读取excel 2003 (xls格式)

    最近在做一个Excel导入数据库的案例,整理文档出来供大家参考. 1.下载 最新的 poi http://poi.apache.org/download.html    2.解压 把相关jar包引进项 ...

  7. 用POI 3.17读取EXCEL数据

    导入jar 包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</a ...

  8. JAVA导入(读取)Excel中的数据(支持xls与xlsx文件)

    一.导入jar包 poi-3.7.jarpoi-scratchpad-3.7.jarpoi-examples-3.7.jarpoi-ooxml-3.7.jarpoi-ooxml-schemas-3.7 ...

  9. 使用apache的poi实现导入导出excel

    1.jar包:poi-3.14-20160307.jar.poi-ooxml-3.14-20160307.jar 2.导入(本例实现了解析excel生成List): @Override public ...

随机推荐

  1. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE【转】

    本文转载自:http://www.cnblogs.com/52php/p/5681745.html 前言: 开发了5,6年的时间,如果没有KDE4,也许不会有人或者Linux发行版本重视cmake,因 ...

  2. AngularJS 指令实践指南(二)

    这个系列教程的第一部分给出了AngularJS指令的基本概述,在文章的最后我们介绍了如何隔离一个指令的scope.第二部分将承接上一篇继续介绍.首先,我们会看到在使用隔离scope的情况下,如何从指令 ...

  3. Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)——无非是在传统遍历过程中修改叶子结点加入后继结点信息(传统是stack记录),然后再删除恢复

    先看看线索二叉树 n个结点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域.利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索 ...

  4. UIImage加载方式

    前言 关于本地图片UIImage的加载问题,还是需要注意的.不同的加载处理方式,在效率和性能上还是有差异的. 今天,我们来讲讲UIImage的加载应该选择什么样的API来加载! 两种API 这两种AP ...

  5. I.MX6 dhcpcd 需要指定网卡

    /************************************************************************** * I.MX6 dhcpcd 需要指定网卡 * ...

  6. angular中transclude的理解

    今天被这个transclude搞糊涂了,弄了半天,才知道原来使用起来很简单.很烦恼为社么书中的对于这个的介绍这么晦涩难懂.直到看到了这篇文章,才让我弄清楚了. 一.transclude介绍 trans ...

  7. python 高阶函数三 filter()和sorted()

    一.filter()函数 filter()接收一个函数和一个序列.filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素. >>> ...

  8. 洛谷 P4015 运输问题 【最小费用最大流+最大费用最大流】

    s向仓库i连ins(s,i,a[i],0),商店向t连ins(i+m,t,b[i],0),商店和仓库之间连ins(i,j+m,inf,c[i][j]).建两次图分别跑最小费用最大流和最大费用最大流即可 ...

  9. bzoj 1150: [CTSC2007]数据备份Backup【链表+堆】

    参考:http://blog.csdn.net/Regina8023/article/details/44158947 神奇的做法.题意相当于若干个数取不相邻的k个使最小.先把数组差分,len表示这段 ...

  10. 安装配置Eclipse Python开发插件PyDev

    一.PyDev安装的版本要求 PyDev是支持在Eclipse中进行Python程序开发的插件,Pydev官方的说法是需要安装 java 8 and Eclipse 4.6 (Neon),当然,你也可 ...