问题如题,本人也在网上查阅过很多资料,但是都行不通。我现在的方法是采用ADO连接,设置ADOConnection1.ConnectionString:= 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\a.xls;Extended Properties=excel 8.0';
strSql := 'select * into [Sheet1$] from abcde IN [ODBC] [ODBC;Driver=SQL Server;UID=sa;PWD=123;Server=S;DataBase=D]';
try
ADOConnection1.Execute(strSql);
ShowMessage('Succeed');
except
ShowMessage('Failed');
end;
编译运行没有问题,d盘也有a.xls文件,但是点击打开后出现提示“不能访问'a.xls'”。这个方法我是在网上找到的,出现这个问题是怎么回事呢?另外我还查到一种方法,是采用下列语句:EXEC master..xp_cmdshell 'bcp saletesttmp.dbo.CusAccount out c:\temp1.xls -c -q -S"pmserver" -U"sa" -P"sa"'
但我不知道EXEC是怎么一回事,该如何嵌入程序中。把他换成ADOConnection1.Execute,也发现不行。这个问题已困挠我很久了,也影响了开发进程,所以还请各位大虾多多帮忙啊,本人初来乍到,分数不多,但是谁能帮我解决这个问题,我的1/4分数都给他了,不够可以再加。
strSql := 'select * into [Sheet1$] from abcde IN [ODBC] [ODBC;Driver=SQL Server;UID=sa;PWD=123;Server=S;DataBase=D]';
try
ADOConnection1.Execute(strSql);
ShowMessage('Succeed');
except
ShowMessage('Failed');
end;
编译运行没有问题,d盘也有a.xls文件,但是点击打开后出现提示“不能访问'a.xls'”。这个方法我是在网上找到的,出现这个问题是怎么回事呢?另外我还查到一种方法,是采用下列语句:EXEC master..xp_cmdshell 'bcp saletesttmp.dbo.CusAccount out c:\temp1.xls -c -q -S"pmserver" -U"sa" -P"sa"'
但我不知道EXEC是怎么一回事,该如何嵌入程序中。把他换成ADOConnection1.Execute,也发现不行。这个问题已困挠我很久了,也影响了开发进程,所以还请各位大虾多多帮忙啊,本人初来乍到,分数不多,但是谁能帮我解决这个问题,我的1/4分数都给他了,不够可以再加。
解决方案 »
- delphi全局变量问题
- 这样写代码运行正常,但为什么login窗口没出现呢??
- 我这有个delphi调用webservice(VS.net)的未知错误,我想贴图出来,怎么处理?
- 一个关于表单提交的简单问题
- 如何将时间变量加上10秒?
- 怎样释放DLL?
- 问一下‘流’和Tlist的问题,谢谢!
- 如何在没启动workstation服务时候获得本机的工作组
- 如何在客户端显示网络中所有的SQL SERVER服务器?
- 高分!!怎样让进程不被杀死?比如有些进程在windows2000下就不能被任务管理器关闭,提示拒绝访问,如何实现?
- 超难问题! 如何 用 ESC 指令 控制 打印机 打印 直线 和 坚线 和点 ????????????????? 急!!!!!!!!!!!!!!!1
- rave 主从报表怎么生成? 急!!!
我也是用这个的。把这个动态生成一个批处理文件,然后执行就可以了。
vDataSet: TDataSet): Boolean;
var
I,VL_I,j: integer;
S,SysPath: string;
MsExcel:Variant;
begin
Result:=true;
if Application.MessageBox('您确信将数据导入到Excel吗?','提示!',MB_OKCANCEL + MB_DEFBUTTON1) = IDOK then
begin
SysPath:=ExtractFilePath(application.exename);
with TStringList.Create do
try
vDataSet.First ;
S:=S+Header;
add(s);
s:='';
For I:=0 to vDataSet.fieldcount-1 do
begin
If vDataSet.fields[I].visible=true then
S:=S+#9+vDataSet.fields[I].displaylabel;
end;
system.Delete(s,1,1);
add(s);
while not vDataSet.Eof do
begin
S := '';
for I := 0 to vDataSet.FieldCount -1 do
begin
If vDataSet.fields[I].visible=true then
S := S + #9 + vDataSet.Fields[I].AsString;
end;
System.Delete(S, 1, 1);
Add(S);
vDataSet.Next;
end;
Try
SaveToFile(SysPath+'\Tem.xls');
Except
ShowMessage('写文件时发生保护性错误,Excel 如在运行,请先关闭!');
Result:=false;
exit;
end;
finally
Free;
end;
Try
MSExcel:=CreateOleObject('Excel.Application');
Except
ShowMessage('Excel 没有安装,请先安装!');
Result:=false;
exit;
end;
Try
MSExcel.workbooks.open(SysPath+'\Tem.xls');
Except
ShowMessage('打开临时文件时出错,请检查'+SysPath+'\Tem.xls');
Result:=false;
exit;
end;
MSExcel.visible:=True;
for VL_I :=1 to 4 do
MSExcel.Selection.Borders[VL_I].LineStyle := 0;
MSExcel.cells.select;
MSExcel.Selection.HorizontalAlignment :=3;
MSExcel.Selection.Borders[1].LineStyle := 0; MSExcel.Range['A1'].Select;
MSExcel.Selection.Font.Size :=24; J:=0 ;
for i:=0 to vdataset.fieldcount-1 do
if vDataSet.fields[I].visible then
J:=J+1; VL_I :=J;
MSExcel.Range['A1:'+chr(VL_I+64)+'1'].Select;
MSExcel.Range['A1:'+chr(VL_I+64)+'1'].Merge;
end
else
Result:=false;
end;调用:
procedure TF_pandian.Button3Click(Sender: TObject);
begin
//adoquery2连接你要导出的SqlServer数据库表
ExportToExcel('材料盘点表',adoquery2);
end;
procedure ExportToExcel;
var
SaveDialog: TSaveDialog;
fileName: string; Excel,
WorkBook,
WorkSheet: Variant; r,
c: Integer;
begin
if VisibleColumnCount <= 0 then begin
MessageBox(GetActiveWindow, '导出失败,表格数据为空', '警告提示', MB_ICONWARNING or MB_OK);
Exit;
end; try
Excel := CreateOleObject('Excel.Application');
except
on e: Exception do begin
MessageBox(GetActiveWindow, '导出失败,请先安装电子表格Microsoft Excel', '警告提示', MB_ICONWARNING or MB_OK);
Excel := null;
Exit;
end;
end; SaveDialog := TSaveDialog.Create(Self);
SaveDialog.Filter := 'Excel表格|*.xls'; if SaveDialog.Execute then
fileName := SaveDialog.FileName
else
Exit; try
WorkBook := Excel.Application.WorkBooks.Add;
WorkSheet := WorkBook.WorkSheets[1]; //列
for c := 0 to VisibleColumnCount - 1 do begin
WorkSheet.Cells[1].NumberFormat := '@';
WorkSheet.Cells[1, c + 1].Value := VisibleColumns[c].Caption.Text;
end; //行
for r := 0 to Count - 1 do begin
for c := 0 to VisibleColumnCount - 1 do begin
WorkSheet.Cells[r + 2, c + 1].Value := Nodes[r].Texts[getCOlIndex(c)];
end;
end; try
if WorkBook.SaveAs(fileName) then begin
MessageBox(GetActiveWindow, pchar('成功导出到文件' + fileName), '提示', MB_ICONINFORMATION or MB_OK);
end;
except
on e: Exception do begin
MessageBox(GetActiveWindow, '放弃保存', '提示', MB_ICONWARNING or MB_OK);
exit;
end;
end;
except
on e: Exception do begin
MessageBox(GetActiveWindow, PChar(e.Message), '警告', MB_ICONWARNING or MB_OK);
WorkBook.Saved := True;
WorkBook := null;
Excel.Quit;
Excel := null;
Exit;
end;
end; WorkBook.Saved := True;
WorkBook := null;
Excel.Quit;
Excel := null;
end;
方法1、用OLE的方法,从数据库提取数据然后逐条写入EXCEL文件,效率比较低,但方法灵活
方法2、就是用EXEC master..xp_cmdshell 'bcp saletesttmp.dbo.CusAccount out c:\temp1.xls -c -q -S"pmserver" -U"sa" -P"sa"'
你把这些内容改写后,读取到query中的sql中,然后执行就可以了。