首页 > C++ > C++调用excel读取日期问题

C++调用excel读取日期问题

2013年2月15日 发表评论 阅读评论

今晚弄一个程序项目,遇到一个问题,其中一个部分需要读取excel的数据,之前研究的C++读取excel数据的方法,我以为基本可以万事大吉了,然后那个项目里面给的数据库的excel数据呢,出现了日期的格式,比如说打开那个excel文件里面可以看到单元格的数据是:2012-5-1  0:00:57,当你在excel里面设置单元格格式为“常规”的时候,它的值就是41030.0006597222,尽管如此,用之前文章里面提到的那个方法呢,读出来的结果是空字符串,然后研究了一下,把之前那博文里面的某部分改一改其实就可以了。

看一下XLAutomation.cpp那个文件里面的CString CXLAutomation::GetCellValueCString(int nColumn, int nRow)这个函数,不用细看,经过一番处理之后,有下面一段代码:

VARTYPE Type = vargValue.vt;
switch (Type)
{
    //balabala
}

判断Type就是判断读进来的数据的类型,然后下面的case那里有VT_UI1,VT_I4等,你右键这些变量(应该叫宏),查看定义,会跳到WTypes.h那个文件里面,下面的类型就很多了:

enum VARENUM
{    
    VT_EMPTY    = 0,
    VT_NULL    = 1,
    VT_I2    = 2,
    VT_I4    = 3,
    VT_R4    = 4,
    VT_R8    = 5,
    VT_CY    = 6,
    VT_DATE    = 7,
    VT_BSTR    = 8,
    VT_DISPATCH    = 9,
    VT_ERROR    = 10,
    VT_BOOL    = 11,
    VT_VARIANT    = 12,
    VT_UNKNOWN    = 13,
    VT_DECIMAL    = 14,
    VT_I1    = 16,
    VT_UI1    = 17,
    VT_UI2    = 18,
    VT_UI4    = 19,
    VT_I8    = 20,
    VT_UI8    = 21,
    VT_INT    = 22,
    VT_UINT    = 23,
    VT_VOID    = 24,
    VT_HRESULT    = 25,
    VT_PTR    = 26,
    VT_SAFEARRAY    = 27,
    VT_CARRAY    = 28,
    VT_USERDEFINED    = 29,
    VT_LPSTR    = 30,
    VT_LPWSTR    = 31,
    VT_RECORD    = 36,
    VT_INT_PTR    = 37,
    VT_UINT_PTR    = 38,
    VT_FILETIME    = 64,
    VT_BLOB    = 65,
    VT_STREAM    = 66,
    VT_STORAGE    = 67,
    VT_STREAMED_OBJECT    = 68,
    VT_STORED_OBJECT    = 69,
    VT_BLOB_OBJECT    = 70,
    VT_CF    = 71,
    VT_CLSID    = 72,
    VT_VERSIONED_STREAM    = 73,
    VT_BSTR_BLOB    = 0xfff,
    VT_VECTOR    = 0x1000,
    VT_ARRAY    = 0x2000,
    VT_BYREF    = 0x4000,
    VT_RESERVED    = 0x8000,
    VT_ILLEGAL    = 0xffff,
    VT_ILLEGALMASKED    = 0xfff,
    VT_TYPEMASK    = 0xfff
} ;

我们看到有类型VT_DATE,其实调试一下就知道,当读到日期格式的时候,Type的值就是7,也就是VT_DATE,但是之前那个代码里面没有做对这个的处理,直接退出了,所以才会得到空字符串的,所以我们只要在switch里面增加一个case就可以了。

case VT_DATE:
{
    DATE _date = vargValue.date;
    COleDateTime t;
    t.m_dt=_date;
    szValue= t.Format(“%Y-%m-%d %H:%M:%S”);
}
break;

【完】

本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com

分类: C++ 标签: , ,