首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

难题:希望有高手可以将下面的PAS文件修改,可以使导出到EXCEL的数据超过65536条,该如何处理

2012-02-20 
难题:希望有高手可以将下面的PAS文件修改,可以使导出到EXCEL的数据超过65536条各位朋友,PAS文件如下,当DBG

难题:希望有高手可以将下面的PAS文件修改,可以使导出到EXCEL的数据超过65536条
各位朋友,PAS文件如下,当DBGridEh里面的内容超过65536条的时候,导出到EXCEL的时候就不正常,小弟想实现如下目的:将DBGridEh里面的内容导出到EXCEL的时候,超过6万条的,就自动导出到当前EXCEL文件的另外一个SHEET,如果当前的SHEET满了6万条,又继续导出到当前文件的另外一个SHEET,依次类推,使其导出的数据不局限于6万条记录左右,其实整个程序的难点就在于,如何判断当前的SHEET已经满,当前导出的记录已经导出到第几条,请问有没有大虾可以帮忙修改一下下面的PAS文件,使其可以实现上面的功能呢?

诚心向各位大虾求救,万分感谢!!!


unit U_DBGridEhToExcel;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ComCtrls, ExtCtrls, StdCtrls, Gauges, DBGridEh, ShellApi;
type
  TTitleCell = array of array of string;
 //分解DBGridEh的标题
  TDBGridEhTitle = class
  private
  FDBGridEh: TDBGridEh; //对应DBGridEh
  FColumnCount: integer; //DBGridEh列数(指visible为True的列数)
  FRowCount: integer; //DBGridEh多表头层数(没有多表头则层数为1)
  procedure SetDBGridEh(const Value: TDBGridEh);
  function GetTitleRow: integer; //获取DBGridEh多表头层数
  function GetTitleColumn: integer; //获取DBGridEh列数
  public
 //分解DBGridEh标题,由TitleCell二维动态数组返回
  procedure GetTitleData(var TitleCell: TTitleCell);
  published
  property DBGridEh: TDBGridEh read FDBGridEh write SetDBGridEh;
  property ColumnCount: integer read FColumnCount;
  property RowCount: integer read FRowCount;
  end;
  TDBGridEhToExcel = class(TComponent)
  private
  FCol: integer;
  FRow: integer;
  FProgressForm: TForm; {进度窗体}
  FGauge: TGauge; {进度条}
  Stream: TStream; {输出文件流}
  FBookMark: TBookmark;
  FShowProgress: Boolean; {是否显示进度窗体}
  FDBGridEh: TDBGridEh;
  FBeginDate: TCaption; {开始日期}
  FTitleName: TCaption; {Excel文件标题}
  FEndDate: TCaption; {结束日期}
  FUserName: TCaption; {制表人}
  FFileName: string; {保存文件名}
  procedure SetShowProgress(const Value: Boolean);
  procedure SetDBGridEh(const Value: TDBGridEh);
  procedure SetBeginDate(const Value: TCaption);
  procedure SetEndDate(const Value: TCaption);
  procedure SetTitleName(const Value: TCaption);
  procedure SetUserName(const Value: TCaption);
  procedure SetFileName(const Value: string);
  procedure IncColRow;
  procedure WriteBlankCell; {写空单元格}
 {写数字单元格}
  procedure WriteFloatCell(const AValue: Double; const IncStatus: Boolean = True);
 {写整型单元格}
  procedure WriteIntegerCell(const AValue: Integer; const IncStatus: Boolean = True);
 {写字符单元格}
  procedure WriteStringCell(const AValue: string; const IncStatus: Boolean = True);
  procedure WritePrefix;
  procedure WriteSuffix;
  procedure WriteHeader; {输出Excel标题}
  procedure WriteTitle; {输出Excel列标题}
  procedure WriteDataCell; {输出数据集内容}
  procedure WriteFooter; {输出DBGridEh表脚}
  procedure SaveStream(aStream: TStream);
  procedure CreateProcessForm(AOwner: TComponent); {生成进度窗体}
  {根据表格修改数据集字段顺序及字段中文标题}
  procedure SetDataSetCrossIndexDBGridEh;
  public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
  procedure ExportToExcel; {输出Excel文件}
  published
  property DBGridEh: TDBGridEh read FDBGridEh write SetDBGridEh;
  property ShowProgress: Boolean read FShowProgress write SetShowProgress;
  property TitleName: TCaption read FTitleName write SetTitleName;
  property BeginDate: TCaption read FBeginDate write SetBeginDate;
  property EndDate: TCaption read FEndDate write SetEndDate;
  property UserName: TCaption read FUserName write SetUserName;


  property FileName: string read FFileName write SetFileName;
  end;
