您的位置:首页 > 编程语言 > Delphi

Delphi与Excel的编程学习

2005-11-17 11:36 309 查看
昨天下午,群里有个朋友问了这么一个问题。

问题:如何用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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: