一个两层CS程序 数据库在远程服务器上 如果导入本地的Excel?
SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 8.0')...[A$]
这样访问时 Excel文件在数据库服务器上的相应位置时正常 在本地时不能运行 如何解决?
SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 8.0')...[A$]
这样访问时 Excel文件在数据库服务器上的相应位置时正常 在本地时不能运行 如何解决?
控件来控制EXEL ,你的最新的问题,可以这样解决
1,做个模板文件,在里边设置好每个格字的属性(点鼠标右健)"format ceels"
然后选NUMBER 页 ,Category中选择 TEXT,2,把数据输入到这个文件,然后另存一个文件.
(公司里用英文OFFICE,你要根据我写的自己找找)
var
oe:variant;
n1:string;
i,j:integer;
begin
oe:=CreateOleObject('Excel.Application');
oe.visible:=true;
oe.workbooks.open(FileListBox1.FileName);
j:=2; //假定标题在第一行
try
with adoQuery1 do
begin
n1:='insert into tablename(fieldslist) values(:fieldslist)';
close;
sql.Clear;
sql.Add(n);
while oe.worksheets[sheetname].cells[j,1].text<>'' do
begin
for i:=1 to 列数 do
Parameters.Items[i-1].Value:=oe.worksheets[sheetname].cells[j,i].text;
execsql;
j:=j+1;
end;oe.visible:=false;
showmessage('导入完毕');
end;
except
oe.visible:=false;
showmessage('数据库错误或有重复编号,请检查');
end;
end;
// ds TADODataSet
ExcelID.workbooks.open(opendialog1.FileName);
ExcelID.visible:=False;
Memo1.Lines.Add('该Excel文件共有:'+inttostr(ExcelID.WorkSheets.count)+'个工作表');
for i:=1 to ExcelID.WorkSheets.count do
begin
//打开所有工作表一个个导入
Application.ProcessMessages;
Alist.Add(ExcelID.WorkSheets[i].Name);//工作表
Blist.Add('##tempexl'+inttostr(i));//临时表
Memo1.Lines.Add('开始导入:'+Alist.Strings[i-1]);
icol:=10;
irow:=ExcelID.WorkSheets[i].UsedRange.Rows.count;
//sql:='gettmptab '''+blist.Strings[i-1]+'''';
sql:='if object_id(''tempdb..'+blist.Strings[i-1]+''') is null '+#13+'begin '+#13;
sql:=sql +'CREATE TABLE ['+blist.Strings[i-1]+'] ('+#13;
sql:=sql +'[ID] [bigint] IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL ,'+#13;
sql:=sql +'[A] [nvarchar] (250) COLLATE Chinese_PRC_CI_AI NULL ,'+#13;
sql:=sql +'[B] [nvarchar] (250) COLLATE Chinese_PRC_CI_AI NULL ,'+#13;
sql:=sql +'[C] [nvarchar] (250) COLLATE Chinese_PRC_CI_AI NULL ,'+#13;
sql:=sql +'[D] [nvarchar] (250) COLLATE Chinese_PRC_CI_AI NULL ,'+#13;
sql:=sql +'[E] [float] NULL ,'+#13;
sql:=sql +'[F] [float] NULL , '+#13;
sql:=sql +'[G] [float] NULL , '+#13;
sql:=sql +'[H] [nvarchar] (250) COLLATE Chinese_PRC_CI_AI NULL ,'+#13;
sql:=sql +'[I] [nvarchar] (250) COLLATE Chinese_PRC_CI_AI NULL ,'+#13;
sql:=sql +'[J] [nvarchar] (250) COLLATE Chinese_PRC_CI_AI NULL '+#13;
sql:=sql +' ) ON [PRIMARY]'+#13;
sql:=sql +'end '+#13;
sql:=sql +'else '+#13;
sql:=sql +'drop table '+blist.Strings[i-1];
dm.conn.Execute(sql);
sql:='select * from '+blist.Strings[i-1];
dm.ds.CommandText :=sql;
dm.ds.Open;
//文件行循环
for j:=1 to irow do
begin
Application.ProcessMessages;
if (ExcelID.WorkSheets[i].cells[j,1].text<>'') or (ExcelID.WorkSheets[i].cells[j,2].text<>'') then
begin
Application.ProcessMessages;
dm.ds.Append;
dm.ds.fieldbyname('A').AsString :=ExcelID.WorkSheets[i].cells[j,1].text;
dm.ds.fieldbyname('B').AsString :=ExcelID.WorkSheets[i].cells[j,2].text;
..
dm.ds.post;
end;
end;
dm.ds.Close;
Memo1.Lines.Add('成功导入:'+Alist.Strings[i-1]);
end;
Memo1.Lines.Add('Excel文件成功导入');
procedure TForm1.Button1Click(Sender: TObject);
var
sqlstr,connstr,sheetName,filename:string;
begin
FileName :='d:\d.xls' ;//Excel文件名
SheetName :='sheet1' ; //Excel表名
ADOQuery1.Close ;
ADOQuery1.SQL.Clear ;
ConnStr :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + FileName + ';Extended Properties=Excel 8.0;Persist Security Info=False';
ADOQuery1.ConnectionString :=ConnStr ;
SqlStr :='Select * from ' +'[' +SheetName + '$'+']'; //打開表
ADOQuery1.SQL.Add(SqlStr) ;
ADOQuery1.Prepared ;
ADOQuery1.Open ;
end;
就是这样用不了 我才直接打开Excel操作的
Excel文件在一台电脑上 不过用sql语句打开Excel 他会把很多文本字段也当数值来就变NULL了,文本就丢了 因一列文本不多,数值数据较多 他就只让数值了
QWERT520(别来无恙)的方法是可行的至于你说的文本NULL值,我倒还不知道怎么回事,如果是当文本为空的时候显示为NULL,楼主可以通过ISNULL函数来处理,比如:SELECT [name],age,isnull([no],'') [no]
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="e:\Book1.xls";User ID=Admin;Password=;Extended properties=Excel 8.0')...[Sheet1$]这样,当no列有空的数据的时候,就成''空字符了
为什么不行是这样的 比如这样的两列值
名称 型号
PVC塑料管 160
PVC塑料管 110
PVC塑料管 75
PVC塑料管 50
小弯 160
小弯 110
小弯 75
小弯 50
P弯 50
S弯 50
门弯 160
门弯 110
门弯 50
门弯(90度) 50
弯径 160*110 //丢失
束节 110*75 //丢失
束节 110*50
束节 160
束节 110
束节 75
三通 75
三通 50
三通 110*50
三通 110*50
用sql查询 第二列中不为数值的全变NULL 全为数值的才可以显示 你们可以试试
这样就造 成型号列数据丢失
我的要求是用sql能否支持将Excel全部作为文本型读出来
unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, StdCtrls, ADODB, DBTables, OleServer,
Buttons;type
TForm1 = class(TForm)
Button1: TButton;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DBGrid1: TDBGrid;
Table1: TTable;
Database1: TDatabase;
DataSource1: TDataSource;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
Table1.Active:=false ;
Table1.DatabaseName:='WYCG'; //庫名
Table1.TableType:=ttparadox; //表類型
Table1.TableName:='YourTableName'; //表名稱
if Table1.Exists then //表存在否
begin
ADOquery1.sql.clear;
ADOquery1.SQL.add('drop Table YourTableName') ; //存在則刪掉
ADOquery1.ExecSQL;
end;
adoConnection1.Execute('SELECT * INTO YourTableName FROM OPENROWSET(''MSDASQL.1'', ''driver=Microsoft Excel Driver (*.xls);DBQ=d:\d.xls'',''select * from [sheet1$]'')'); //導入EXCEL表
// adoConnection1.Execute('SELECT * INTO YourTableName FROM OPENROWSET('+Quotedstr(MSDASQL.1)+', '+Quotedstr(driver=Microsoft Excel Driver (*.xls);DBQ=d:\d.xls)+','+Quotedstr(select * from [sheet1$])+')'); //導入EXCEL表
ADOquery1.close;
ADOquery1.sql.clear;
ADOquery1.sql.add('select * from YourTableName'); //顯示
ADOquery1.Prepared;
ADOquery1.open;
end;end.