Delphi与Excel的编程学习

昨天下午,群里有个朋友问了这么一个问题。

问题:如何用Delphi来对Excel中某个单元格中的部分字符进行格式化。

此类的资料几乎在网上绝种,反正我是没有找到,MSDN,各大论坛都是没有找到,从昨天下午找这类资料一直到现在(不包括睡觉3小时,打游戏8小时,看电影4.5小时,HOHO,看得偶真得把这该死的游戏放一放了),就是没有找到一要点儿关于此问题的资料,无意中,进了百度的VBA贴吧,看到了很多人问什么VBA编程啊,Excel操作之类的,突然灵光一现,我何不用Excel的宏录制功能来帮我完成这些资料呢,于是,我启动了Excel,在A2单元格内输入了"中国中国",然后再开始录制宏,然后选定后面的中国两字,进行字体修改操作,停止录制宏。然后对刚刚录制的宏进行编辑,看到的代码令我开心。

Sub Macro1()
'
' Macro1 Macro
' 宏由 MopeBoy 录制,时间: 2005-11-17
'

'
    Range("A2").Select
    ActiveCell.FormulaR1C1 = "中国中国"
    With ActiveCell.Characters(Start:=1, Length:=2).Font
        .Name = "宋体"
        .FontStyle = "常规"
        .Size = 12
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
    End With
    With ActiveCell.Characters(Start:=3, Length:=2).Font
        .Name = "宋体"
        .FontStyle = "加粗"
        .Size = 12
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
    End With
    Range("B2").Select
End Sub

于是乎,我就将此代码转为delphi的代码,如下:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ExcelApplication1.Workbooks.Open('d:/test.xls', null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0);
  ExcelApplication1.Visible[0] := true;
  ExcelApplication1.Range['A2', 'A2'].Select;
  with ExcelApplication1.ActiveCell.Characters[2, 2].Font do
  begin
    Name := '宋体';
    FontStyle := '加粗';
    Size := 12;
    Strikethrough := False;
    Superscript := False;
    Subscript := False;
    OutlineFont := False;
    Shadow := False;
    Underline := xlUnderlineStyleNone;
    ColorIndex := xlAutomatic;
  end;
end;

此次学习是个意外的收获,也让我体会到,很多时候学习不能死钻,得巧夺。  ^_^

吃饭去先

2006年3月14日

今天群里有人提出这么一个问题:excel单元格数据为数字,如何判断单元格长度小于数字的长度?
    我自己感觉,Excel的VBA应该直接提供这样的方法或是函数的,但苦于找不到相关资料只有用最愚蠢的办法来实现了。  :(

uses ComObj;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  MyExcel: OleVariant;
  TableLen, TextLen: Integer;
begin
  MyExcel := CreateOleObject('Excel.Application.11');
  MyExcel.Workbooks.Open('d:/test.xls');
//  MyExcel.Visible := True;
  MyExcel.Range['A7', 'A7'].Select;
  TableLen := MyExcel.Range['A7', 'A7'].Width;
  MyExcel.Selection.Copy;
  MyExcel.Range['FF999'].Select;
  MyExcel.ActiveSheet.Paste;
  MyExcel.Columns['FF:FF'].EntireColumn.AutoFit;
  TextLen := MyExcel.Range['FF999'].Width;
  MyExcel.CutCopyMode := False;
  MyExcel.Selection.ClearContents;
  MyExcel.Range['A7', 'A7'].Select;
  if TableLen < TextLen then ShowMessage('内容比表格宽');
  MyExcel.Quit;
  MyExcel := Null;
end;

2006-03-16

昨天在外面跑了一天,今天回到公司,一开群,问此问题的人今天还在问,郁闷,看到这样的人心寒啊,不过偶今天做了仔细的测试来验证我14号的一个想法:当一个单元格的宽度比要显示的宽度小时,会将单元格显示成‘#####’之类的,那么我就想,对单元格进行格式化等操作也会导致显示值与真实值不同,也就是说,一个单元格可能有多个值,但14号由于我把单元格搞得太宽,就没有验试出这样的结论,今天把单元格调小后得到了此结论是正确的。代码如下

TO ABC
uses ComObj;

{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
  MyExcel: OleVariant;
  ViewText: string;
begin
  MyExcel := CreateOleObject('Excel.Application.11');
  MyExcel.Workbooks.Open('d:/test.xls');
  MyExcel.Visible := True;
  ViewText := MyExcel.Range['A7', 'A7'].Text;
  if Copy(ViewText, 0, 1) = '#' then ShowMessage('表格宽度不够');
  MyExcel.Range['A7', 'A7'].Value := '1980-09-25'; //为A7单元格赋值
  MyExcel.Range['A7', 'A7'].Select; //选定A7单元格
  MyExcel.Selection.NumberFormatLocal := 'yyyy""-""m""-""d;@'; //为指定的单元格指定格式
  //默认格式下,日期格式就是 'yyyy""-""m""-""d;@'
  MyExcel.Quit;
  MyExcel := Null;
end;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值