zoukankan      html  css  js  c++  java
  • java使用POI进行 Excel文件解析

      

    package com.timevale.esign.vip.util;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import net.sf.json.JSONObject;
    
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.CellStyle;
    import org.apache.poi.ss.usermodel.DateUtil;
    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.ss.usermodel.WorkbookFactory;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.timevale.esign.db.bean.ErrRefLog;
    import com.timevale.esign.db.utils.StringUtil;
    import com.timevale.esign.db.utils.UUIDGenerator;
    import com.timevale.esign.vip.bean.ExcelDataBean;
    import com.timevale.esign.vip.constants.ExcelConstans;
    
    /**
     * 类名:ExcellUtils.java <br/>
     * 功能说明:excel解析工具类 <br/>
     * 修改历史: <br/>
     * 1.[2015年10月13日上午9:59:25]创建类 by hewu
     */
    public class ExcelUtil {
    
        Workbook wb = null;
    
        List<String[]> dataList = new ArrayList<String[]>(100);
    
        private Logger LOG = LoggerFactory.getLogger(ExcelUtil.class);
    
        /**
         * 功能说明:构造器
         * @param path 修改历史:<br/>
         *            1.[2015年10月13日下午3:52:19] 创建方法 by hewu
         */
        public ExcelUtil(final String path) {
            try {
                final InputStream inp = new FileInputStream(path);
                this.wb = WorkbookFactory.create(inp);
            } catch (FileNotFoundException e) {
                LOG.error("error to find excel File .", e);
                e.printStackTrace();
            } catch (InvalidFormatException e) {
                LOG.error("error to InvalidFormat excel File .", e);
                e.printStackTrace();
            } catch (IOException e) {
                LOG.error("error to deal excel File and found a IOException.", e);
                e.printStackTrace();
            }
        }
    
        public ExcelUtil() {
    
            super();
        }
    
        /**
         * 功能说明:读取Excel所有数据,包含header
         * @param sheetIndex sheet下标
         * @return <br/>
         *         修改历史:<br/>
         *         1.[2015年10月13日下午3:21:47] 创建方法 by hewu
         */
        public final ExcelDataBean readExcel(int sheetIndex) {
            ExcelDataBean bean = new ExcelDataBean();
            int columnNum = 0;
            final Sheet sheet = this.wb.getSheetAt(sheetIndex);
            String name = sheet.getRow(0).getCell(0).getStringCellValue().trim();
            if (name.contains("企业")) {
                bean.setType(ExcelConstans.USER_TYPE_ORGANIZE);
            } else {
                bean.setType(ExcelConstans.USER_TYPE_PERSON);
            }
            if (sheet.getRow(0) != null) {
                columnNum = sheet.getRow(0).getLastCellNum()
                        - sheet.getRow(0).getFirstCellNum();
            }
            if (columnNum > 0) {
                // for (Row row : sheet) {
                int rowNum = sheet.getLastRowNum();
                for (int k = 1; k <= rowNum; k++) {
                    final String[] singleRow = new String[columnNum];
                    int n = 0;
                    for (int i = 0; i < columnNum; i++) {
                        final Cell cell = sheet.getRow(k).getCell(i,
                                Row.CREATE_NULL_AS_BLANK);
                        switch (cell.getCellType()) {
                        case Cell.CELL_TYPE_BLANK:
                            singleRow[n] = "";
                            break;
                        case Cell.CELL_TYPE_BOOLEAN:
                            singleRow[n] = Boolean.toString(cell
                                    .getBooleanCellValue());
                            break;
                        // 数值
                        case Cell.CELL_TYPE_NUMERIC:
                            if (DateUtil.isCellDateFormatted(cell)) {
                                singleRow[n] = String.valueOf(cell
                                        .getDateCellValue());
                            } else {
                                cell.setCellType(Cell.CELL_TYPE_STRING);
                                String temp = cell.getStringCellValue();
                                // 判断是否包含小数点,如果不含小数点,则以字符串读取,如果含小数点,则转换为Double类型的字符串
                                if (temp.indexOf(".") > -1) {
                                    singleRow[n] = String.valueOf(new Double(temp))
                                            .trim();
                                } else {
                                    singleRow[n] = temp.trim();
                                }
                            }
                            break;
                        case Cell.CELL_TYPE_STRING:
                            singleRow[n] = cell.getStringCellValue().trim();
                            break;
                        case Cell.CELL_TYPE_ERROR:
                            singleRow[n] = "";
                            break;
                        case Cell.CELL_TYPE_FORMULA:
                            cell.setCellType(Cell.CELL_TYPE_STRING);
                            singleRow[n] = cell.getStringCellValue();
                            if (singleRow[n] != null) {
                                singleRow[n] = singleRow[n].replaceAll("#N/A", "")
                                        .trim();
                            }
                            break;
                        default:
                            singleRow[n] = "";
                            break;
                        }
                        n++;
                    }
                    // 如果第一行为空,跳过
                    final StringBuffer str1 = new StringBuffer();
                    for (int t = 0; t < columnNum; t++) {
                        str1.append(singleRow[t]);
                    }
                    if (!StringUtil.isNull(str1.toString())) {
                        this.dataList.add(singleRow);
                    }
                }
            }
            bean.setColData(dataList);
            return bean;
        }
    
        /**
         * 功能说明:读取Excel,返回Excel最大行index值,实际行数要加1
         * @param sheetIndex sheet下标
         * @return <br/>
         *         修改历史:<br/>
         *         1.[2015年10月13日下午3:21:58] 创建方法 by hewu
         */
        public final int getRowNum(final int sheetIndex) {
            final Sheet sheet = this.wb.getSheetAt(sheetIndex);
            return sheet.getLastRowNum();
        }
    
        /**
         * 功能说明:读取Excel,返回数据的列数
         * @param sheetIndex sheet下标
         * @return int <br/>
         *         修改历史:<br/>
         *         1.[2015年10月13日下午3:22:07] 创建方法 by hewu
         */
        public final int getColumnNum(final int sheetIndex) {
            final Sheet sheet = this.wb.getSheetAt(sheetIndex);
            final Row row = sheet.getRow(0);
            if (row != null && row.getLastCellNum() > 0) {
                return row.getLastCellNum();
            }
            return 0;
        }
    
        /**
         * 读取Excel,获取某一行数据
         * @param sheetIndex sheet下标
         * @param rowIndex 计数从0开始,rowIndex为0代表header行
         * @return String[] 修改历史:<br/>
         *         1.[2015年10月13日下午3:22:07] 创建方法 by hewu
         */
        public final String[] getRowData(final int sheetIndex, final int rowIndex) {
            String[] dataArray = null;
            if (rowIndex > this.getColumnNum(sheetIndex)) {
                return dataArray;
            } else {
                dataArray = new String[this.getColumnNum(sheetIndex)];
                return this.dataList.get(rowIndex);
            }
    
        }
    
        /**
         * 功能说明:读取Excel获取某一列数据
         * @param sheetIndex sheet下标
         * @param colIndex 列下标
         * @return <br/>
         *         修改历史:<br/>
         *         1.[2015年10月13日下午3:22:46] 创建方法 by hewu
         */
        public final String[] getColumnData(final int sheetIndex, final int colIndex) {
            String[] dataArray = null;
            if (colIndex > this.getColumnNum(sheetIndex)) {
                return dataArray;
            } else {
                if (this.dataList != null && this.dataList.size() > 0) {
                    dataArray = new String[this.getRowNum(sheetIndex) + 1];
                    int index = 0;
                    for (String[] rowData : this.dataList) {
                        if (rowData != null) {
                            dataArray[index] = rowData[colIndex];
                            index++;
                        }
                    }
                }
            }
            return dataArray;
    
        }
    
        /**
         * 功能说明:导出excel(按照参数 userType导出个人/企业的失败日志)
         * @param templatePath 导出模板路径
         * @param ErrRefLogs 错误对象
         * @param userType 用户类型
         * @return String 导出的excel的临时文件<br/>
         *         修改历史:<br/>
         *         1.[2015年10月13日下午8:06:48] 创建方法 by hewu
         */
        public String writeExcel(String templatePath, List<ErrRefLog> errRefLogs,
                int userType) {
            String onceFile = "";
            onceFile = FileUtil.Copy(new File(templatePath), getClass()
                    .getResource("/errlog").getFile()
                    + UUIDGenerator.getUUID()
                    + ".xlsx");
            FileInputStream input = null;
            Workbook workbook = null;
            String regStr = "[\【\,\】]";
            try {
                input = new FileInputStream(new File(onceFile));
                workbook = WorkbookFactory.create(input);
            } catch (Exception e) {
                e.printStackTrace();
                this.LOG.error("error to create write Excel", e);
            }
            final Sheet sheet = workbook.getSheetAt(0);
            if (userType == ExcelConstans.USER_TYPE_PERSON) {
                // 解析每一条数据,增加行
                for (int i = 0; i < errRefLogs.size(); i++) {
                    ErrRefLog log = errRefLogs.get(i);
                    final Row row = sheet.createRow(i
                            + ExcelConstans.EXCEL_START_INDEX);
                    // 增加列数据
                    // ErrRefLog errRefLog = ErrRefLogs.get(i);
                    final CellStyle ss = workbook.createCellStyle();
                    ss.setLocked(false);
    
                    final Cell nameC = row.createCell(0);
                    nameC.setCellStyle(ss);
                    nameC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    nameC.setCellValue(log.getName());// 写入内容
    
                    final Cell mobileC = row.createCell(1);
                    mobileC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    mobileC.setCellStyle(ss);
                    mobileC.setCellValue(log.getMobile());// 写入内容
    
                    final Cell idNoC = row.createCell(2);
                    idNoC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    idNoC.setCellStyle(ss);
                    idNoC.setCellValue(log.getIdNo());// 写入内容
    
    //                final Cell emailC = row.createCell(3);
    //                emailC.setCellType(XSSFCell.CELL_TYPE_STRING);
    //                emailC.setCellStyle(ss);
    //                emailC.setCellValue(log.getEmail());// 写入内容
    
                    final Cell companyC = row.createCell(3);
                    companyC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    companyC.setCellStyle(ss);
                    companyC.setCellValue(log.getOrgan());// 写入内容
    
                    StringBuffer errReason = new StringBuffer();
                    final Cell reasonC = row.createCell(4);
                    reasonC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    reasonC.setCellStyle(ss);
                    if(log.getErrReason().contains("【")){
                        String [] reason = log.getErrReason().split(regStr);
                        errReason.append(reason[0]+"【");
                        errReason.append("*"+reason[1].subSequence(reason[1].length()-1, reason[1].length())+","+reason[2].substring(0, 6)+"****");
                        errReason.append("】"+reason[3]);
                        reasonC.setCellValue(errReason.toString());
                    }else {
                        reasonC.setCellValue(log.getErrReason());
                    }
                }
            } else if (userType == ExcelConstans.USER_TYPE_ORGANIZE) {
                // 解析每一条数据,增加行
                for (int i = 0; i < errRefLogs.size(); i++) {
                    final ErrRefLog log = errRefLogs.get(i);
                    final JSONObject obj = JSONObject.fromObject(log
                            .getContentJson());
                    final Row row = sheet.createRow(i
                            + ExcelConstans.EXCEL_START_INDEX);
                    // 增加列数据
                    // ErrRefLog errRefLog = ErrRefLogs.get(i);
                    final CellStyle ss = workbook.createCellStyle();
                    ss.setLocked(false);
                    ss.setAlignment(CellStyle.ALIGN_CENTER);
                    // 企业名称
                    final Cell nameC = row.createCell(0);
                    nameC.setCellStyle(ss);
                    nameC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    nameC.setCellValue(log.getName());
                    // 手机号
                    final Cell mobileC = row.createCell(1);
                    mobileC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    mobileC.setCellStyle(ss);
                    mobileC.setCellValue(log.getMobile());
                    // 组织机构代码证号
                    final Cell organCodeC = row.createCell(2);
                    organCodeC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    organCodeC.setCellStyle(ss);
                    organCodeC.setCellValue(log.getOrganCode());
                    // 邮箱
    //                final Cell emailC = row.createCell(3);
    //                emailC.setCellType(XSSFCell.CELL_TYPE_STRING);
    //                emailC.setCellStyle(ss);
    //                emailC.setCellValue(log.getEmail());
                    // 单位类型
                    final Cell companyC = row.createCell(3);
                    companyC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    companyC.setCellStyle(ss);
                    companyC.setCellValue(obj.getInt("organType"));
                    // 注册类型
                    final Cell userTypeC = row.createCell(4);
                    userTypeC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    userTypeC.setCellStyle(ss);
                    userTypeC.setCellValue(obj.getInt("userType"));
                    // 工商注册号
                    final Cell regCodeC = row.createCell(5);
                    regCodeC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    regCodeC.setCellStyle(ss);
                    regCodeC.setCellValue(obj.getString("regCode"));
                    // 法定代表姓名
                    final Cell legalNameC = row.createCell(6);
                    legalNameC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    legalNameC.setCellStyle(ss);
                    legalNameC.setCellValue(obj.getString("legalName"));
                    // 法定代表人身份证号
                    final Cell legalIdNoC = row.createCell(7);
                    legalIdNoC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    legalIdNoC.setCellStyle(ss);
                    legalIdNoC.setCellValue(obj.getString("legalIdNo"));
                    // 法定代表人归属地
                    final Cell legalAreaC = row.createCell(8);
                    legalAreaC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    legalAreaC.setCellStyle(ss);
                    legalAreaC.setCellValue(obj.getInt("legalArea"));
                    // 代理人姓名
                    final Cell agentNameC = row.createCell(9);
                    agentNameC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    agentNameC.setCellStyle(ss);
                    agentNameC.setCellValue(obj.getString("agentName"));
                    // 代理人姓名
                    final Cell agentIdNoC = row.createCell(10);
                    agentIdNoC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    agentIdNoC.setCellStyle(ss);
                    agentIdNoC.setCellValue(obj.getString("agentIdNo"));
                    // 公司地址
                    final Cell addressC = row.createCell(11);
                    addressC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    addressC.setCellStyle(ss);
                    addressC.setCellValue(obj.getString("address"));
                    // 经营范围
                    final Cell scopeC = row.createCell(12);
                    scopeC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    scopeC.setCellStyle(ss);
                    scopeC.setCellValue(obj.getString("scope"));
                    // 失败原因
                    StringBuffer errReason = new StringBuffer();
                    final Cell reasonC = row.createCell(13);
                    reasonC.setCellType(XSSFCell.CELL_TYPE_STRING);
                    reasonC.setCellStyle(ss);
                    if(log.getErrReason().contains("【")){
                        String [] reason = log.getErrReason().split(regStr);
                        errReason.append(reason[0]+"【");
                        errReason.append("*"+reason[1].subSequence(reason[1].length()-1, reason[1].length())+","+reason[2].substring(0, 6)+"****");
                        errReason.append("】"+reason[3]);
                        reasonC.setCellValue(errReason.toString());
                    }else {
                        reasonC.setCellValue(log.getErrReason());
                    }
                }
            } else {
    
            }
            // 新建一输出流
            FileOutputStream fout;
            try {
                fout = new FileOutputStream(onceFile);
                // 存盘
                workbook.write(fout);
                fout.flush();
                // 结束关闭
                fout.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                this.LOG.error("fileNotFoundException", e);
            } catch (IOException e) {
                e.printStackTrace();
                this.LOG.error("IOException", e);
            }
            return onceFile;
        }
    
        // public static void main(String[] args) {
        // // 导入excel
        // // ExcelUtils utils = new ExcelUtils("D:\用户导入模版.xls");
        // ExcelUtil utils = new ExcelUtil("d:\企业用户导入模版 .xlsx");
        // List<String[]> list = utils.readExcel(0);
        // for (int i = 0; i < list.size(); i++) {
        // String[] str = list.get(i);
        // for (int j = 0; j < str.length; j++) {
        // System.out.println(str[j]);
        // }
        //
        // }
        // //导出excel
        // ExcelUtils utils = new ExcelUtils(
        // ExcelConstans.ERR_ORGANIZE_ACCOUNT_EXPORT_DIR);
        // List<ErrRefLog> accounts = new ArrayList<ErrRefLog>();
        // String path = utils.writeExcel(
        // ExcelConstans.ERR_ORGANIZE_ACCOUNT_EXPORT_DIR, accounts, 2);
        // System.out.println(path);
        // }
    //    public static void main(String[] args) {
    //        String regStr = "[\【\,\】]";
    //        String s = "我是【张三,430381199007086018】使用";
    //        System.out.println(s.split(regStr)[2]);
    //        
    //    }
    }

      文件解析的相关依赖包可以去maven库下载

  • 相关阅读:
    判定一个APP是否可以上线?
    即时聊天-环信
    类目延展协议
    一个sql的优化
    多线程编程
    sql小总结
    人生七问
    js之按键总结
    搭建框架日志记录
    jquery函数
  • 原文地址:https://www.cnblogs.com/HEWU10/p/5083142.html
Copyright © 2011-2022 走看看