魂心

poi读取excel工具类
package com.manage.utils;

import ch.qos.logback.core.net.SyslogOutputStream;
import com.google.gson.Gson;
import com.manage.FrameWeb.FrameLib.SystemLogHelper;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
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;
import sun.reflect.generics.tree.Tree;


import java.io.*;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.*;

public class ExcelReader {
    private POIFSFileSystem fs;
    private Workbook wb;
    private Sheet sheet;
    private Row row;


    /**
     * 读取Excel表格表头的内容
     *
     * @param file
     * @return String 表头内容的数组
     */
    public String[] readExcelTitle(File file) {
        try {
            InputStream is = new FileInputStream(file);

            if (file.getName().toLowerCase().endsWith(".xls")) {
                fs = new POIFSFileSystem(is);
                wb = new HSSFWorkbook(fs);
            } else {
                wb = new XSSFWorkbook(is);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        sheet = wb.getSheetAt(0);
        row = sheet.getRow(0);
        // 标题总列数
        int colNum = row.getPhysicalNumberOfCells();
        System.out.println("colNum:" + colNum);
        String[] title = new String[colNum];
        for (int i = 0; i < colNum; i++) {
            //title[i] = getStringCellValue(row.getCell((short) i));
            title[i] = getCellFormatValue(row.getCell((short) i));
        }
        return title;
    }

    /**
     * 读取Excel数据内容
     *
     * @param file
     * @return Map 包含单元格数据内容的Map对象
     */
    public Map <Integer, String> readExcelContent(File file) {
        Map <Integer, String> content = new HashMap <Integer, String>();
        String str = "";
        try {
            InputStream is = new FileInputStream(file);
            if (file.getName().toLowerCase().endsWith(".xls")) {
                //fs = new POIFSFileSystem(is);
                wb = new HSSFWorkbook(is);
            } else {
                wb = new XSSFWorkbook(is);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        sheet = wb.getSheetAt(0);
        // 得到总行数
        int rowNum = sheet.getLastRowNum();
        row = sheet.getRow(0);
        int colNum = row.getPhysicalNumberOfCells();
        // 正文内容应该从第二行开始,第一行为表头的标题
        for (int i = 1; i <= rowNum; i++) {
            row = sheet.getRow(i);
            int j = 0;
            while (j < colNum) {
                // 每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据
                // 也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean
                // str += getStringCellValue(row.getCell((short) j)).trim() +
                // "-";
                str += getCellFormatValue(row.getCell((short) j)).trim() + "    ";
                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(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(Cell 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类型则,转化为Data格式

                        //方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00
                        //cellvalue = cell.getDateCellValue().toLocaleString();

                        //方法2:这样子的data格式是不带带时分秒的:2011-10-12
                        Date date = cell.getDateCellValue();
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                        cellvalue = sdf.format(date);

                    }
                    // 如果是纯数字
                    else {
                        // 取得当前Cell的数值
                        DecimalFormat df = new DecimalFormat("#");
                        cellvalue = df.format(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 {

            System.out.println("开始");
            File file = new File("D:\\DownLoads\\ll.xlsx");
            ExcelReader er = new ExcelReader();
            Map <Integer, List <String>> ms = er.readExcelContentFans(file);

            Set <Integer> set = ms.keySet();
            List <TreeDto> list = new ArrayList <>();
            for (Integer i : set) {

                List <String> ls = ms.get(i);
                String str = "";
                TreeDto dto = new TreeDto();

                dto.setID(String.valueOf(list.get(0)));
                dto.setPID(String.valueOf(list.get(8)));
                list.add(dto);
            }

            List <TreeDto> rootTrees = new ArrayList <TreeDto>();
            for (TreeDto tree : list) {
                if (tree.getPID() == "ee3c8a59-3546-11e7-a3f8-5254007b6f02") {
                    rootTrees.add(tree);
                }
                for (TreeDto t : list) {
                    if (t.getPID() == t.getID()) {
                        if (tree.getList() == null) {
                            List <TreeDto> myChildrens = new ArrayList <TreeDto>();
                            myChildrens.add(t);
                            tree.setList(myChildrens);
                        } else {
                            tree.getList().add(t);
                        }
                    }
                }
            }

            for (TreeDto t : rootTrees){
                List<TreeDto> td=t.getList();
             /* if(td!=null&&td.size()>0){
                  for(TreeDto dto:td){
                      SyslogOutputStream
                  }
              }*/

             System.out.println("ID:"+t.getID()+"\t"+"PID:"+t.getPID());
            }

        } catch (Exception e) {

            e.getMessage();
        }
    }

    /**
     * 读取Excel数据内容
     *
     * @param file
     * @return Map 包含单元格数据内容的Map对象
     */
    public Map <Integer, List <String>> readExcelContentFans(File file) {
        Map <Integer, List <String>> content = new HashMap <Integer, List <String>>();
        String str = "";
        try {
            InputStream is = new FileInputStream(file);
            if (file.getName().toLowerCase().endsWith(".xls")) {
                //fs = new POIFSFileSystem(is);
                wb = new HSSFWorkbook(is);
            } else {
                wb = new XSSFWorkbook(is);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        sheet = wb.getSheetAt(0);
        // 得到总行数
        int rowNum = sheet.getLastRowNum();
        row = sheet.getRow(0);
        int colNum = row.getPhysicalNumberOfCells();
        // 正文内容应该从第二行开始,第一行为表头的标题
        for (int i = 1; i <= rowNum; i++) {
            row = sheet.getRow(i);
            int j = 0;
            List <String> colNumContent = new ArrayList <>();
            while (j < colNum) {
                // 每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据
                // 也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean
                // str += getStringCellValue(row.getCell((short) j)).trim() +
                // "-";
                colNumContent.add(getCellFormatValue(row.getCell((short) j)));
                /*str += getCellFormatValue(row.getCell((short) j)).trim() + "    ";*/
                j++;
            }
            content.put(i, colNumContent);
        }
        return content;
    }

    public static class TreeDto {

        private String ID;

        private List <TreeDto> list;

        public List <TreeDto> getList() {
            return list;
        }

        public void setList(List <TreeDto> list) {
            this.list = list;
        }

        private String PID;

        public String getID() {
            return ID;
        }

        public void setID(String ID) {
            this.ID = ID;
        }

        public String getPID() {
            return PID;
        }

        public void setPID(String PID) {
            this.PID = PID;
        }


    }

}

 

posted on 2018-04-11 16:35  魂心  阅读(289)  评论(0编辑  收藏  举报