【MFC/C++ 操作Excel】C++下TextToColumns函数的参数

				版权声明:本文为博主原创文章,未经博主允许不得转载。					https://blog.csdn.net/xxxxxx91116/article/details/8531996				</div>
							            <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
					<div class="htmledit_views" id="content_views">


我们在使用excel的分列将数字转为文本时,用宏记录的vb代码如下:


  
  
  1. Range( "A5:A64"). Select
  2. Selection.TextToColumns Destination:=Range( "A5"), DataType:=xlDelimited, _
  3. TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:= False, Tab:= True, _
  4. Semicolon:= False, Comma:= False, Space:= False, Other:= False, FieldInfo _
  5. :=Array( 1, 2), TrailingMinusNumbers:= True


如果我们想将其转为VC代码,过程如下:

第一句:

Range("A5:A64").Select
  
  

这一句表示选中A5:A64,翻译为C++,就是

m_ecRange.Select();
  
  

其中m_ecRange是Range的对象。

第二句:


  
  
  1. Selection.TextToColumns Destination:=Range( "A5"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:= False, Tab:= True, _ Semicolon:= False, Comma:= False, Space:= False, Other:= False, FieldInfo _ :=Array( 1, 2), TrailingMinusNumbers:= True

其对应的是Range类的TextToColumns函数,其C++函数原型是


  
  
  1. VARIANT TextToColumns(const VARIANT& Destination, long DataType, long TextQualifier, const VARIANT& ConsecutiveDelimiter, const VARIANT& Tab, const VARIANT& Semicolon, const VARIANT& Comma, const VARIANT& Space, const VARIANT& Other,
  2. const VARIANT& OtherChar, const VARIANT& FieldInfo, const VARIANT& DecimalSeparator, const VARIANT& ThousandsSeparator, const VARIANT& TrailingMinusNumbers);


各个参数的意思可以参见:

http://bbs.csdn.net/topics/390285992

这里的参数只有第1个const VARIANT& Destination和第11个const VARIANT& FieldInfo比较难确定,其他参数都可以通过在宏中用MsgBox得到,下面说明这两个参数:

第1个参数(const VARIANT& Destination):

MSDN解释:指定 Microsoft Excel 放置结果的位置的 Range 对象。如果该区域大于一个单元格,请使用左上角的单元格。

所以这里我们设置为A5单元格,我们可以使用:


  
  
  1. CString beginS = “A5”; //将beginS设置为这一列左上角的单元格
  2. Range m_tempRange = m_ecSheet.GetRange(COleVariant(beginS), COleVariant(beginS)); //得到该单元格的range
  3. m_tempRange.GetItem(COleVariant(( short) 1),COleVariant(( short) 1)); //返回的值就是要传入的值,也就是左上角单元格,这里一定是1,1,因为range只有一个单元格


 

第11个参数(const VARIANT& FieldInfo)

MSDN解释:包含单列数据拆分信息的数组。对本参数的解释取决于 DataType 的值。如果此数据由分隔符分隔,则本参数为由两元素数组组成的数组,其中每个两元素数组指定一个特定列的转换选项。第一个元素为列标(从 1 开始),第二个元素是 xlColumnDataType 常量之一,用以指定该列的拆分方式。
我们可以看到VB代码是Array(1, 2),是一个一维数组,数组有2个元素,数组的第一个元素是1,第二个元素是2;在MFC中,我们要使用
COleSafeArray来代表数组,初始化这样一个数组如下:


  
  
  1. COleSafeArray saRet;
  2. DWORD numElements = { 2}; //数组中有2个元素
  3. saRet.Create(VT_I4, 1, &numElements); //第一个参数表示存入int,第二个参数表示是一维数组,第三个参数表示数组中有2个元素
  4. long index = 0; //数组下标
  5. int val = 1; //值
  6. saRet.PutElement(&index, &val); //将0下标的值设置为1

  
  
  1. index++;
  2. val = 2;
  3. saRet.PutElement(&index, &val); //将1下标的值设置为2


整个函数如下:


  
  
  1. BOOL CExcelOperate::SetRowToTextFormat(CString &beginS, CString &endS)
  2. {
  3. if(GetRangeAndValue(beginS, endS))
  4. {
  5. m_ecRange.Select();
  6. Range m_tempRange = m_ecSheet.GetRange(COleVariant(beginS), COleVariant(beginS));
  7. if(!m_tempRange.m_lpDispatch) return FALSE;
  8. COleVariant vTrue((short)TRUE),
  9. vFalse ((short)FALSE);
  10. //int tempArray[2] = {1, 2};
  11. COleSafeArray saRet;
  12. DWORD numElements = { 2};
  13. saRet.Create(VT_I4, 1, &numElements);
  14. long index = 0;
  15. int val = 1;
  16. saRet.PutElement(&index, &val);
  17. index++;
  18. val = 2;
  19. saRet.PutElement(&index, &val);
  20. //m_tempRange.GetItem(COleVariant((short)5),COleVariant("A"));
  21. m_ecRange.TextToColumns(m_tempRange.GetItem(COleVariant(( short) 1),COleVariant(( short) 1)), 1, 1, vFalse, vTrue, vFalse, vFalse, vFalse, vFalse, vFalse, saRet, vFalse, vFalse, vTrue);
  22. m_tempRange.ReleaseDispatch();
  23. return TRUE;
  24. }
  25. return FALSE;
  26. }


 


  
  
  1. BOOL CExcelOperate::GetRangeAndValue(CString begin, CString end)
  2. {
  3. if(!m_ecSheet.m_lpDispatch)
  4. {
  5. AfxMessageBox( "Sheet获取失败!", MB_OK|MB_ICONWARNING);
  6. return FALSE;
  7. }
  8. m_ecRange = m_ecSheet.GetRange(COleVariant(begin), COleVariant(end));
  9. if(!m_ecRange.m_lpDispatch)
  10. {
  11. AfxMessageBox( "Range获取失败!", MB_OK|MB_ICONWARNING);
  12. return FALSE;
  13. }
  14. ret = m_ecRange.GetValue2(); //得到表格中的值
  15. return TRUE;
  16. }


				版权声明:本文为博主原创文章,未经博主允许不得转载。					https://blog.csdn.net/xxxxxx91116/article/details/8531996				</div>
							            <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
					<div class="htmledit_views" id="content_views">

猜你喜欢

转载自blog.csdn.net/qq_32307377/article/details/88659916
今日推荐