C++调用excel读取日期问题
今晚弄一个程序项目,遇到一个问题,其中一个部分需要读取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