StringGrid导出Excel问题(在线等....分不是问题...)(100分)

  • 主题发起人 主题发起人 fghyxxe
  • 开始时间 开始时间
F

fghyxxe

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TOperateSTrGrid.XlsWriteCellLabel(XlsStream: TStream; const ACol,
ARow: Word; AValue: string);
var
L: Integer;
const
{$J+}
CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
{$J-}
begin

L := Length(AValue);
CXlsLabel[1] := 8 + L;
CXlsLabel[2] := ARow;
CXlsLabel[3] := ACol;
CXlsLabel[5] := L;
XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
XlsStream.WriteBuffer(Pointer(AValue)^, L);
end;

function TOperateSTrGrid.StringGridToExcel(AGrid: TStringGrid;
AFileName: string;R1,R2,C1,C2 : Integer): Boolean;
const
{$J+} CXlsBof: array[0..5] of Word = ($809, 8, 0, $10, 0, 0); {$J-}
CXlsEof: array[0..1] of Word = ($0A, 00);
var
FStream: TFileStream;
I, J: Integer;
begin
R1 := FristRow; //第一行
R2 := FinallyRow; //最后一行
C1 := FristCol; //第一列
C2 := FinallyCol; //最后一列

if R1 = 0 then
R1 := 1;
if C1 = 0 then
C1 := 1;
if R2 = 0 then
R2 := AGrid.RowCount;
if C2 = 0 then
C2 := AGrid.ColCount;

FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite);
try
CXlsBof[4] := 0;
FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
for i := C1-1 to C2 do
for j := R1-1 to R2 do
XlsWriteCellLabel(FStream, I, J, AGrid.cells[i, j]);
FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
Result := True;
finally
FStream.Free;
end;
end;
上面的两个函数在导出Excel时,当数据量比较小的时候,比如说AGrid.Cells[1,1]的数据量比较少的时候.就可以正常的导出到Excel中.可是它数据量太大的时候,如AGrid.Cells[1,1]中的字符串有几千个字的时候.就会在打开Excel时出现:不能读取文件,用文本文件打个这个Excel文件时,里面的数据却存在.请问这是怎么一回事呀?
大家帮帮忙呀.
 
大家帮帮忙呀....
 
唉..........高手那去了....看来还是得自己搞定...每次在这里提问的问题都没有回答我的....
 
我再顶...问题还是没有解决...
 
看来是Excel的问题
但是Excel每个单元格中最多可容纳32000个字符数
应该不成问题啊
关注
 
http://www.xgdown.com/article/243/61822_1.htm
这是Excel的文件格式.可是我找不到是那个位标识可以写入32000个字符数的.那位E文比较好的帮我看看.谢谢...
 
看来是Excel的问题
但是Excel每个单元格中最多可容纳32000个字符数
应该不成问题啊
关注
 
绝招2,你可以这样,输出到一个“文件.csv”
文件内容是一行一行的文本,行内" , "隔开;

可以一次写进文本;

成功过
 
金卡绣球jk8.com...你的办法是可行的.不过在我这却无法用上.因为字符串中也有#9,而且是不可去掉的.还是谢谢你.
会Excel文件格式的麻烦给我说一下.谢谢.
 
我只会把DBGRID中的数据导出到Excel,不知你要不要?
 
可以参考下呀.我在网上也找了很多资料.麻烦山雨留下代码.谢谢.
 
找了好一会才从我原来做的程序中找到一个,剪下来给你做个参考:让你久等

//这是函数
function TDHZLModifyForm.CopyDbDataToExcel(Args: array of const):integer;
var
iCount, jCount: Integer;
XLApp: Variant;
Sheet: Variant;
I: Integer;
begin
Screen.Cursor := crHourGlass;
if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts := False;
XLApp.Quit;
VarClear(XLApp);
end;

try
XLApp := CreateOleObject('Excel.Application');
except
Screen.Cursor := crDefault;
application.MessageBox('请先安装MICROSOFT EXCEL 2000!','提示',mb_ok+mb_iconinformation);
Exit;
end;

XLApp.WorkBooks.Add;
XLApp.SheetsInNewWorkbook := High(Args) + 1;

for I := Low(Args) to High(Args) do
begin
XLApp.WorkBooks[1].WorkSheets[I+1].Name := TDBGrid(Args.VObject).Name;
Sheet := XLApp.Workbooks[1].WorkSheets[TDBGrid(Args.VObject).Name];

if not TDBGrid(Args.VObject).DataSource.DataSet.Active then
begin
Screen.Cursor := crDefault;
Exit;
end;

TDBGrid(Args.VObject).DataSource.DataSet.first;
for iCount := 0 to TDBGrid(Args.VObject).Columns.Count - 1 do
Sheet.Cells[1, iCount + 1] :=
TDBGrid(Args.VObject).Columns.Items[iCount].Title.Caption;

jCount := 1;
while not TDBGrid(Args.VObject).DataSource.DataSet.Eof do
begin
for iCount := 0 to TDBGrid(Args.VObject).Columns.Count - 1 do
Sheet.Cells[jCount + 1, iCount + 1] :=
TDBGrid(Args.VObject).Columns.Items[iCount].Field.AsString;

Inc(jCount);
TDBGrid(Args.VObject).DataSource.DataSet.Next;
end;
end;

XlApp.Visible := True;
Screen.Cursor := crDefault;

end;
//这是调用
procedure TDHZLModifyForm.BitBtn6Click(Sender: TObject);
begin
CopyDbDataToExcel([dbgrid1]);
end;
 
这种方式我试过了....可是速度太慢了.我的StringGrid中的那一格数据都过千的.所以用这种一行一行加入Excel中的办法真是没办法实现我的要求.

不过还是谢谢山雨你的.谢谢.
 
看上面绝招2
 
感谢:金卡绣球jk8.com 这么热心.
我要导出到Excel中的数据很大的.比如把一个上10K的文本文件导出到一个Excel的单元格中.当然这只是说明一下一个单元格的数据之大.

希望能有更好的答案...
 
一样可以的,这个单元格的数据用 “” 引号引起来,只要中间没有英文逗号就可以;
 
"文件内容是一行一行的文本","只要中间没有英文逗号就可以"....文件内容有很多行.我试把#13#10都替换掉也无法用你的方法呀.金卡绣球jk8.com大哥..不知道还有没有什么办法?真是不好意思了.
 
有没有人高手经过.......留下点......知识呀.....
 
后退
顶部