var
  CXlsBof: array[0..5] of Word = ($809, 8, 0, $10, 0, 0);
  CXlsEof: array[0..1] of Word = ($0A, 00);
  CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
  CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
  CXlsRk: array[0..4] of Word = ($27E, 10, 0, 0, 0);
  CXlsBlank: array[0..4] of Word = ($201, 6, 0, 0, $17);
implementation
  { TDBGridEhTitle }

function TDBGridEhTitle.GetTitleColumn: integer;
var
  i, ColumnCount: integer;
begin
  ColumnCount := 0;
  for i := 0 to DBGridEh.Columns.Count - 1 do
  begin
  if DBGridEh.Columns[i].Visible then
  Inc(ColumnCount);
  end;
  Result := ColumnCount;
end;

procedure TDBGridEhTitle.GetTitleData(var TitleCell: TTitleCell);
var
  i, Row, Col: integer;
  Caption: string;
begin
  FColumnCount := GetTitleColumn;
  FRowCount := GetTitleRow;
  SetLength(TitleCell, FColumnCount, FRowCount);
  Row := 0;
  for i := 0 to DBGridEh.Columns.Count - 1 do
  begin
  if DBGridEh.Columns[i].Visible then
  begin
  Col := 0;
  Caption := DBGridEh.Columns[i].Title.Caption;
  while POS('|', Caption) > 0 do
  begin
  TitleCell[Row, Col] := Copy(Caption, 1, Pos('|', Caption) - 1);
  Caption := Copy(Caption, Pos('|', Caption) + 1, Length(Caption));
  Inc(Col);
  end;
  TitleCell[Row, Col] := Caption;
  Inc(Row);
  end;
  end;
end;

function TDBGridEhTitle.GetTitleRow: integer;
var
  i, j: integer;
  MaxRow, Row: integer;
begin
  MaxRow := 1;
  for i := 0 to DBGridEh.Columns.Count - 1 do
  begin
  Row := 1;
  for j := 0 to Length(DBGridEh.Columns[i].Title.Caption) do
  begin
  if DBGridEh.Columns[i].Title.Caption[j] = '|' then
  Inc(Row);
  end;
  if MaxRow < Row then
  MaxRow := Row;
  end;
  Result := MaxRow;
end;

procedure TDBGridEhTitle.SetDBGridEh(const Value: TDBGridEh);
begin
  FDBGridEh := Value;
end;
  { TDBGridEhToExcel }

constructor TDBGridEhToExcel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FShowProgress := True;
end;

procedure TDBGridEhToExcel.SetShowProgress(const Value: Boolean);
begin
  FShowProgress := Value;
end;

procedure TDBGridEhToExcel.SetDBGridEh(const Value: TDBGridEh);
begin
  FDBGridEh := Value;
end;

procedure TDBGridEhToExcel.SetBeginDate(const Value: TCaption);
begin
  FBeginDate := Value;
end;

procedure TDBGridEhToExcel.SetEndDate(const Value: TCaption);
begin
  FEndDate := Value;
end;

procedure TDBGridEhToExcel.SetTitleName(const Value: TCaption);
begin
  FTitleName := Value;
end;

procedure TDBGridEhToExcel.SetUserName(const Value: TCaption);
begin
  FUserName := Value;
end;

procedure TDBGridEhToExcel.SetFileName(const Value: string);
begin
  FFileName := Value;
end;


[解决办法]
这个不是pas的问题,使excel本身的问题,超过了你可以分多个sheet导出
------解决方案--------------------


不要把一下把所有的data在WriteDataCell全部寫進,只寫一條就好;建議循環寫在exporttoexcel,這樣就有更多的控制,在這裡就可以控制再打開一個新的excel頁面;
你好象沒有把exporttoexcel實作過程貼出來

热点排行