F
fly-king
Unregistered / Unconfirmed
GUEST, unregistred user!
我的一个程序需要在一个特定的Excel的格子里面显示并打印信息,
程序的要求是这样的,在信息多到这个大小固定的Cell写不完的时
候,要新建一个新的预览页,在同样的位置继续写这个信息。
现在呢,我发现这样一个问题,那就是怎样判断一个格子是不是已
经写满了呢?
我利用和如下的代码算法写的
var
CharCount, LineCount: Integer; //这个Celll里面的每行的字符数和行数
TotalChar: Integer;//这个Cell里面可以写的字符总数
Info: String;
LeftInfo,TempS: String;
CurPos, InfoLen: Integer;
KeyX: Char;
KeyY: Integer; //写字符的格子的坐标
PosStr: String;
begin
InfoLen := Length(Info);
LeftInfo := Info;
CurPos := 0;
KeyX := 'A';
KeyY := 1;
PosStr := 'A1';
while CurPos <= InfoLen do
begin
CharCount := Sheet1.Range[PosStr].Width Div Sheet1.Range[PosStr].Font.Size;
LineCount := Sheet1.Range[PosStr].Height Div Sheet1.Range[PosStr].Font.Size;
TotalChar := CharCount * LineCount; //计算出一共可以写多少个字符
TempS := Copy(InfoLeft,1,TotalChar);
InfoLeft := Copy(InfoLeft,TotalChar + 1, TotalChar);
PosStr := KeyX + IntToStr(KeyY);
Sheet.Range[PosStr].Value := TempS;
CurPos := CurPos + TotalChar;
KeyX := Chr(Inc(Ord(KeyX))); //我们只假设最多26列,其实Excel最多支持255
//(?)个
KeyY := Inc(KeyY); //我们假设从左上角写到右下角
end;
end;
可是,在程序运行的时候,发现了这样的一个问题:
那就是在显示和打印的时候,汉字的宽度和代码里面的
Sheet1.Range(PosStr).Font.Size是一致的可是英文字符的宽度却不
是这样的,在缺省的情况下,一个格子(Cell)的可以写4个汉字,7
个大写的英文字符,9个小写的英文字符。可是Excel返回的字体的大
小,全部都是一样的。
怎么才能解决字体宽度不一产生的这个问题呢?
1,仿佛最好的办法是从利用Com操作Excel,让每个cell自己计算需要
到多长的字符串,但是怎么实现?
2,另外的办法是挨个的数Info的字符,要是汉字的话,就增加1,要是
大写或者小写的西文字符,就增加不到1的值(比如0.5),可是,这个
值怎么换算?和字体的设置是不是有关系?
3,这个算法最笨,就是试探着写,在Cell的里面写一个或者一组字符,
然后检测,这个Cell是不是写满了,这么运行,要不停的调用Com的接口
,那对于操作系统,肯定是一场灾难,而且运行的速度(^_^),最重要的
是,怎么Excel的哪个是处理这个的
程序的要求是这样的,在信息多到这个大小固定的Cell写不完的时
候,要新建一个新的预览页,在同样的位置继续写这个信息。
现在呢,我发现这样一个问题,那就是怎样判断一个格子是不是已
经写满了呢?
我利用和如下的代码算法写的
var
CharCount, LineCount: Integer; //这个Celll里面的每行的字符数和行数
TotalChar: Integer;//这个Cell里面可以写的字符总数
Info: String;
LeftInfo,TempS: String;
CurPos, InfoLen: Integer;
KeyX: Char;
KeyY: Integer; //写字符的格子的坐标
PosStr: String;
begin
InfoLen := Length(Info);
LeftInfo := Info;
CurPos := 0;
KeyX := 'A';
KeyY := 1;
PosStr := 'A1';
while CurPos <= InfoLen do
begin
CharCount := Sheet1.Range[PosStr].Width Div Sheet1.Range[PosStr].Font.Size;
LineCount := Sheet1.Range[PosStr].Height Div Sheet1.Range[PosStr].Font.Size;
TotalChar := CharCount * LineCount; //计算出一共可以写多少个字符
TempS := Copy(InfoLeft,1,TotalChar);
InfoLeft := Copy(InfoLeft,TotalChar + 1, TotalChar);
PosStr := KeyX + IntToStr(KeyY);
Sheet.Range[PosStr].Value := TempS;
CurPos := CurPos + TotalChar;
KeyX := Chr(Inc(Ord(KeyX))); //我们只假设最多26列,其实Excel最多支持255
//(?)个
KeyY := Inc(KeyY); //我们假设从左上角写到右下角
end;
end;
可是,在程序运行的时候,发现了这样的一个问题:
那就是在显示和打印的时候,汉字的宽度和代码里面的
Sheet1.Range(PosStr).Font.Size是一致的可是英文字符的宽度却不
是这样的,在缺省的情况下,一个格子(Cell)的可以写4个汉字,7
个大写的英文字符,9个小写的英文字符。可是Excel返回的字体的大
小,全部都是一样的。
怎么才能解决字体宽度不一产生的这个问题呢?
1,仿佛最好的办法是从利用Com操作Excel,让每个cell自己计算需要
到多长的字符串,但是怎么实现?
2,另外的办法是挨个的数Info的字符,要是汉字的话,就增加1,要是
大写或者小写的西文字符,就增加不到1的值(比如0.5),可是,这个
值怎么换算?和字体的设置是不是有关系?
3,这个算法最笨,就是试探着写,在Cell的里面写一个或者一组字符,
然后检测,这个Cell是不是写满了,这么运行,要不停的调用Com的接口
,那对于操作系统,肯定是一场灾难,而且运行的速度(^_^),最重要的
是,怎么Excel的哪个是处理这个的