Code
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleServer, ExcelXP, comobj, Spin;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
SpinEdit3: TSpinEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
myexcel,myworkbook,mysheet:variant;
glb,t1 :integer;
implementation
{$R *.dfm}
//------------------------
//将阿拉伯数字转成英文字串
//------------------------
function num2ceng(strArabic:string):string;//不带小数点英文转换中文
const
sw:array[2..9]of string=('twenty','thirty','forty','fifty','sixty','seventy','eighty','ninety');
gw:array[1..19] of string=('one','two','three','four','five','six','seven','eight','nine','ten','eleven','twelve','thirteen','fourteen','fifteen','sixteen','seventeen','eighteen','nineteen');
exp:array[1..4] of string=('','thousand','million','billion');
var
t,j:integer;
ts:string;
function readu1000(ss:string):string;
var
t,code:integer;
begin
result := '';
while ss[1]='0' do
begin
delete(ss,1,1);
if length(ss)=0 then exit;//控制全是0情况
end;
if length(ss)=3 then
begin
appendstr(result,gw[ord(ss[1])-ord('0')]);
appendstr(result,' hundred ');
delete(ss,1,1);
end;
while ss[1]='0' do
begin
delete(ss,1,1);
if length(ss)=0 then exit;
end;
if length(ss)<>0 then
if result <> '' then appendstr(result,'and ');
if (glb = 1) and (t1<>1) then //超过百位时候处理最后3位
if result='' then appendstr(result,'and ');
begin
val(ss,t,code);
if t<20 then result :=result+gw[t]
else if t mod 10=0 then result:=result+sw[t div 10]
else result := result+sw[trunc(t/10)]+'-'+gw[t mod 10];
end;
end;
begin
result :='Say ';
t := pos('.',strArabic);
if t=0 then t:=length(strArabic)+1;
while (t mod 3<>1)do
begin
t:=t+1;
strArabic:='0'+ strArabic;
end;
t1:=(t-1) div 3;
for glb:=t1 downto 1 do
begin
ts:='';
for j:=1 to 3 do
begin
ts:=ts+ strArabic[1];
delete(strArabic,1,1);
end;
result := result + readu1000(ts);
if ts<>'000' then result := result+' '+exp[glb]+' ';
end;
if length(strArabic)<>0 then
begin
delete(strArabic,1,1);
appendstr(result,'and ');
result :=result + readu1000(strArabic);
end;
end;
function num2cengnum(strArabic:string):string;
const
gw:array[1..10] of string =('0','one','two','three','four','five','six','seven','eight','nine');
var
p,i,j,x:integer;
s:string;
begin
result := '';
s := strarabic;
p := pos('.',strarabic);
if p = 0 then
begin
result := num2ceng(strarabic)+'Only';
exit;
end
else
begin
i := length(s)-p;//计算小数点后面有几位
delete(strarabic,p,i+1);//删除小数点后面数字
result := num2ceng(strarabic)+'Point';
end;
for x:=1 to i do //转换小数点后面数字
begin
j:= strtoint(copy(s,p+x,1));
case j of
0: result := result +' '+gw[1];
1: result := result +' '+gw[2];
2: result := result +' '+gw[3];
3: result := result +' '+gw[4];
4: result := result +' '+gw[5];
5: result := result +' '+gw[6];
6: result := result +' '+gw[7];
7: result := result +' '+gw[8];
8: result := result +' '+gw[9];
9: result := result +' '+gw[10];
end;
end;
end;
//-----------------------------------------
// Num2CNum 将阿拉伯数字转成中文数字字串
//------------------------------------------
function Num2CNum(dblArabic: double): string;
const
_ChineseNumeric = '零壹贰叁肆伍陆柒捌玖';
var
sArabic: string;
sIntArabic: string;
iPosOfDecimalPoint: integer;
i: integer;
iDigit: integer;
iSection: integer;
sSectionArabic: string;
sSection: string;
bInZero: boolean;
bMinus: boolean;
(* 将字串反向, 例如: 传入 '1234', 传回 '4321' *)
function ConvertStr(const sBeConvert: string): string;
var
x: integer;
begin
Result := '';
for x := Length(sBeConvert) downto 1 do
AppendStr(Result, sBeConvert[x]);
end; { of ConvertStr }
begin
Result := '';
bInZero := True;
sArabic := FloatToStr(dblArabic); (* 将数字转成阿拉伯数字字串 *)
{$IFDEF __Debug}
ShowMessage('FloatToStr(dblArabic): ' + sArabic);
{$ENDIF}
if sArabic[1] = '-' then
begin
bMinus := True;
sArabic := Copy(sArabic, 2, 254);
end
else
bMinus := False;
iPosOfDecimalPoint := Pos('.', sArabic); (* 取得小数点的位置 *)
{$IFDEF __Debug}
ShowMessage('Pos(''.'', sArabic) ' + IntToStr(iPosOfDecimalPoint));
{$ENDIF}
(* 先处理整数的部分 *)
if iPosOfDecimalPoint = 0 then
sIntArabic := ConvertStr(sArabic)
else
sIntArabic := ConvertStr(Copy(sArabic, 1, iPosOfDecimalPoint - 1));
(* 从个位数起以每四位数为一小节 *)
for iSection := 0 to ((Length(sIntArabic) - 1) div 4) do
begin
sSectionArabic := Copy(sIntArabic, iSection * 4 + 1, 4);
sSection := '';
(* 以下的 i 控制: 个十百千位四个位数 *)
for i := 1 to Length(sSectionArabic) do
begin
iDigit := Ord(sSectionArabic[i]) - 48;
if iDigit = 0 then
begin
(* 1. 避免 '零' 的重覆出现 *)
(* 2. 个位数的 0 不必转成 '零' *)
if (not bInZero) and (i <> 1) then sSection := '零' + sSection;
bInZero := True;
end
else
begin
case i of
2: sSection := '拾' + sSection;
3: sSection := '佰' + sSection;
4: sSection := '仟' + sSection;
end;
sSection := Copy(_ChineseNumeric, 2 * iDigit + 1, 2) +
sSection;
bInZero := False;
end;
end;
(* 加上该小节的位数 *)
if Length(sSection) = 0 then
begin
if (Length(Result) > 0) and (Copy(Result, 1, 2) <> '零') then
Result := '零' + Result;
end
else
begin
case iSection of
0: Result := sSection;
1: Result := sSection + '万' + Result;
2: Result := sSection + '亿' + Result;
3: Result := sSection + '兆' + Result;
end;
end;
{$IFDEF __Debug}
ShowMessage('sSection: ' + sSection);
ShowMessage('Result: ' + Result);
{$ENDIF}
end;
(* 处理小数点右边的部分 *)
if iPosOfDecimalPoint > 0 then
begin
AppendStr(Result, '元');
{for i := iPosOfDecimalPoint + 1 to Length(sArabic) do
begin
iDigit := Ord(sArabic[i]) - 48;
AppendStr(Result, Copy(_ChineseNumeric, 2 * iDigit + 1, 2));
end;---没有限制小数点后面位置}
i := iPosOfDecimalPoint + 1;
iDigit := Ord(sArabic[i]) - 48;
if Copy(_ChineseNumeric, 2 * iDigit + 1, 2) <> '零' then
begin
AppendStr(Result, Copy(_ChineseNumeric, 2 * iDigit + 1, 2));
Result := Result+'角';
end
else
begin
AppendStr(Result, Copy(_ChineseNumeric, 2 * iDigit + 1, 2));
end;
i := i+1;
iDigit := Ord(sArabic[i]) - 48;
AppendStr(Result, Copy(_ChineseNumeric, 2 * iDigit + 1, 2));
Result := Result+'分'
end;
{$IFDEF __Debug}
ShowMessage('Result before 其他例外处理: ' + Result);
{$ENDIF}
(* 其他例外状况的处理 *)
if Length(Result) = 0 then Result := '零';
if Copy(Result, 1, 4) = '一十' then Result := Copy(Result, 3, 254);
if Copy(Result, 1, 2) = '点' then Result := '零' + Result;
if iposofdecimalpoint = 0 then result := result + '元整';
(* 是否为负数 *)
if bMinus then Result := '负' + Result;
{$IFDEF __Debug}
ShowMessage('Result before Exit: ' + Result);
{$ENDIF}
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
opendialog1.Execute;
edit1.Text := opendialog1.FileName;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
introw,intnum,i,col1,col2,col3:integer;
filename :string;
begin
try
if application.MessageBox('你确定要转换么?','信息提示:',mb_yesno+mb_defbutton1+mb_iconinformation)= idyes then
begin
if fileexists(edit1.Text) = false then
begin
showmessage('文件不存在,请重新选择文件');
exit;
end;
myexcel:= CreateOleObject('Excel.Application');
myworkbook := myexcel.workbooks.open(edit1.text);
myexcel.Visible := false;
mysheet := myexcel.worksheets[1];
introw := mysheet.UsedRange.Rows.Count;//计算多少行
col1 := spinedit1.Value;
col2 := spinedit2.Value;
col3 := spinedit3.Value;
for i:=1 to introw do
begin
myexcel.cells[i,col2].value := Num2CNum(strtofloat(myexcel.cells[i,col1].value));
myexcel.cells[i,col3].value := num2cengnum(myexcel.cells[i,col1].value);
end;
intnum :=length(extractfilename(edit1.Text))-4;
filename :=extractfilepath(edit1.Text)+copy(extractfilename(edit1.text),1,intnum)+'1'+extractfileext(edit1.Text);
if fileexists(filename) then
showmessage('已经存在转换完成文件,不能重复转换!')
else
begin
mysheet.saveas(filename);
showmessage('恭喜,转换完成为'+filename);
end;
myexcel.quit;
end;
except
showmessage('意外错误,查看是否选择正确文件和是否安装Excel');
//myexcel.quit;
myexcel := unassigned;
exit;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
opendialog1.Execute;
myexcel := createoleobject('excel.application');
myexcel.visible := true;
myexcel.workbooks.open(opendialog1.FileName);
end;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleServer, ExcelXP, comobj, Spin;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
SpinEdit3: TSpinEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
myexcel,myworkbook,mysheet:variant;
glb,t1 :integer;
implementation
{$R *.dfm}
//------------------------
//将阿拉伯数字转成英文字串
//------------------------
function num2ceng(strArabic:string):string;//不带小数点英文转换中文
const
sw:array[2..9]of string=('twenty','thirty','forty','fifty','sixty','seventy','eighty','ninety');
gw:array[1..19] of string=('one','two','three','four','five','six','seven','eight','nine','ten','eleven','twelve','thirteen','fourteen','fifteen','sixteen','seventeen','eighteen','nineteen');
exp:array[1..4] of string=('','thousand','million','billion');
var
t,j:integer;
ts:string;
function readu1000(ss:string):string;
var
t,code:integer;
begin
result := '';
while ss[1]='0' do
begin
delete(ss,1,1);
if length(ss)=0 then exit;//控制全是0情况
end;
if length(ss)=3 then
begin
appendstr(result,gw[ord(ss[1])-ord('0')]);
appendstr(result,' hundred ');
delete(ss,1,1);
end;
while ss[1]='0' do
begin
delete(ss,1,1);
if length(ss)=0 then exit;
end;
if length(ss)<>0 then
if result <> '' then appendstr(result,'and ');
if (glb = 1) and (t1<>1) then //超过百位时候处理最后3位
if result='' then appendstr(result,'and ');
begin
val(ss,t,code);
if t<20 then result :=result+gw[t]
else if t mod 10=0 then result:=result+sw[t div 10]
else result := result+sw[trunc(t/10)]+'-'+gw[t mod 10];
end;
end;
begin
result :='Say ';
t := pos('.',strArabic);
if t=0 then t:=length(strArabic)+1;
while (t mod 3<>1)do
begin
t:=t+1;
strArabic:='0'+ strArabic;
end;
t1:=(t-1) div 3;
for glb:=t1 downto 1 do
begin
ts:='';
for j:=1 to 3 do
begin
ts:=ts+ strArabic[1];
delete(strArabic,1,1);
end;
result := result + readu1000(ts);
if ts<>'000' then result := result+' '+exp[glb]+' ';
end;
if length(strArabic)<>0 then
begin
delete(strArabic,1,1);
appendstr(result,'and ');
result :=result + readu1000(strArabic);
end;
end;
function num2cengnum(strArabic:string):string;
const
gw:array[1..10] of string =('0','one','two','three','four','five','six','seven','eight','nine');
var
p,i,j,x:integer;
s:string;
begin
result := '';
s := strarabic;
p := pos('.',strarabic);
if p = 0 then
begin
result := num2ceng(strarabic)+'Only';
exit;
end
else
begin
i := length(s)-p;//计算小数点后面有几位
delete(strarabic,p,i+1);//删除小数点后面数字
result := num2ceng(strarabic)+'Point';
end;
for x:=1 to i do //转换小数点后面数字
begin
j:= strtoint(copy(s,p+x,1));
case j of
0: result := result +' '+gw[1];
1: result := result +' '+gw[2];
2: result := result +' '+gw[3];
3: result := result +' '+gw[4];
4: result := result +' '+gw[5];
5: result := result +' '+gw[6];
6: result := result +' '+gw[7];
7: result := result +' '+gw[8];
8: result := result +' '+gw[9];
9: result := result +' '+gw[10];
end;
end;
end;
//-----------------------------------------
// Num2CNum 将阿拉伯数字转成中文数字字串
//------------------------------------------
function Num2CNum(dblArabic: double): string;
const
_ChineseNumeric = '零壹贰叁肆伍陆柒捌玖';
var
sArabic: string;
sIntArabic: string;
iPosOfDecimalPoint: integer;
i: integer;
iDigit: integer;
iSection: integer;
sSectionArabic: string;
sSection: string;
bInZero: boolean;
bMinus: boolean;
(* 将字串反向, 例如: 传入 '1234', 传回 '4321' *)
function ConvertStr(const sBeConvert: string): string;
var
x: integer;
begin
Result := '';
for x := Length(sBeConvert) downto 1 do
AppendStr(Result, sBeConvert[x]);
end; { of ConvertStr }
begin
Result := '';
bInZero := True;
sArabic := FloatToStr(dblArabic); (* 将数字转成阿拉伯数字字串 *)
{$IFDEF __Debug}
ShowMessage('FloatToStr(dblArabic): ' + sArabic);
{$ENDIF}
if sArabic[1] = '-' then
begin
bMinus := True;
sArabic := Copy(sArabic, 2, 254);
end
else
bMinus := False;
iPosOfDecimalPoint := Pos('.', sArabic); (* 取得小数点的位置 *)
{$IFDEF __Debug}
ShowMessage('Pos(''.'', sArabic) ' + IntToStr(iPosOfDecimalPoint));
{$ENDIF}
(* 先处理整数的部分 *)
if iPosOfDecimalPoint = 0 then
sIntArabic := ConvertStr(sArabic)
else
sIntArabic := ConvertStr(Copy(sArabic, 1, iPosOfDecimalPoint - 1));
(* 从个位数起以每四位数为一小节 *)
for iSection := 0 to ((Length(sIntArabic) - 1) div 4) do
begin
sSectionArabic := Copy(sIntArabic, iSection * 4 + 1, 4);
sSection := '';
(* 以下的 i 控制: 个十百千位四个位数 *)
for i := 1 to Length(sSectionArabic) do
begin
iDigit := Ord(sSectionArabic[i]) - 48;
if iDigit = 0 then
begin
(* 1. 避免 '零' 的重覆出现 *)
(* 2. 个位数的 0 不必转成 '零' *)
if (not bInZero) and (i <> 1) then sSection := '零' + sSection;
bInZero := True;
end
else
begin
case i of
2: sSection := '拾' + sSection;
3: sSection := '佰' + sSection;
4: sSection := '仟' + sSection;
end;
sSection := Copy(_ChineseNumeric, 2 * iDigit + 1, 2) +
sSection;
bInZero := False;
end;
end;
(* 加上该小节的位数 *)
if Length(sSection) = 0 then
begin
if (Length(Result) > 0) and (Copy(Result, 1, 2) <> '零') then
Result := '零' + Result;
end
else
begin
case iSection of
0: Result := sSection;
1: Result := sSection + '万' + Result;
2: Result := sSection + '亿' + Result;
3: Result := sSection + '兆' + Result;
end;
end;
{$IFDEF __Debug}
ShowMessage('sSection: ' + sSection);
ShowMessage('Result: ' + Result);
{$ENDIF}
end;
(* 处理小数点右边的部分 *)
if iPosOfDecimalPoint > 0 then
begin
AppendStr(Result, '元');
{for i := iPosOfDecimalPoint + 1 to Length(sArabic) do
begin
iDigit := Ord(sArabic[i]) - 48;
AppendStr(Result, Copy(_ChineseNumeric, 2 * iDigit + 1, 2));
end;---没有限制小数点后面位置}
i := iPosOfDecimalPoint + 1;
iDigit := Ord(sArabic[i]) - 48;
if Copy(_ChineseNumeric, 2 * iDigit + 1, 2) <> '零' then
begin
AppendStr(Result, Copy(_ChineseNumeric, 2 * iDigit + 1, 2));
Result := Result+'角';
end
else
begin
AppendStr(Result, Copy(_ChineseNumeric, 2 * iDigit + 1, 2));
end;
i := i+1;
iDigit := Ord(sArabic[i]) - 48;
AppendStr(Result, Copy(_ChineseNumeric, 2 * iDigit + 1, 2));
Result := Result+'分'
end;
{$IFDEF __Debug}
ShowMessage('Result before 其他例外处理: ' + Result);
{$ENDIF}
(* 其他例外状况的处理 *)
if Length(Result) = 0 then Result := '零';
if Copy(Result, 1, 4) = '一十' then Result := Copy(Result, 3, 254);
if Copy(Result, 1, 2) = '点' then Result := '零' + Result;
if iposofdecimalpoint = 0 then result := result + '元整';
(* 是否为负数 *)
if bMinus then Result := '负' + Result;
{$IFDEF __Debug}
ShowMessage('Result before Exit: ' + Result);
{$ENDIF}
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
opendialog1.Execute;
edit1.Text := opendialog1.FileName;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
introw,intnum,i,col1,col2,col3:integer;
filename :string;
begin
try
if application.MessageBox('你确定要转换么?','信息提示:',mb_yesno+mb_defbutton1+mb_iconinformation)= idyes then
begin
if fileexists(edit1.Text) = false then
begin
showmessage('文件不存在,请重新选择文件');
exit;
end;
myexcel:= CreateOleObject('Excel.Application');
myworkbook := myexcel.workbooks.open(edit1.text);
myexcel.Visible := false;
mysheet := myexcel.worksheets[1];
introw := mysheet.UsedRange.Rows.Count;//计算多少行
col1 := spinedit1.Value;
col2 := spinedit2.Value;
col3 := spinedit3.Value;
for i:=1 to introw do
begin
myexcel.cells[i,col2].value := Num2CNum(strtofloat(myexcel.cells[i,col1].value));
myexcel.cells[i,col3].value := num2cengnum(myexcel.cells[i,col1].value);
end;
intnum :=length(extractfilename(edit1.Text))-4;
filename :=extractfilepath(edit1.Text)+copy(extractfilename(edit1.text),1,intnum)+'1'+extractfileext(edit1.Text);
if fileexists(filename) then
showmessage('已经存在转换完成文件,不能重复转换!')
else
begin
mysheet.saveas(filename);
showmessage('恭喜,转换完成为'+filename);
end;
myexcel.quit;
end;
except
showmessage('意外错误,查看是否选择正确文件和是否安装Excel');
//myexcel.quit;
myexcel := unassigned;
exit;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
opendialog1.Execute;
myexcel := createoleobject('excel.application');
myexcel.visible := true;
myexcel.workbooks.open(opendialog1.FileName);
end;
end.