delphi中操作Excel用分列方法将数字转换为文本格式

原创|其它|编辑:郝浩|2009-04-27 09:42:25.000|阅读 3316 次

概述:Excel中有一列数据是数字和文本方式混合排列的,在用ADO导入数据时就会出现部分数据不能导入的问题

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

Excel中有一列数据是数字和文本方式混合排列的,在用ADO导入数据时就会出现部分数据不能导入的问题

解决这个问题 首先想到的是常用的数字转换为文本格式的方法 WorkSheet.Columns[1].NumberFormatLocal:='@';

几行代码一敲,测试发现没效果,就马上开始 baidu,google 铺天盖地的搜索。。。

没怎么搜索就找到了excel 中有用分列方法将整列数据文本格式化的方法:数据->分列->列数据格式->文本

录制下的宏代码如下:


Sub Macro2()
    Columns(
"D:D").Select
    Selection.TextToColumns Destination:
=Range("D1"), DataType:=xlDelimited, _
        TextQualifier:
=xlDoubleQuote, ConsecutiveDelimiter:=FalseTab:=True, _
        Semicolon:
=False, Comma:=FalseSpace:=False, Other:=False, FieldInfo _
        :
=Array(12), TrailingMinusNumbers:=True
End Sub

接下来将VBA宏代码翻译成delphi代码:

WorkSheet.Columns[4].Select;
WorkSheet.Selection.TextToColumns(WorkSheet.Cells[
1,4],xlDelimited,xlDoubleQuote,False,True,False,False,False,False,Array(12),True);

一编译才发现 Array(1,2) 语法错误,于是将其改成delphi 中的数组格式 Array[0..1] of Integer=(1,2) ,

编译还是报错,发现是因为是Delphi调用OLE自动化控制器操纵Excel,该方法只能出现OleVariant类型的参数,马上找资料看有没有OleVariant类型的数组,一下就找到了马上改了代码换上去:  


var a:OleVariant; 

a:
=VarArrayCreate([0,1],varInteger);
a[
0]:=1;
a[
1]:=2;

WorkSheet.Columns[
4].Select;
WorkSheet.Selection.TextToColumns(WorkSheet.Cells[
1,4],xlDelimited,xlDoubleQuote,False,True,False,False,False,False,a,True);

满以为这下问题应该解决了吧,编译通过,测试发现点都么反应,郁闷了。。。

到底是哪点的原因呢?开始排查问题中。。。

第一个可能的原因,excel 宏写错了?反复测试,都能正常运行,效果明显。

第二个可能的原因,delphi OLE操纵Excel 失效?测试了其他Ole代码,都能正常运行,没有问题。

现在就剩下一个比较确定的问题了,WorkSheet.Selection.TextToColumns 这个方法的问题。

搜索引擎中输入"delphi TextToColumns" 搜出来的结果寥寥可数,遇到这个问题的很少,提的问题大多都没人回答,

许多人甚至不知所云,千辛万苦找到MSDN中的帮助中有 C# 调用 excel 这个方法的示例,但是关键地方就是数组参数

他用空值代替了:


public Object TextToColumns(
    Object Destination,
    XlTextParsingType DataType,
    XlTextQualifier TextQualifier,
    Object ConsecutiveDelimiter,
    Object Tab,
    Object Semicolon,
    Object Comma,
    Object Space,
    Object Other,
    Object OtherChar,
    Object FieldInfo,
    Object DecimalSeparator,
    Object ThousandsSeparator,
    Object TrailingMinusNumbers
)
private void ConvertTextToColumns()
{
    Microsoft.Office.Tools.Excel.NamedRange namedRange1 
=
        
this.Controls.AddNamedRange(this.Range["A1", missing],
        
"namedRange1");

    namedRange1.Value2 
= "01 01 2001";
    Excel.Range destinationRange 
= this.Range["A5", missing];

    namedRange1.TextToColumns(destinationRange,
        Excel.XlTextParsingType.xlDelimited,
        Excel.XlTextQualifier.xlTextQualifierDoubleQuote, missing,
        missing, missing, missing, 
true, missing, missing, missing,
        missing, missing, missing);
}

反复的看帮助中对 FieldInfo 的描述:

FieldInfo
类型:System..::.Object

一个数组,包含各个数据列的分析信息。解释取决于 DataType 的值。当对数据进行分隔时,此参数是一个由两元素数组组成的数组,每个两元素数组都指定特定列的转换选项。第一个元素是列号(从 1 开始),第二个元素是指定如何分析列的 XlColumnDataType 常数之一。

可以是下列 XlColumnDataType 值之一:

只有当安装并选择了台语支持时,才能使用 xlEMDFormatxlEMDFormat 指定所使用的台语纪元日期。

列说明符可以采用任何顺序。如果对于输入数据中的特定列,给定的列说明符不存在,则用 xlGeneralFormat 设置对列进行分析。

如果源数据具有固定宽度的列,则每个两元素数组中的第一个元素都指定该列中的起始字符位置(以整数形式指定;0(零)是第一个字符)。两元素数组的第二个元素将该列的分析选项指定为从 1 至 9 的数字,如上面列出的那样。

还是不明所以。。。接下来就是漫长的碰运气时间。。。。

改不同的参数运行测试,反复N次,每次都是失望的结果。就这样被这个问题折磨了3天多的时间,我绝望了,很想放弃,因为我至少找到了数据导入出现空行的原因和解决方法,只是不能用程序实现,每次导入数据前人工操作excel将数据格式化也不是太麻烦。但在花了这么多时间和精力后我能放得下吗?就这样心甘情愿的认输?对自己说,我做不到?不!一定能行,我还没有失败,相反已经成功了一半了,剩下的那一半只是时间和灵感问题,这时候放弃了才是真的失败了。稍微放松下,暂时什么都不想,等会一定把你搞定 。打几盘魔兽先

这一刻终于来临,一段代码突然给我带来了灵感,我是不是应该把参数类型带进去?虽然资料和帮助都没提到,但是语法上应该是没问题的,说做就做:


var a:OleVariant; 

a:
=VarArrayCreate([0,1],varInteger);
a[
0]:=1;
a[
1]:=2;

WorkSheet.Columns[
4].Select;
WorkSheet.Columns[
4].TextToColumns(WorkSheet.Cells[1,4],DataType:=xlDelimited,TextQualifier:=xlDoubleQuote,FieldInfo:=a);

 

运行,测试,通过 !!!喔耶,完美解决,perfect ! 怎一个爽字了得。。。哈哈哈哈哈哈

编程也需要不抛弃,不放弃,还有一点点灵感。我能!无所不能!


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP