一个简单的问题(100分)

  • 主题发起人 主题发起人 萍儿
  • 开始时间 开始时间

萍儿

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么我做的报表,导出到excel表中后,导出的数据不全,做多只有310条!!
请那位高手帮我看看!!多谢了!!
我写的导出程序如下:
procedure TForm1.ExportDBGrid(toExcel: Boolean);
var
bm: TBookmark;
col, row: Integer;
sline: String;
mem: TMemo;
ExcelApp: Variant;
begin
Screen.Cursor := crHourglass;
DBGrid1.DataSource.DataSet.DisableControls;
bm := DBGrid1.DataSource.DataSet.GetBookmark;
DBGrid1.DataSource.DataSet.First;

// create the Excel object
if toExcel then
begin
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.WorkBooks.Add(xlWBatWorkSheet);
ExcelApp.WorkBooks[1].WorkSheets[1].Name := 'Grid Data';
end;

// First we send the data to a memo
// works faster than doing it directly to Excel
mem := TMemo.Create(Self);
mem.Visible := false;
mem.Parent := Self;
mem.Clear;
sline := '';

// add the info for the column names
for col := 0 to DBGrid1.FieldCount-1 do
sline := sline + DBGrid1.Fields[col].DisplayLabel + #9;
mem.Lines.Add(sline);

// get the data into the memo
for row := 0 to DBGrid1.DataSource.DataSet.RecordCount-1 do
begin
sline := '';
for col := 0 to DBGrid1.FieldCount-1 do
sline := sline + DBGrid1.Fields[col].AsString + #9;
mem.Lines.Add(sline);
DBGrid1.DataSource.DataSet.Next;
end;

// we copy the data to the clipboard
mem.SelectAll;
mem.CopyToClipboard;

// if needed, send it to Excel
// if not, we already have it in the clipboard
if toExcel then
begin
ExcelApp.Workbooks[1].WorkSheets['Grid Data'].Paste;
ExcelApp.Visible := true;
end;

FreeAndNil(mem);
// FreeAndNil(ExcelApp);
DBGrid1.DataSource.DataSet.GotoBookmark(bm);
DBGrid1.DataSource.DataSet.FreeBookmark(bm);
DBGrid1.DataSource.DataSet.EnableControls;
Screen.Cursor := crDefault;
end;


 
思路有点小问题,最好不要使用剪贴板,那个属于系统的。
看这个帖子,最后面有一个控件能完成这个功能,不过也存在一些问题(控件没有完全释放),懒得改了,呵呵。[:)]
http://www.delphibbs.com/delphibbs/dispq.asp?lid=737517
 
对比你的程序,主要就是下面这两句话,替换你的剪贴板部分代码
data_Str := FDB_Grid.Fields[i - 1].DisplayText;
FWorkbook_Handle.WorkSheets[1].Cells[k, j].Value := data_Str;

 
不过你的为什么会出现那个310的限制,我就没有发言权了。
 
就是呀,怎么有310限制,你把EXCEL重新安装一遍试试,
你用的是EXCEL97还是2000,换成2000.
 
看看這個轉Excel函數:
//Multiselect指是否支持多選,FileNam 指保存的文件名,DBGrid是網格無件
procedure TMainForm.DBGridToExcel(Multiselect: Boolean; FileNam: String; DBGrid: TDBGrid);
var
MSExcel, MSExcelWorkBook, MSExcelWorkSheet: Variant;
ColumnRange: Variant;
LinesCount, FieldsCount, i, j: Integer;
ExportText: Variant;
SaveCursor: TCursor;
ColumnWidth: Array of Integer;
function GetRangeAddr(const ColIndex, RowIndex: Integer): String;
var
i:integer;
begin
if ColIndex > 26 then
Result := Chr((ColIndex div 26) + 64);
i := ColIndex mod 26;
if i > 0 then Result := Result + Chr(i + 64);
Result := Result + IntToStr(RowIndex);
end;
begin
try
MSExcel := CreateOleObject('Excel.Application');
MSExcelWorkBook := MSExcel.WorkBooks.Add;
MSExcelWorkSheet := MSExcel.WorkSheets.Add;
except
ShowMessage('無法与Microsoft Excel連接!');
abort;
end;

try
with DBGrid do
begin
SaveCursor := Screen.Cursor;
Screen.Cursor := crHourGlass;
try
FieldsCount := DBGrid.Columns.Count;
with DataSource.DataSet do
begin
DisableControls;
try
LinesCount := 1;
First;
while not Eof do
begin
Inc(LinesCount);
Next;
end;
ExportText := VarArrayCreate([1, LinesCount, 1, FieldsCount], VarVariant);//創建二維變体類型數組
LinesCount := 1;
SetLength(ColumnWidth, FieldsCount);
for i := 0 to FieldsCount-1 do
begin
ExportText[LinesCount, i + 1] := Columns.Title.Caption;//將Columns列標題寫到數組第一行
ColumnWidth := Round(Columns.Width/64*10);//保存Columns列寬以便在Excel中設置列寬
end;
if not MultiSelect then //如果不支持多重選擇
begin
First;
while not Eof do
begin
Inc(LinesCount);
for i := 0 to FieldsCount-1 do
ExportText[LinesCount, i + 1] := DBGrid.Columns.Field.Value;
Next;
end;
end
else
begin //如果支持多重選擇
if DBGrid.SelectedRows.Count>0 then
with DBGrid.DataSource.DataSet do
for i := 0 to DBGrid.SelectedRows.Count-1 do
begin
GotoBookMark(Pointer(DBGrid.SelectedRows.Items));
Inc(LinesCount);
for j := 0 to FieldsCount-1 do
ExportText[LinesCount, j + 1] := DBGrid.Columns.Field.Value;
end;
end;
MSExcelWorkSheet.Range['A1:' + GetRangeAddr(FieldsCount, LinesCount)].value := Exporttext;
ColumnRange := MSExcelWorkSheet.Columns;
for i := 1 to FieldsCount do
ColumnRange.Columns.ColumnWidth := ColumnWidth[i-1];//設置列寬
MSExcelWorkSheet.Range['A1:' + GetRangeAddr(FieldsCount, LinesCount)].Borders.LineStyle := 1;//設置邊界線
finally
EnableControls;
end;
end;
MSExcelWorkSheet.SaveAs(Filenam);
finally
Screen.Cursor := SaveCursor;
end;
end;
Application.BringToFront;//激活應用程序
ShowMessage('所選資料已成功地存檔到'#13 + Filenam);
finally
try
MSExcel.Quit;
except
end;
end;
end;
 
用dbgrideh,有到excel功能
 
用dxdbgrid最好了,功能最强大的dbgrid类控件。
www.51delphi.com
www.playicq.com有下的。
 
虽然最后我不是用大家给我提供的方法解决的!!但是我还是谢谢各位的帮助!!所以分数我只有
平均分配了!!
 
多人接受答案了。
 
后退
顶部