我如何根据日期时间值从工作表中提取值

问题描述 投票:0回答:1

所以我有 shift excel 表,我需要从中获取值,其填充如下

星期一 星期二 星期三 星期四 星期五 星期六 周日
时间
早 7-13 姓名 姓名 姓名 姓名 姓名 姓名 姓名
13-21 点晚 姓名 姓名 姓名 姓名 姓名 姓名 姓名

相关单元格值位于 B4-H4 和 B5-H5

我设置了一个方法

public static string GetName(Worksheet worksheet, DateTime dateTime)
        {
            string Name = "";

            DateTime weekStartDate = dateTime.Date.AddDays(-(int)dateTime.DayOfWeek);

            var usedRange = worksheet.UsedRange;
            var rows = usedRange.Rows;
            int rowCount = rows.Count;
            for (int i = 1; i <= rowCount; i++)
            {
                var row = (Range)rows[i];
                if (row.Row == 1)
                {
                    continue;
                }

                var dayOfWeekCell = (Range)row.Cells[1, 1];
                var dayOfWeekText = dayOfWeekCell.Text;
                if (!Enum.TryParse(dayOfWeekText, out DayOfWeek dayOfWeek))
                {
                    continue;
                }

                var columnCount = usedRange.Columns.Count;
                for (int j = 1; j <= columnCount; j++)
                {
                    var column = (Range)usedRange.Columns[j];
                    var columnHeader = column.Cells[1, 1].Text;
                    if (string.Equals(columnHeader, dayOfWeekText, StringComparison.OrdinalIgnoreCase))
                    {
                        var shiftTypeCell = (Range)row.Cells[2, j];
                        string currentShiftType = shiftTypeCell.Text;
                        if (dateTime.TimeOfDay >= new TimeSpan(7, 0, 0) && dateTime.TimeOfDay < new TimeSpan(13, 30, 0) && string.Equals(currentShiftType, "Früh", StringComparison.OrdinalIgnoreCase))
                        {
                            Name = (row.Cells[4, j] as Range).Value;
                        }
                        else if (dateTime.TimeOfDay >= new TimeSpan(13, 30, 0) && dateTime.TimeOfDay < new TimeSpan(21, 0, 0) && string.Equals(currentShiftType, "Spät", StringComparison.OrdinalIgnoreCase))
                        {
                            Name = (row.Cells[5, j] as Range).Value;
                        }

                        break;
                    }
                }

                if (!string.IsNullOrEmpty(Name))
                {
                    break;
                }
            }

            return Name;
        }

这样叫

        string Person = Helpers.GetName((Worksheet)shiftsWorksheet, zeitpunkt);

它总是返回空值。这些单元格没有以任何方式格式化。我不太确定如何根据输入的白天从工作表中动态获取“人”。例如 04.03.2023 14:30 应该获取 G5 的单元格值作为周六的晚班。

c# office-interop
1个回答
0
投票

我看了你的代码

  1. 这会跳过您 Excel 文档的第 1 行。
   var row = (Range)rows[i];
                if (row.Row == 1)
                {
                    continue;
                }
  1. 不知道这里(应该)发生了什么。 Cell[1,1] 是第一列的值,但你在第 2 行,结果将是“时间”。您的代码点击了
    continue
    ,因为这不是工作日。这将发生在您工作表中的所有下一行。
var dayOfWeekCell = (Range)row.Cells[1, 1];
                var dayOfWeekText = dayOfWeekCell.Text;
                if (!Enum.TryParse(dayOfWeekText, out DayOfWeek dayOfWeek))
                {
                    continue;
                }
  1. 我打算查看其余代码,但没有必要(参见 2.)
© www.soinside.com 2019 - 2024. All rights reserved.