zoukankan      html  css  js  c++  java
  • java 解析excel

    2014年2月25日 14:24:48 解析excel方法

    //首先是jar包下载,请自行百度

    //代码

    package cn.wuwenfu.excel;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    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;
    
    
    
    
    
    public class ExcelHand {
    
        /** 总行数 */
    
        private int totalRows = 0;
    
        /** 总列数 */
    
        private int totalCells = 0;
    
        /** 错误信息 */
    
        private String errorInfo;
    
        /** 构造方法 */
    
        public ExcelHand()
        {
    
        }
    
        /**
         * 
         * @描述:得到总行数
         * @参数:@return
         * 
         * @返回值:int
         */
    
        public int getTotalRows()
        {
    
            return totalRows;
    
        }
    
        /**
         * 
         * @描述:得到总列数
         * @参数:@return
         * 
         * @返回值:int
         */
    
        public int getTotalCells()
        {
    
            return totalCells;
    
        }
    
        /**
         * 
         * @描述:得到错误信息
         * 
         * @参数:@return
         * 
         * @返回值:String
         */
    
        public String getErrorInfo()
        {
    
            return errorInfo;
    
        }
    
        /**
         * 
         * @描述:验证excel文件
         * 
         * @参数:@param filePath 文件完整路径
         * 
         * @参数:@return
         * 
         * @返回值:boolean
         */
    
        public boolean validateExcel(String filePath)
        {
            
            /** 检查文件名是否为空或者是否是Excel格式的文件 */
    
            if (filePath == null || !(WDWUtil.isExcel2003(filePath) || WDWUtil.isExcel2007(filePath)))
            {
    
                errorInfo = "文件名不是excel格式";
    
                return false;
    
            }
            
            System.out.println(filePath);
            /** 检查文件是否存在 */
    
            File file = new File(filePath);
    
            if (file == null || !file.exists())
            {
    
                errorInfo = "文件不存在";
    
                return false;
    
            }
    
            return true;
    
        }
    
        /**
         * 
         * @描述:根据文件名读取excel文件
         * 
         * @参数:@param filePath 文件完整路径
         * 
         * @参数:@return
         * 
         * @返回值:List
         */
    
        public List<List<String>> read(String filePath)
        {
            //String filePath = ServletActionContext.getServletContext().getRealPath(path);
            List<List<String>> dataLst = new ArrayList<List<String>>();
    
            InputStream is = null;
    
            try
            {
    
                /** 验证文件是否合法 */
    
                if (!validateExcel(filePath))
                {
    
                    System.out.println(errorInfo);
    
                    return null;
    
                }
    
                /** 判断文件的类型,是2003还是2007 */
    
                boolean isExcel2003 = true;
    
                if (WDWUtil.isExcel2007(filePath))
                {
    
                    isExcel2003 = false;
    
                }
    
                /** 调用本类提供的根据流读取的方法 */
    
                File file = new File(filePath);
    
                is = new FileInputStream(file);
    
                dataLst = read(is, isExcel2003);
    
                is.close();
    
            }
            catch (Exception ex)
            {
    
                ex.printStackTrace();
    
            }
            finally
            {
    
                if (is != null)
                {
    
                    try
                    {
    
                        is.close();
    
                    }
                    catch (IOException e)
                    {
    
                        is = null;
    
                        e.printStackTrace();
    
                    }
    
                }
    
            }
    
            /** 返回最后读取的结果 */
    
            return dataLst;
    
        }
    
        /**
         * 
         * @描述:根据流读取Excel文件
         * 
         * @参数:@param inputStream
         * 
         * @参数:@param isExcel2003
         * 
         * @参数:@return
         * 
         * @返回值:List
         */
    
        public List<List<String>> read(InputStream inputStream, boolean isExcel2003)
        {
    
            List<List<String>> dataLst = null;
    
            try
            {
    
                /** 根据版本选择创建Workbook的方式 */
    
                Workbook wb = null;
    
                if (isExcel2003)
                {
                    wb = new HSSFWorkbook(inputStream);
                }
                else
                {
                    wb = new XSSFWorkbook(inputStream);
                }
                dataLst = read(wb);
    
            }
            catch (IOException e)
            {
    
                e.printStackTrace();
    
            }
    
            return dataLst;
    
        }
    
        /**
         * 
         * @描述:读取数据
         * 
         * @参数:@param Workbook
         * 
         * @参数:@return
         * 
         * @返回值:List<List<String>>
         */
    
        private  List<List<String>> read(Workbook wb)
        {
            
            List<List<String>> dataLst = new ArrayList<List<String>>();
    
            /** 得到第一个shell */
    
            Sheet sheet = wb.getSheetAt(0);
    
            /** 得到Excel的行数 */
    
            this.totalRows = sheet.getPhysicalNumberOfRows();
    
            /** 得到Excel的列数 */
    
            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;
    
                }
    
                List<String> rowLst = new ArrayList<String>();
                
                /** 循环Excel的列 */
    
                for (int c = 0; c < this.getTotalCells(); c++)
                {
    
                    Cell cell = row.getCell(c);
                    //String key=row.getCell(0).getStringCellValue();
                    String cellValue = "";
                    
                    if (null != cell)
                    {
                        
                        //cellValue=cell.getStringCellValue();
                        // 以下是判断数据的类型
                        switch (cell.getCellType())
                        {
                        case HSSFCell.CELL_TYPE_NUMERIC: // 数字
                            //cellValue = cell.getNumericCellValue() + "";
                            if (HSSFDateUtil.isCellDateFormatted(cell)) {
                                // 如果是Date类型则,取得该Cell的Date值 
                                Date date = cell.getDateCellValue();
                                // 把Date转换成本地格式的字符串 
                                cellValue = DateUtil.format(date, "yyyy-MM-dd HH:mm:ss");
                                System.out.println(cellValue);
                                }
                                // 如果是纯数字
                                else {
                                // 取得当前Cell的数值 
                                Integer num = new Integer((int) cell.getNumericCellValue());
                                cellValue = String.valueOf(num);
                                }
    
                            break;
    
                        case HSSFCell.CELL_TYPE_STRING: // 字符串
                            cellValue = cell.getStringCellValue();
                            break;
    
                        case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
                            cellValue = cell.getBooleanCellValue() + "";
                            break;
    
                        case HSSFCell.CELL_TYPE_FORMULA: // 公式
                            cellValue = cell.getCellFormula() + "";
                            break;
    
                        case HSSFCell.CELL_TYPE_BLANK: // 空值
                            cellValue = "";
                            break;
    
                        case HSSFCell.CELL_TYPE_ERROR: // 故障
                            cellValue = "非法字符";
                            break;
    
                        default:
                            cellValue = "未知类型";
                            break;
                        }
                    }
                    
                //    System.out.print(cellValue+"  ");
                    rowLst.add(cellValue);
    
                }
            //    System.out.println();
                /** 保存第r行的第c列 */
    
                dataLst.add(rowLst);
    
            }
    
            return dataLst;
    
        }
    
    
        /**
         * 将excel解析后的集合封装成Map形式,在这我没有直接在excel解析的时候就封装,看个人需求
         * @param list
         * @return
         */
        public static List<Map<String,String>> reflectMapList(List<List<String>> list){
            ExcelHand poi = new ExcelHand();
            List<Map<String, String>> mlist=new ArrayList<Map<String,String>>();
            
            Map<String, String> map = new HashMap<String, String>();
            if (list != null)
            {
    
                for (int i = 1; i < list.size(); i++)
                {
                    map = new HashMap<String, String>();
                //    System.out.print("第" + (i) + "行");
    
                    List<String> cellList = list.get(i);
    
                    for (int j = 0; j < cellList.size(); j++)
                    {
                        map.put(list.get(0).get(j), cellList.get(j));
                        // System.out.print("    第" + (j + 1) + "列值:");
                //    System.out.print(list.get(0).get(j)+"--" + cellList.get(j)+"  ");
    
                    }
                    //System.out.println();
                    //System.out.println(map);
                    mlist.add(map);
                }
    
            }
            
            return mlist;
        }
    }
    
    /**
     * 
     * @描述:工具类
     */
    
    class WDWUtil
    {
    
        
        /**
         * 
         * @描述:是否是2003的excel,返回true是2003
         * 
         * @参数:@param filePath 文件完整路径
         * 
         * @参数:@return
         * 
         * @返回值:boolean
         */
    
        public static boolean isExcel2003(String filePath)
        {
    
            return filePath.matches("^.+\.(?i)(xls)$");
    
        }
    
        /**
         * 
         * @描述:是否是2007的excel,返回true是2007
         * 
         * @参数:@param filePath 文件完整路径
         * 
         * @参数:@return
         * 
         * @返回值:boolean
         */
    
        public static boolean isExcel2007(String filePath)
        {
    
            return filePath.matches("^.+\.(?i)(xlsx)$");
    
        }
    }
    
    

     //测试类

    我的excel文件放在c盘,单独取出了excel中的第三个单元格的字段,然后组合成字符串,写入了txt中。

    package cn.wuwenfu.excel;
    
    import java.util.List;
    
    public class TestMain {
    	
    	/**
         * 
         * @描述:main测试方法
         * 
         * @参数:@param args
         * 
         * @参数:@throws Exception
         * 
         * @返回值:void
         * 
         */
        public static void main(String[] args) throws Exception
        {
    
            ExcelHand poi = new ExcelHand();
            //获取解析后的集合
            List<List<String>> lists = poi.read("c:/1.xls");
            System.out.println(lists.size());
            String str="";
            int j=0;
            for (List<String> t : lists) {
            	if(j==0){
            		//跳过表格的第一行
            		j++;
            		continue;
            	}
            	int i=0;
            	String temp ="";
            	for(String s: t){
            		System.out.print(s+"	");
            		
            		//如果是第三个单元格就添加到字符串中
            		
            		if(i==2){
            			str +=s+",";
            			temp=s;
            			
            			
            		}
            		//第四个单元格有数据,替换第三个单元格的
            		if(i==3&&!s.isEmpty()){
            			
            			
            			//System.out.println("字符串:"+str);
            			str = str.substring(0, str.indexOf(temp));
            			str +=s+",";
            			
            			// str = str.replace(temp, s);
            			}
            		
            		i++;
            		
            	}
            	System.out.println();
               }
            
            System.out.println(str);
            
            //写入日志
            Log.write(str, "c:/sds.txt");
            System.out.println("写入到c:/sds.txt");
            
            
            //首先获得需要的字符串
            
            /*
            //对集合进行重新组装 Map<字段,值>
            List<Map<String,String>> list=    ExcelHand.reflectMapList(lists);
            //调用工具类,组成对象集合
            List<TravelerInfo> ts=Tool.reflectObj(TravelerInfo.class, list);
            //遍历
            for (TravelerInfo t : ts) {
                System.out.println(t.getAirline_code()+" | "+ t.getFlight_num()+" | "+t.getSto()+" | "+t.getNationality()+"| ………………");
            }
    */
        }
    
    }
    
    QQ:540045865 热爱生活,热爱编程。
  • 相关阅读:
    Java实现 洛谷 P1085 不高兴的津津
    Java实现 洛谷 P1085 不高兴的津津
    Java实现 洛谷 P1085 不高兴的津津
    Java实现 洛谷 P1085 不高兴的津津
    Java实现 洛谷 P1422 小玉家的电费
    Java实现 洛谷 P1422 小玉家的电费
    form表单嵌套,用标签的form属性来解决表单嵌套的问题
    SpringMVC上传图片总结(2)--- 使用百度webuploader上传组件进行上传图片
    SpringMVC上传图片总结(1)---常规方法进行图片上传,使用了MultipartFile、MultipartHttpServletRequest
    Win10安装后必做的优化,解决磁盘100%占用
  • 原文地址:https://www.cnblogs.com/jsRunner/p/3566645.html
Copyright © 2011-2022 走看看