MFC操作Excel读取日期的问题

时间:2022-10-19 16:09:00
我做了个读Excel的工具,基本功能都实现了,现在碰到了一个蛋疼的问题,excel有一列是日期格式的,例如“2010-8-13 11:11”,通过代码读的时候,不管我如何设置单元格的类型,显示的类型总是VT_R8。。。。
由于我是通用的读取,所以不能特殊判断,现在的问题是:怎么区分读的这列是数字还是日期呢?

CString str;
COleVariant vResult;
CRange range;
range.AttachDispatch(m_sheet.get_Cells());
range.AttachDispatch(range.get_Item(COleVariant(m_rowstart+row), COleVariant(m_colstart+col)).pdispVal);

vResult = range.get_Value2();
if (vResult.vt == VT_BSTR)
{
str = vResult.bstrVal;

}
else if (vResult.vt == VT_R8)
{
str.Format("%.0f", vResult.dblVal);
}
else if (vResult.vt == VT_DATE)
{
COleDateTime date(vResult.date);
//str = date.Format(VAR_VALIDDATE);
str = date.Format("%Y-%m-%d %H:%M:%S");
}

12 个解决方案

#1


没人关注,自己顶一下!

#2


MFC操作Excel读取日期的问题

#3


查查excel 的vba手册,看看有没相关的函数

#4


问题解决了吗 我这也有类似问题呢

#5


木有解决,只有把日期变成了字符串的写法

#6


我也有这问题,怎么办呢.
一种解决方法:
从数字计算出日期, 读出的数字是基于1900-1-1的天数,再转换到日期.
但这样有便捷的转换方法还好,不然就又要杀死大堆脑细胞了

#7


引用 6 楼  的回复:
我也有这问题,怎么办呢.
一种解决方法:
从数字计算出日期, 读出的数字是基于1900-1-1的天数,再转换到日期.
但这样有便捷的转换方法还好,不然就又要杀死大堆脑细胞了

像你这样我没办法知道某一行数据是数字类型还是日期类型

#8


楼主,这个问题解决了吗?最近我也遇到这个问题了,但是发现有的软件可以转,肯定是有方法的

#9


楼主,我知道怎么弄了,这样:

#10


VARIANT pszText = m_Range.get_Text();
CString strT;
char* buf = _com_util::ConvertBSTRToString(pszText.bstrVal);
strVal.Format("%s", buf);
delete buf;

#11


引用
VARIANT pszText = m_Range.get_Text();
CString strT;
char* buf = _com_util::ConvertBSTRToString(pszText.bstrVal);
strVal.Format("%s", buf);
delete buf;


怎么显示的是乱码呢?

#12


终于让我找到方法了~
不要从程序语言去下手,找Excel本身的函数~
在Excel中借个单元格,先用TEXT函数【=TEXT(A3,"yyyy-mm-dd hh:MM:ss"),其中"A3"为你原本日期格式的单元格】转换为文本,再读出~

#1


没人关注,自己顶一下!

#2


MFC操作Excel读取日期的问题

#3


查查excel 的vba手册,看看有没相关的函数

#4


问题解决了吗 我这也有类似问题呢

#5


木有解决,只有把日期变成了字符串的写法

#6


我也有这问题,怎么办呢.
一种解决方法:
从数字计算出日期, 读出的数字是基于1900-1-1的天数,再转换到日期.
但这样有便捷的转换方法还好,不然就又要杀死大堆脑细胞了

#7


引用 6 楼  的回复:
我也有这问题,怎么办呢.
一种解决方法:
从数字计算出日期, 读出的数字是基于1900-1-1的天数,再转换到日期.
但这样有便捷的转换方法还好,不然就又要杀死大堆脑细胞了

像你这样我没办法知道某一行数据是数字类型还是日期类型

#8


楼主,这个问题解决了吗?最近我也遇到这个问题了,但是发现有的软件可以转,肯定是有方法的

#9


楼主,我知道怎么弄了,这样:

#10


VARIANT pszText = m_Range.get_Text();
CString strT;
char* buf = _com_util::ConvertBSTRToString(pszText.bstrVal);
strVal.Format("%s", buf);
delete buf;

#11


引用
VARIANT pszText = m_Range.get_Text();
CString strT;
char* buf = _com_util::ConvertBSTRToString(pszText.bstrVal);
strVal.Format("%s", buf);
delete buf;


怎么显示的是乱码呢?

#12


终于让我找到方法了~
不要从程序语言去下手,找Excel本身的函数~
在Excel中借个单元格,先用TEXT函数【=TEXT(A3,"yyyy-mm-dd hh:MM:ss"),其中"A3"为你原本日期格式的单元格】转换为文本,再读出~