Membaca nilai Datetime Dari lembar Excel


89

ketika saya mencoba membaca nilai tipe datetime dari lembar excel itu mengembalikan nilai ganda. misalnya jika ingin membaca nilai '2007-02-19 14:11:45.730'seperti ini, saya mendapatkan nilai tipe ganda. selanjutnya saya mengubah nilai ganda ini menggunakan rentang waktu, tetapi tidak berhasil diselesaikan karena saya hanya mendapatkan nilai ini '2007-02-19 12:00:00 AM'
sekarang saya ingin nilai datetime yang sama persis seperti yang pertama. Kode saya seperti: -

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();

Tolong bantu!!! Terima kasih.

Jawaban:


226

Anda perlu mengonversi format tanggal dari OLE Automation ke format .net dengan menggunakan DateTime.FromOADate.

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

1
Apakah Anda juga akan berbaik hati untuk memilih jawaban dan menandainya sebagai benar?
Mikael Svenson

voting membutuhkan 15 reputasi tetapi saya hanya memiliki 6 karena saya adalah pengguna baru, tetapi saya telah menandai jawabannya sebagai benar.
Pranav

4
+1 Jelaslah, pembatasan untuk upvoting tidak berlaku untuk pertanyaan Anda sendiri.
Mike Rosenblum

1
Saya mengerti itu. Hanya menunjukkan bahwa tidak semua orang setuju dengan Anda, perilaku ini adalah bug.
jwg

1
Ini adalah cara termudah yang saya temukan. Terima kasih.
Ashok


6

Membaca nilai Datetime Dari lembar Excel: Coba ini akan berhasil.

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
Bagaimana kode Anda berbeda dari jawaban yang diterima?
Pranav

Suara negatif. Ini tidak efisien, karena jika sel adalah tanggal, Value2mengembalikan doublenilai dalam kotak .
dbardakov

0

Atau Anda bisa menggunakan OleDbDataAdapter untuk mendapatkan data dari Excel


0

Atau, jika sel Anda sudah menjadi tanggal nyata, cukup gunakan .Value alih-alih .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
Saya pikir ini sedikit lebih rumit dari itu. Valueakan mengembalikan DateTimejika Anda menulis DateTimeke, Valuetetapi doublejika Anda menulis DateTimeke Value2.
jwg

0

Saya memiliki situasi yang sama dan saya menggunakan kode di bawah ini untuk membuatnya bekerja ..

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]);
        }
    }
}

Semoga ini bisa membantu some1 thx_joxin


2
Penggunaan jawaban ini membutuhkan lisensi dan instalasi terkait dari produk Aspose.Cells. Ini adalah produk hebat, tetapi bukan sesuatu yang dapat diakses oleh semua pengembang.
Zarepheth

0

Anda mungkin ingin mencoba fungsi sederhana yang saya posting di yang lain utas terkait dengan membaca nilai tanggal dari lembar excel.

Ini hanya mengambil teks dari sel sebagai masukan dan memberikan DateTime sebagai keluaran.

Saya akan senang melihat peningkatan dalam kode sampel saya yang disediakan untuk kepentingan komunitas pengembangan .Net.

Ini adalah tautan untuk utas C # yang tidak membaca tanggal excel dari spreadsheet


0

Opsi lain: ketika tipe sel tidak diketahui pada waktu kompilasi dan sel diformat sebagai Tanggal Range.Valuemengembalikan DateTimeobjek yang diinginkan .


public static DateTime? GetAsDateTimeOrDefault(Range cell)
{
    object cellValue = cell.Value;
    if (cellValue is DateTime result)
    {
        return result;
    }
    return null;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.