sql server2000数据库的数据经查询后如何导出到excel表及打印? ( 积分: 50 )

  • 主题发起人 主题发起人 dxwwgr
  • 开始时间 开始时间
D

dxwwgr

Unregistered / Unconfirmed
GUEST, unregistred user!
我用C++ Builder 5.0的 ADOQuery控件操作sql server2000数据库编写的一系统,客户提出要把查询的结果导出到excel表及打印,我是菜鸟我不会.请教各位大师,谢谢,只还有50分给你!
 
我用C++ Builder 5.0的 ADOQuery控件操作sql server2000数据库编写的一系统,客户提出要把查询的结果导出到excel表及打印,我是菜鸟我不会.请教各位大师,谢谢,只还有50分给你!
 
看看怎麽樣?給分吧
var
ExcelApp,WorkSheets,WorkBooks: Variant;
sTempFileName:string;
i:integer;
begin
ExcelApp := CreateOleObject( 'Excel.Application' );
Sd_InputExcel.Filter:='Microsoft Excel Files (*.xls)|*.XLS';
if Sd_InputExcel.Execute then
begin
if Pos('.XLS',UpperCase(Sd_InputExcel.FileName))=0 then
sTempFileName:=Sd_InputExcel.FileName+'.XLS'
else
sTempFileName:=Sd_InputExcel.FileName;
try
ExcelApp := CreateOLEObject('Excel.Application');
except
Application.Messagebox('錯誤','提示:',64);
Exit;
end;
WorkBooks := ExcelApp.WorkBooks.Add;
WorkSheets := WorkBooks.WorkSheets.Add;
ExcelApp.Cells[1,1].Value := 'Field1';
ExcelApp.Cells[1,2].Value := 'Field2';
for i:=2 to StringGrid1.RowCountdo
if trim(StringGrid1.Cells[1,i-1])<>'' then
begin
ExcelApp.Cells[i,1].Value :=StringGrid1.Cells[1,i-1];
ExcelApp.Cells[i,2].Value :=StringGrid1.Cells[2,i-1];
end;
ExcelApp.ActiveSheet.columns['A:M'].autofit;
Excelapp.ActiveWorkbook.SaveAs(sTempFileName);
ExcelApp.WorkBooks.Close;
ExcelApp.Quit;
showmessage('成功導出');
end;

end;
 
谢谢,但我看不懂,你只会C++ BUILDER 5.0 ,能用C++ BUILDER 5.0 写一个例子程序给我看吗?
 
增强型DBGrid2Excel-- 支持标题粗体,对齐格式与避免科学计算法 选择自do
gbear2000 的 Blog
关键字 增强型DBGrid2Excel-- 支持标题粗体,对齐格式与避免科学计算法
出处

unit dbgrid2excel;
{
功能描述:把DBGrid输出到Excel表格(支持多Sheet)
调用格式:DBGridToExcel([DBGrid1, DBGrid2]);
对于数字用AsString, 其它可能含有格式的文本用DisplayText
长数字字符 的Tag C_LongNumber_FieldTag = 9;
避免科学计算格式,如身份证号的显示
自动采用对齐属性, 标题粗体

}
interface
uses
classes, comctrls, stdctrls, windows, Dialogs, controls, SysUtils,
Db,DBGrids,forms,ComObj,Variants;
const
C_LongNumber_FieldTag = 9;
//这些不可运算文字可能含有格式
function MayHasFormatText(const AFieldType:TFieldType):Boolean;
procedure DBGridToExcel(Args: array of const);
implementation
function MayHasFormatText(const AFieldType:TFieldType):Boolean;
begin
Result := AFieldType in
[ftBoolean, ftDate, ftTime, ftDateTime, ftTimeStamp,
ftString, ftFixedChar, ftWideString] ;
end;

