Захват значений времени из ячейки Excel - PullRequest
2 голосов
/ 13 марта 2011

Я пишу приложение для Excel, которое будет читать и записывать указанные значения из файла Excel и отображать их для пользователя.Однако, когда я пытаюсь прочитать из ячейки, в которой есть Number Format или функция, набранная 'hh:min' (Hour:Min), я не могу получить это значение так, как я хочу.

Вот мой код ...

ws[dateTimePicker1.Value.Day + 1].get_Range("F" + i.ToString(), Type.Missing);
    if (range.Value2 != null)  
        val += " - " + range.Value2.ToString();   //Sets FXX to val
    lbHK1.Items.Add(val);

Где ...

  • ws = мой рабочий лист
  • dateTimePicker1= мой инструмент выбора даты и времени, который помогает мне решить, какой файл будет открыт
  • i = это целое число, которое помогает мне определить номер строки в этой ячейке
  • range = это созданный объектот Microsoft.Office.Interop.Excel.Range

В моем примере, когда i = 11, F11 - это ячейка, содержащая значение времени, равное 06:30 (в Excel, fx : 06:30:00).Однако, когда я пытаюсь получить это значение, он возвращает тип double, такой как 0.263888888888889

. Как я могу правильно отформатировать значение, отображаемое в Excel, а не бессмысленное двойное значение?

Ответы [ 3 ]

5 голосов
/ 13 марта 2011

Excel хранит внутреннее время как двойные числа, содержащие десятичные дроби 24-часового дня: поэтому в 6:30 утра будет 0,2708333

3 голосов
/ 13 марта 2011

При работе с датами Excel, дата может быть либо сохранена как строковое представление даты, либо это может быть Дата OA (Дата автоматизации OLE). Я обнаружил, что проверка обоих типов - это самый безопасный маршрут при разборе дат Excel.

Вот метод расширения, который я написал для преобразования:

/// <summary>
/// Sometimes the date from Excel is a string, other times it is an OA Date:
/// Excel stores date values as a Double representing the number of days from January 1, 1900.
/// Need to use the FromOADate method which takes a Double and converts to a Date.
/// OA = OLE Automation compatible.
/// </summary>
/// <param name="date">a string to parse into a date</param>
/// <returns>a DateTime value; if the string could not be parsed, returns DateTime.MinValue</returns>
public static DateTime ParseExcelDate( this string date )
{
    DateTime dt;
    if( DateTime.TryParse( date, out dt ) )
    {
        return dt;
    }

    double oaDate;
    if( double.TryParse( date, out oaDate ) )
    {
        return DateTime.FromOADate( oaDate );
    }

    return DateTime.MinValue;
}

В вашем примере использование будет:

TimeSpan time = f11Value.ParseExcelDate().TimeOfDay;
2 голосов
/ 30 января 2015

Excel сохраняет время в долях дня, 12:00 будет сохраняться как 0,5 с 12/24 = 1/2 = 0,5

Чтобы получить часы, нужно умножить время Excel на 24 изатем округлите результат до целого числа.

Чтобы получить минуты (так как день имеет 1440 минут), вам нужно умножить значение на 1440, это даст вам минуты, прошедшие с 00:00, вынужно разделить на 60 и работать над оставшейся частью операции, чтобы получить время в минутах.

Вот фрагмент:

string parseExcelHour(string cellInput){

    double excelHour = 0;

    try{
        excelHour = Double.Parse(cellInput);
    }catch { }

    int hour = (int) (excelHour * 24);// with the int cast you get only an integer.
    int min = (int) (excelHour * 1440 % 60); //mod (%) takes only the remainder and then the cast to int will round the number

    return (hour < 10? "0":"") + hour + ":" + (min < 10? "0":"") + min; //will print HH:mm
}
...