การอ่านค่า Datetime จากแผ่นงาน Excel


89

เมื่อฉันพยายามอ่านค่าประเภทวันที่และเวลาจากแผ่นงาน excel มันจะส่งคืนค่าสองครั้งตัวอย่างเช่นหากต้องการอ่านค่า'2007-02-19 14:11:45.730'เช่นนี้ฉันได้รับค่าประเภทคู่นอกจากนี้ฉันกำลังแปลงค่าสองเท่านี้โดยใช้ช่วงเวลา แต่ไม่เสร็จสมบูรณ์ เพราะฉันได้รับเฉพาะค่า'2007-02-19 12:00:00 AM'
นี้ตอนนี้ฉันต้องการค่าวันที่และเวลาเดียวกันกับค่าแรก รหัสของฉันเหมือน: -

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

กรุณาช่วย!!! ขอบคุณ.

คำตอบ:


226

คุณต้องแปลงรูปแบบวันที่จาก OLE Automation เป็นรูปแบบ. net โดยใช้ DateTime.FromOADate

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

1
คุณจะกรุณาให้คะแนนคำตอบและทำเครื่องหมายว่าถูกต้องหรือไม่?
Mikael Svenson

การโหวตต้องใช้ 15 ชื่อเสียง แต่ฉันมีเพียง 6 คนเนื่องจากฉันเป็นผู้ใช้ใหม่ แต่ฉันได้ทำเครื่องหมายคำตอบว่าถูกต้อง
Pranav

5
+1 เห็นได้ชัดว่าข้อ จำกัด ในการโหวตไม่ควรใช้กับคำถามของตัวเอง
Mike Rosenblum

1
ฉันเข้าใจแล้ว เพียงแค่ชี้ให้เห็นว่าไม่ใช่ทุกคนที่จะเห็นด้วยกับคุณพฤติกรรมนี้เป็นข้อบกพร่อง
jwg

1
นี่เป็นวิธีที่ง่ายที่สุดที่ฉันพบ ขอขอบคุณ.
Ashok


6

การอ่านค่า Datetime จากแผ่นงาน Excel: ลองนี้จะได้ผล

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
โค้ดของคุณแตกต่างจากคำตอบที่ยอมรับอย่างไร?
Pranav

โหวตลดลง นี้จะไม่มีประสิทธิภาพสาเหตุเมื่อเซลล์เป็นวันที่Value2ส่งกลับชนิดบรรจุกล่องdoubleค่า
dbardakov


0

หรือถ้าเซลล์ของคุณเป็นวันที่จริงอยู่แล้วให้ใช้. Value แทน. 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
ฉันคิดว่ามันซับซ้อนกว่านั้นเล็กน้อย ValueจะกลับDateTimeถ้าคุณเขียนDateTimeไปValueแต่doubleถ้าคุณเขียนไปDateTime Value2
jwg

0

ฉันมีสถานการณ์ที่คล้ายกันและฉันใช้รหัสด้านล่างเพื่อให้มันใช้งานได้ ..

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

หวังว่านี่จะช่วยได้บ้าง 1 thx_joxin


2
การใช้คำตอบนี้จำเป็นต้องมีใบอนุญาตและการติดตั้งที่เกี่ยวข้องของผลิตภัณฑ์ Aspose.Cells นี่เป็นผลิตภัณฑ์ที่ยอดเยี่ยม แต่ไม่ใช่สิ่งที่นักพัฒนาซอฟต์แวร์ทุกคนเข้าถึงได้
Zarepheth

0

คุณอาจต้องการลองใช้ฟังก์ชันง่ายๆที่ฉันโพสต์ไว้ในเธรดอื่นที่เกี่ยวข้องกับการอ่านค่าวันที่จากแผ่นงาน excel

เพียงแค่ใช้ข้อความจากเซลล์เป็นอินพุตและให้ DateTime เป็นเอาต์พุต

ฉันยินดีที่จะเห็นการปรับปรุงโค้ดตัวอย่างของฉันที่ให้ไว้เพื่อประโยชน์ของชุมชนการพัฒนา. Net

นี่คือลิงค์สำหรับเธรดC # ที่ไม่อ่านวันที่ excel จากสเปรดชีต


0

อีกทางเลือกหนึ่ง: เมื่อไม่ทราบชนิดของเซลล์ในเวลาคอมไพล์และเซลล์ถูกจัดรูปแบบเป็นวันที่Range.Valueส่งคืนDateTimeวัตถุที่ต้องการ


public static DateTime? GetAsDateTimeOrDefault(Range cell)
{
    object cellValue = cell.Value;
    if (cellValue is DateTime result)
    {
        return result;
    }
    return null;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.