{
功能描述:把DBGrid输出到Excel表格(支持多Sheet)
调用格式:DBGridToExcel([DBGrid1, DBGrid2]);
}
procedure DBGridToExcel(Args: array of const);
const
xlHAlignCenter = -4108;
xlHAlignLeft = -4131;
xlHAlignRight = -4152;
var
iCount, jCount: Integer;
XLApp: Variant;
Sheet: Variant;
I: Integer;
BK : TBookMark;
DataSet:TDataSet;
Col : TColumn;
CellStr : string;
GAL :TAlignment;
EAL : 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;
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;
DataSet := TDBGrid(Args.VObject).DataSource.DataSet;
DataSet.DisableControls;
BK := DataSet.GetBookmark();
DataSet.First;
//标题
for iCount := 0 to TDBGrid(Args.VObject).Columns.Count - 1do
begin
Col := TDBGrid(Args.VObject).Columns.Items[iCount];
Sheet.Cells[1, iCount + 1] := Col.Title.Caption;
Sheet.Cells[1, iCount + 1].Font.Bold :=True ;//粗体
GAL := Col.Alignment;
if GAL = taLeftJustify then
EAL := xlHAlignLeft
else
if GAL = taCenter then
EAL := xlHAlignCenter
else
EAL := xlHAlignRight;
//列数据对齐格式
Sheet.Columns[iCount + 1].HorizontalAlignment := EAL ;
//列标题对齐格式
Sheet.Cells[1, iCount + 1].HorizontalAlignment := xlHAlignCenter;
//自定义格式, 避免把长数字字符转换为科学记数法
if Col.Field.Tag=C_LongNumber_FieldTag then
Sheet.Columns[iCount + 1].NumberFormatLocal :='@';
end;
//数据
jCount := 1;
while not DataSet.Eofdo
begin
for iCount := 0 to TDBGrid(Args.VObject).Columns.Count - 1do
begin
Col := TDBGrid(Args.VObject).Columns.Items[iCount];
if MayHasFormatText(Col.Field.DataType) then
CellStr := Col.Field.DisplayText
else
CellStr:= Col.Field.AsString;
Sheet.Cells[jCount + 1, iCount + 1] := CellStr;
end;
Inc(jCount);
DataSet.Next;
Application.ProcessMessages;
end;
DataSet.GotoBookmark(BK);
DataSet.FreeBookmark(BK);
DataSet.EnableControls;
XlApp.Visible := True;
//用户关掉, 就可以关掉内存中的Excel试验通过2005.2.5
Sheet := unAssigned;
//可以不要
end;
Screen.Cursor := crDefault;
end;

end.


作者Blog:http://blog.csdn.net/dogbear2000/
相关文章
增强型DBGrid2Excel-- 支持标题粗体,对齐格式与避免科学计算法
Excel 常用 枚举常量 列表
Delphi连接关系数据库,不支持自动获取自增型字段的新值, 最好不用数据库的AutoInc字段,而是手工提供
Delphi中使用ADO组件,利用UDL可以在不修改源代码的情况下后台数据库可以在MS SQL Server与Access之间切换吗?
An Unknown error has occurred -- EOleException 解决方法
 
谢谢,还是看不懂,有哪位大哥能通俗易懂讲一下,小弟再三感谢!
 
为什么不动手试一下,这样容易看效果
 
不好意思,我主要是现在程序还有很多事情要,原来规划两人做现在只我一人做,没时间做试验,小弟请各位富翁用C++BUILDER 5。0 写一例子程序给我,或告诉我哪里有,谢谢
 
没有人能帮助我吗?
 
[?][?][?][red][/red]富翁们就没人能帮助我吗[?]
 
无非三种方法啦:
1. 创建excel的OleDocument,缺点是必须安装excel,太消耗资源,不适合在应用服务器上使用。
2. 直接创建excel格式的文件,有现成的库可以使用,不过通常支持的excel版本不高。
3. 使用excel的oledb/odbc驱动,利用sql语句创建excel。
 
补充一下楼上的方法:
我还有一个很菜的方法,可以导出数据到EXCEL但不支持格式,但最简单了:就是
把数据集的数据用循环读入一个STRINGLIST中,每一行用TAB或逗号分隔,最后STRINGLIST.SAVETOFILE就可以了.^-^
 
谢谢楼上的补充,确实还有两种方法:
1. 导出用逗号分隔的文件,简称csv
2. 导出为xml格式,缺点是只有office xp以后版本支持。
 
后退
顶部