-1

我有一张包含下面提到的数据类型的 Excel 表。

  01-Aug-2012   EST213  Sowmya  Shivashankar    11  0   11  4   0   LOP
  01-Aug-2012   EST101  Prashanth  P    12  8   20  5   5.28    0     Half-day
  08-Aug-2012   EST213  Sowmya  Shivashankar    11  0   11  4   0   LOP

在这里,我为一名员工提供了一天的数据。像这样,我一个月有大约 3000 行数据。我需要计算需要为特定员工计算每月多少 LOP 或半天。

4

2 回答 2

1

我会这样做:

  1. 创建一个HashMap<String, List>
  2. 逐行解析XLS文件
  3. 在一行中查找EmployeeName和(LOP或)Half-day
  4. 如果Integer地图中没有员工姓名,请创建一个新对,添加您的LOPor Half-Day。如果有List,添加一条新记录。
  5. 完成 XLS 解析后,从地图中获取员工姓名并计算存储在数组中的键。

或者你可以创建一个像

{ 
  Integer lop;
  Integer halfDay;
}

而不是列表。

于 2012-11-23T13:00:21.340 回答
1

您可以尝试在员工及其每月条目之间使用映射。
注意:这几乎是完整的代码,但是您需要自己完成某些部分,例如解析行数或月份数

class EmployeeEntry {
    String date;
    String name;
    String surname;
    // other fields representing excel columns

    TYPE_OF_DAY typeOfday;

    public static enum TYPE_OF_DAY {
        LOP, HALF_DAY, OTHER
    }

    public String getEmployeeID() {
        // you may return name+surname or some unique ID
        return name + " " + surname;
    }

    public Integer getMonth() {
        String monthStr = date.split("-")[1];
        return asMonthNumber(monthStr);
        // implement asMonthNumber to convert Aug --> 08
    }
}

public class A {

    private Map<String, Map<Integer, List<EmployeeEntry>>> entries;

    public void parseExcel(HSSFSheet sheet) {
        entries = new HashMap<String, Map<Integer, List<EmployeeEntry>>>();
        Iterator<Row> iter = sheet.iterator();
        // for every row
        while (iter.hasNext()) {
            Row row = iter.next();
            // parse will call getString, getNumber etc of the current row
            EmployeeEntry entry = parse(row);
            Map<Integer, List<EmployeeEntry>> userMonthlyEntriesMap = getOrCreate(entry
                    .getEmployeeID());
            List<EmployeeEntry> monthlyEntries = getOrCreate(
                    userMonthlyEntriesMap, entry.getMonth());
            monthlyEntries.add(entry);
        }
    }

    public int countLOP(String employeeID, Integer monthNum) {
        int counter=0;

        Map<Integer, List<EmployeeEntry>> map = entries.get(employeeID);
        if (map != null) {
            List<EmployeeEntry> list = map.get(monthNum);
            if (list != null) {
                for (EmployeeEntry entry : list) {
                    if (entry.typeOfday == EmployeeEntry.TYPE_OF_DAY.LOP) {
                        counter++;
                    }
                }
            }
        }
        return counter;
    }

    private List<EmployeeEntry> getOrCreate(
            Map<Integer, List<EmployeeEntry>> userMonthlyEntriesMap,
            Integer month) {
        List<EmployeeEntry> monthlyEntries = userMonthlyEntriesMap.get(month);
        if (monthlyEntries == null) {
            monthlyEntries = new LinkedList<EmployeeEntry>();
            userMonthlyEntriesMap.put(month, monthlyEntries);
        }
        return monthlyEntries;
    }

    public Map<Integer, List<EmployeeEntry>> getOrCreate(String emplID) {
        Map<Integer, List<EmployeeEntry>> entryList = entries.get(emplID);
        if (entryList == null) {
            entryList = new HashMap<Integer, List<EmployeeEntry>>();
            entries.put(emplID, entryList);
        }
        return entryList;
    }
}
于 2012-11-23T13:40:35.027 回答