Đọc giá trị ngày giờ từ trang tính Excel


87

Khi tôi cố đọc giá trị kiểu datetime từ trang tính excel, nó đang trả về giá trị kép. Ví dụ: nếu muốn đọc giá trị '2007-02-19 14:11:45.730'như thế này, tôi đang nhận giá trị kiểu kép. Ngoài ra, tôi đang chuyển đổi giá trị kép này bằng cách sử dụng khoảng thời gian, nhưng không hoàn thành thành công bởi vì tôi chỉ nhận được giá trị này '2007-02-19 12:00:00 AM'
bây giờ tôi muốn giá trị ngày giờ giống hệt như giá trị đầu tiên. Mã của tôi như sau: -

TimeSpan datefromexcel = new TimeSpan(Convert.ToInt32((range.Cells[rCnt, cCnt] as Excel.Range).Value2), 0, 0, 0);

  DateTime inputdate = new DateTime(1900, 1, 1).Add(datefromexcel);

   arrrow2[cCnt - 1] = inputdate.ToString();

Xin vui lòng giúp đỡ!!! Cảm ơn.

Câu trả lời:


222

Bạn cần chuyển đổi định dạng ngày từ OLE Automation sang định dạng .net bằng cách sử dụng DateTime.FromOADate.

double d = double.Parse(b);
DateTime conv = DateTime.FromOADate(d);

1
Bạn cũng vui lòng bình chọn câu trả lời và đánh dấu nó là đúng chứ?
Mikael Svenson

bình chọn yêu cầu 15 danh tiếng nhưng tôi chỉ có 6 vì tôi là người dùng mới, nhưng tôi đã đánh dấu câu trả lời là đúng.
Pranav

4
+1 Rõ ràng hạn chế ủng hộ không nên áp dụng cho các câu hỏi của chính mình.
Mike Rosenblum

1
Tôi đã hiểu rằng. Chỉ cần chỉ ra rằng không phải ai cũng đồng ý với bạn hành vi này là một lỗi.
jwg

1
Đây là cách dễ nhất mà tôi tìm thấy. Cảm ơn bạn.
Ashok


6

Đọc giá trị ngày giờ từ trang tính Excel: Hãy thử cách này sẽ hiệu quả.

string sDate = (xlRange.Cells[4, 3] as Excel.Range).Value2.ToString();

double date = double.Parse(sDate);

var dateTime = DateTime.FromOADate(date).ToString("MMMM dd, yyyy");

4
Nhân tiện, mã của bạn khác với câu trả lời được chấp nhận như thế nào?
Pranav

Bị phản đối. Điều này không hiệu quả, vì khi ô là ngày tháng, Value2trả về một doublegiá trị được đóng hộp .
dbardakov

0

Hoặc bạn có thể chỉ cần sử dụng OleDbDataAdapter để lấy dữ liệu từ Excel


0

Ngoài ra, nếu ô của bạn đã là ngày thực, chỉ cần sử dụng .Value thay vì .Value2:

excelApp.Range[namedRange].Value
{21/02/2013 00:00:00}
    Date: {21/02/2013 00:00:00}
    Day: 21
    DayOfWeek: Thursday
    DayOfYear: 52
    Hour: 0
    Kind: Unspecified
    Millisecond: 0
    Minute: 0
    Month: 2
    Second: 0
    Ticks: 634970016000000000
    TimeOfDay: {00:00:00}
    Year: 2013

excelApp.Range[namedRange].Value2
41326.0

1
Tôi nghĩ nó phức tạp hơn thế một chút. Valuesẽ trả về a DateTimenếu bạn đã viết a DateTimeđến Valuenhưng a doublenếu bạn đã viết a DateTimeđến Value2.
jwg

0

tôi đã gặp trường hợp tương tự và tôi đã sử dụng mã bên dưới để làm việc này ..

Aspose.Cells.LoadOptions loadOptions = new Aspose.Cells.LoadOptions(Aspose.Cells.LoadFormat.CSV);

Workbook workbook = new Workbook(fstream, loadOptions);

Worksheet worksheet = workbook.Worksheets[0];

dt = worksheet.Cells.ExportDataTable(0, 0, worksheet.Cells.MaxDisplayRange.RowCount, worksheet.Cells.MaxDisplayRange.ColumnCount, true);

DataTable dtCloned = dt.Clone();
ArrayList myAL = new ArrayList();

foreach (DataColumn column in dtCloned.Columns)
{
    if (column.DataType == Type.GetType("System.DateTime"))
    {
        column.DataType = typeof(String);
        myAL.Add(column.ColumnName);
    }
}


foreach (DataRow row in dt.Rows)
{
    dtCloned.ImportRow(row);
}



foreach (string colName in myAL)
{
    dtCloned.Columns[colName].Convert(val => DateTime.Parse(Convert.ToString(val)).ToString("MMMM dd, yyyy"));
}


/*******************************/

public static class MyExtension
{
    public static void Convert<T>(this DataColumn column, Func<object, T> conversion)
    {
        foreach (DataRow row in column.Table.Rows)
        {
            row[column] = conversion(row[column]);
        }
    }
}

Hy vọng điều này sẽ giúp some1 thx_joxin


2
Việc sử dụng câu trả lời này yêu cầu giấy phép và cài đặt liên quan của sản phẩm Aspose.Cells. Đây là một sản phẩm tuyệt vời, nhưng không phải là thứ mà tất cả các nhà phát triển đều có quyền truy cập.
Zarepheth

0

Bạn có thể muốn thử chức năng đơn giản mà tôi đã đăng trên một chủ đề khác liên quan đến việc đọc giá trị ngày từ trang tính excel.

Nó chỉ đơn giản là lấy văn bản từ ô làm đầu vào và cung cấp DateTime làm đầu ra.

Tôi rất vui khi thấy mã mẫu của tôi được cải thiện được cung cấp vì lợi ích của cộng đồng phát triển .Net.

Đây là liên kết cho chuỗi C # không đọc ngày excel từ bảng tính


0

Một tùy chọn khác: khi loại ô không xác định tại thời điểm biên dịch và ô được định dạng là Ngày Range.Valuetrả về một DateTimeđối tượng mong muốn .


public static DateTime? GetAsDateTimeOrDefault(Range cell)
{
    object cellValue = cell.Value;
    if (cellValue is DateTime result)
    {
        return result;
    }
    return null;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.