【问题标题】:swipe hours calculation in data table directly直接在数据表中滑动小时计算
【发布时间】:2017-03-31 05:00:02
【问题描述】:

我正在开发一个应用程序,我必须使用滑动时间计算。我必须生成一个工具,它将获取 excel 值并计算一个月内所有员工的小时数。我知道如何在 sql server 中处理这个,但我不知道如何直接在数据表或数据集中处理。谁能帮我解决这个问题。到目前为止,我的代码如下。

using (var pck = new OfficeOpenXml.ExcelPackage())
    {
        using (var stream = File.OpenRead(path))
        {
            pck.Load(stream);
        }
        var ws = pck.Workbook.Worksheets.First();
        System.Data.DataTable tbl = new System.Data.DataTable();
        foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
        {
            tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column));
        }
        var startRow = hasHeader ? 2 : 1;
        for (int rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
        {
            var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
            DataRow row = tbl.Rows.Add();
            foreach (var cell in wsRow)
            {
                row[cell.Start.Column - 1] = cell.Text;
            }
        }
        return tbl;
    }
if (Path.GetExtension(FileUpload1.FileName) == ".xlsx")
{
    dt = GetDataTableFromExcel(URL, true);
}

从这里我会得到如下的数据表 +-----------+---------------------+------------+ | Employeid | Swipe dateTime | Event type | +-----------+---------------------+------------+ | A | 01-01-2017 09:48:06 | IN | | A | 01-01-2017 10:22:42 | OUT | | B | 01-01-2017 10:22:56 | IN | | B | 01-01-2017 10:36:46 | EXIT | | C | 01-01-2017 10:37:04 | IN | | C | 01-01-2017 12:52:57 | OUT | +-----------+---------------------+------------+

现在我的任务是计算 IN 和 OUT 小时数,并直接在数据表中获取每个员工每天、每周和每月的工作时间。

请帮助我。

【问题讨论】:

  • 此代码如何与您联系Swipe hour problem??
  • 我通过此代码获取excel数据并将数据存储在数据表中。现在这个数据表由empid、time、entry/exit组成。这三列包含所有数据。现在我必须将它们转换为一天、一周、一个月的滑动时间
  • 你没有提供足够的细节,什么表结构什么列什么值。比展示您如何将数据填充到表中更好,向我们展示您的数据表中的内容以及该数据表的预期输出。
  • 很高兴收到回复,我正在获取以下格式的 excel 值
  • excel 列值为 Employeid Swipedate 时间事件类型 A 01-01-2017 09:48:06 IN A 01-01-2017 10:22:42 OUT B 01-01-2017 10: 22:56 IN B 01-01-2017 10:36:46 EXIT C 01-01-2017 10:37:04 IN C 01-01-2017 12:52:57 OUT 我正在使用上述函数GetDataTableFromExcel(pathvalue,Boolean)。

标签: c# asp.net


【解决方案1】:

好的,所以尝试使用下面的方法。

您可能需要更改一些基本格式或结果表结构。

private DataTable CalculateWorkingHours(DataTable excelSheetDataTable)
{
    //Group all the data rows by user name and respective date
    var dd = excelSheetDataTable.Rows.Cast<DataRow>().GroupBy(c => new { name = c[0].ToString(), date = DateTime.Parse(c[1].ToString()).Date });


    //Create result table and some column in the table
    DataTable result = new DataTable();
    result.Columns.Add("user");
    result.Columns.Add("work hour");
    result.Columns.Add("date");

    // loop all user and their respective date in - out
    foreach (var item in dd)
    {
        // for each user each day order the record by date time.
        var sortByDateTime = item.ToList().OrderBy(c => DateTime.Parse(c[1].ToString()));

        //first in record for the day
        var fIn = sortByDateTime.FirstOrDefault(c => string.Equals(c[2].ToString(), "IN", StringComparison.InvariantCultureIgnoreCase));

        // if first in record for the day exist go further
        if (fIn != null)
        {

           // last out record for the day
            var lOut = sortByDateTime.LastOrDefault(c =>
            {
                return
                    string.Equals(c[2].ToString(), "OUT", StringComparison.InvariantCultureIgnoreCase)
                    ||
                    string.Equals(c[2].ToString(), "Exit", StringComparison.InvariantCultureIgnoreCase);
            });

            // if last out record for the day exist too..
            if (lOut != null)
            {
               // find the first enter date time, last exist date time.
                var fTime = DateTime.Parse(fIn[1].ToString());
                var lTime = DateTime.Parse(lOut[1].ToString());

                //add the new row to the result table,
                var r = result.NewRow();
                r[0] = item.Key.name;
                r[1] = (lTime - fTime).ToString(@"hh\:mm\:ss");
                r[2] = item.Key.date;

                result.Rows.Add(r);
            }
        }
    }
    return result;
}

【讨论】:

  • 好的,Deepak,我会尝试这个逻辑并得到准确的结果,感谢您的回复和耐心。
  • 嗨,Deepak,经过一些调整后,它解决了问题,非常感谢。
猜你喜欢
  • 2022-06-11
  • 2011-02-08
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
  • 2019-10-21
  • 1970-01-01
相关资源
最近更新 更多