zoukankan      html  css  js  c++  java
  • 【转】java 读取 excel 2003 或 excel 2007

    package com.my.login;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.text.DecimalFormat;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.poi.hssf.usermodel.HSSFDateUtil;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    /**
     * Excel数据读取工具 Description: [支持Excell2003,Excell2007,自动格式化数值型数据,自动格式化日期型数据]
     * <li>所需Jar包列表</li>
     * <li>poi-3.6-20091214.jar</li>
     * <li>poi-contrib-3.6-20091214.jar</li>
     * <li>poi-examples-3.6-20091214.jar</li>
     * <li>poi-ooxml-3.6-20091214.jar</li>
     * <li>poi-ooxml-schemas-3.6-20091214.jar</li>
     * <li>poi-scratchpad-3.6-20091214.jar</li>
     * <li>xmlbeans-2.3.0.jar</li>
     * 
     */
    public class POIExcelUtil {
        /** 总行数 */
        private int totalRows = 0;
    
        /** 总列数 */
        private int totalCells = 0;
    
        /** 构造方法 */
        public POIExcelUtil() {
        }
    
        /**
         * 根据文件名读取excel文件
         * 
         * @param fileName
         * @return
         */
        public List<ArrayList<String>> read(String fileName) {
            List<ArrayList<String>> dataLst = new ArrayList<ArrayList<String>>();
    
            /** 检查文件名是否为空或者是否是Excel格式的文件 */
            if (fileName == null || !fileName.matches("^.+\.(?i)((xls)|(xlsx))$")) {
                return dataLst;
            }
    
            boolean isExcel2003 = true;
            /** 对文件的合法性进行验证 */
            if (fileName.matches("^.+\.(?i)(xlsx)$")) {
                isExcel2003 = false;
            }
    
            /** 检查文件是否存在 */
            File file = new File(fileName);
            if (file == null || !file.exists()) {
                return dataLst;
            }
    
            try {
                /** 调用本类提供的根据流读取的方法 */
                dataLst = read(new FileInputStream(file), isExcel2003);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
    
            /** 返回最后读取的结果 */
            return dataLst;
        }
    
        /**
         * 根据流读取Excel文件
         * 
         * @param inputStream
         * @param isExcel2003
         * @return
         */
        public List<ArrayList<String>> read(InputStream inputStream,
                boolean isExcel2003) {
            List<ArrayList<String>> dataLst = null;
            try {
                /** 根据版本选择创建Workbook的方式 */
                Workbook wb = isExcel2003 ? (Workbook) new HSSFWorkbook(inputStream)
                        : new XSSFWorkbook(inputStream);
                dataLst = read(wb);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return dataLst;
        }
    
        /**
         * 得到总行数
         * 
         * @return
         */
        public int getTotalRows() {
            return totalRows;
        }
    
        /**
         * 得到总列数
         * 
         * @return
         */
        public int getTotalCells() {
            return totalCells;
        }
    
        /**
         * 读取数据
         * 
         * @param wb
         * @return
         */
        private List<ArrayList<String>> read(Workbook wb) {
            List<ArrayList<String>> dataLst = new ArrayList<ArrayList<String>>();
    
            /** 得到第一个shell */
            Sheet sheet = wb.getSheetAt(0);
            this.totalRows = sheet.getPhysicalNumberOfRows();
            if (this.totalRows >= 1 && sheet.getRow(0) != null) {
                this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
            }
    
            /** 循环Excel的行 */
            for (int r = 0; r < this.totalRows; r++) {
                Row row = sheet.getRow(r);
                if (row == null) {
                    continue;
                }
    
                ArrayList<String> rowLst = new ArrayList<String>();
                /** 循环Excel的列 */
                for (short c = 0; c < this.getTotalCells(); c++) {
                    Cell cell = row.getCell(c);
                    String cellValue = "";
                    if (cell == null) {
                        rowLst.add(cellValue);
                        continue;
                    }
    
                    /** 处理数字型的,自动去零 */
                    if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
                        /** 在excel里,日期也是数字,在此要进行判断 */
                        if (HSSFDateUtil.isCellDateFormatted(cell)) {
                            /*cellValue = DateUtil
                                    .get4yMdHms(cell.getDateCellValue());*/
                        } else {
                            cellValue = getRightStr(cell.getNumericCellValue() + "");
                        }
                    }
                    /** 处理字符串型 */
                    else if (Cell.CELL_TYPE_STRING == cell.getCellType()) {
                        cellValue = cell.getStringCellValue();
                    }
                    /** 处理布尔型 */
                    else if (Cell.CELL_TYPE_BOOLEAN == cell.getCellType()) {
                        cellValue = cell.getBooleanCellValue() + "";
                    }
                    /** 其它的,非以上几种数据类型 */
                    else {
                        cellValue = cell.toString() + "";
                    }
    
                    rowLst.add(cellValue);
                }
                dataLst.add(rowLst);
            }
            return dataLst;
        }
    
        /**
         * 正确地处理整数后自动加零的情况
         * 
         * @param sNum
         * @return
         */
        private String getRightStr(String sNum) {
            DecimalFormat decimalFormat = new DecimalFormat("#.000000");
            String resultStr = decimalFormat.format(new Double(sNum));
            if (resultStr.matches("^[-+]?\d+\.[0]+$")) {
                resultStr = resultStr.substring(0, resultStr.indexOf("."));
            }
            return resultStr;
        }
    
        /**
         * 测试main方法
         * 
         * @param args
         * @throws Exception
         */
        public static void main(String[] args) throws Exception {
            List<ArrayList<String>> dataLst = new POIExcelUtil()
                    .read("f:/20140530091130.xlsx");
            System.out.println("共有" + dataLst.size() + "行");
    
            StringBuffer tab = new StringBuffer();
            tab.append("<table border='1'>");
            for (ArrayList<String> innerLst : dataLst) {
                tab.append("<tr>");
    
                for (String dataStr : innerLst) {
                    tab.append("<td>");
    
                    tab.append(dataStr);
    
                    tab.append("</td>");
                }
                 
                tab.append("</tr>");
            }
            tab.append("</table>");
    
            System.out.println(tab.toString());
        }
    }

    转自 http://www.blogjava.net/hwpok/archive/2010/01/20/310263.html

  • 相关阅读:
    Ecshop支持用户名、邮箱或手机号码登录
    Ecshop模板在首页调用指定分类的热销、推荐、新品商品
    使用JQuery的全屏背景图片,自动适应各种屏幕和浏览器
    浏览器左下角提示网页上有错误解决方法
    设为首页、加入收藏
    Flash遮住Div的解决办法
    谷歌站内搜索的两种方式
    网页内插入百度、谷歌搜索引擎
    CSS透明滤镜
    Eclipse无Server或者Tomcat8.5解决办法
  • 原文地址:https://www.cnblogs.com/qqzy168/p/3761562.html
Copyright © 2011-2022 走看看