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.

Pranav
sumber

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);
Mikael Svenson
sumber
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
13

Mungkin Anda dapat mencoba menggunakan DateTime.FromOADatemetode untuk mengonversi antara Excel dan .net.

Tom
sumber
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");
Pengembang Perangkat Lunak Yashwant
sumber
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

rsapru.dll
sumber
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
Thomas
sumber
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

joXin
sumber
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

Kasim Husaini
sumber
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;
}
dbardakov.dll
sumber