delphi如何实现excel导入到数据库?

delphi如何实现excel导入到数据库?,第1张

元接口部分引用comobj单元(uses)\x0d\x0aprocedureTForm1.Button1Click(Sender:TObject)\x0d\x0a\x0d\x0avarexcelx,excely:string\x0d\x0a\x0d\x0abegin\x0d\x0a\x0d\x0atry\x0d\x0a\x0d\x0aExcelApp:=CreateOleObject('Excel.Application')\x0d\x0a\x0d\x0aWorkBook:=ExcelApp.WorkBooks.Open(opendialog.FileName)//使用opendialog对话框指定\x0d\x0a//excel档路径\x0d\x0a\x0d\x0aExcelApp.Visible:=false\x0d\x0a\x0d\x0aExcelRowCount:=WorkBook.WorkSheets[1].UsedRange.Rows.Count\x0d\x0a\x0d\x0afori:=1toexcelrowcount+1do\x0d\x0a\x0d\x0abegin\x0d\x0a\x0d\x0aexcelx:=excelapp.Cells[i,1].Value\x0d\x0a\x0d\x0aexcely:=excelapp.Cells[i,2].Value\x0d\x0a\x0d\x0aif((excelapp.Cells[i,1].Value='')and(ExcelApp.Cells[i,2].Value=''))then\x0d\x0a//指定excel档的第i行,第1,2(看情况而定)行如果为空就退出,这样的设定,最好是你的档案力这两行//对应数据库中不能为空的数据\x0d\x0a\x0d\x0aexit\x0d\x0a\x0d\x0aelse\x0d\x0a\x0d\x0awithquery1do\x0d\x0a\x0d\x0abegin\x0d\x0a\x0d\x0aclose\x0d\x0asql.clear\x0d\x0asql.add(insertintotest(name,address)values(:name,:address))\x0d\x0aparambyname('name').asstring:=excelx//excel档的第一列插入到test表的name栏位\x0d\x0aparambyname('address').asstring:=excely//excel档的第二列插入到test表的address栏位\x0d\x0aexecsql\x0d\x0a\x0d\x0aend\x0d\x0a\x0d\x0aend\x0d\x0a\x0d\x0afinally\x0d\x0a\x0d\x0aWorkBook.Close\x0d\x0a\x0d\x0aExcelApp.Quit\x0d\x0a\x0d\x0aExcelApp:=Unassigned\x0d\x0a\x0d\x0aWorkBook:=Unassigned\x0d\x0a\x0d\x0aend\x0d\x0a\x0d\x0aend\x0d\x0a\x0d\x0a上面的是导到sql中的。oracle应该也差不多的吧。。

导入:

Excel2000, OleServer,ComObj, ExcelXP添加到上面的uses列表里面,添加对应的EXECEL控件。

ExcelApplication1: TExcelApplication

ExcelWorkbook1: TExcelWorkbook

ExcelWorksheet1: TExcelWorksheet

然后在你 的事件里写下面代码。原来写的数据太多,删除了一些列的导入内容,你自己再调试一下就行了。

var

nu,barcode1,da,na,ena,com,spec:string

ExcelApp,WorkBook: Olevariant

ExcelRowCount,i :Integer

begin

dbgrid2.Enabled:=false

try

if SaveDialog1.Execute then

begin

ExcelApp := CreateOleObject('Excel.Application')

WorkBook := ExcelApp.WorkBooks.Open(savedialog1.FileName)

ExcelApp.Visible := false

ExcelRowCount := WorkBook.WorkSheets[1].UsedRange.Rows.Count

for i := 2 to excelrowcount + 1 do

begin

nu := excelapp.Cells[i,1].Value

if trim(excelapp.cells[i,2].value)='' then

na:=' '

else begin

na:=excelapp.Cells[i,2].Value

end

if trim(excelapp.cells[i,3].value)='' then

ena:=' '

else

ena:= excelapp.Cells[i,3].Value

if trim(excelapp.cells[i,4].value)='' then

com:=' '

else

com:= trim(excelapp.Cells[i,4].Value)

if trim(excelapp.cells[i,5].value)='' then

spec:=' '

else

spec:= excelapp.Cells[i,5].Value

if ((excelapp.Cells[i,1].Value = '') and (ExcelApp.Cells[i,3].Value = '')) then //指定excel档的第 i 行 ,第 1,2(看情况而定)行如果为空就退出,这样的设定,最好是你的档案力这两行//对应数据库中不能为空的数据

exit

else

with data.product do

begin

close

sql.clear

sql.Add('select * from twoven where number='''+nu+'''')

open

if recordcount>=1 then begin

if MessageBox(handle,'此记录已存在,是否覆盖原记录?','提示',MB_IconQuestion+MB_YesNo)=IDYES then

BEGIN

Delete

sql.Clear

sql.add('insert into twoven(number,name,ename,wf_comp,wf_spec)')

sql.add(' values(:number,:name,:ename,:wf_comp,:wf_spec)')

Parameters.ParamByName('number').Value :=trim(nu)//excel档的第一列插入到aa表的 a 栏位

Parameters.ParamByName('name').Value := trim(na)//excel档的第二列插入到aa表的 b 栏位

Parameters.ParamByName('ename').Value := trim(ena)//excel档的第一列插入到aa表的 a 栏位

Parameters.ParamByName('wf_comp').Value := trim(com)//excel档的第一列插入到aa表的 a 栏位

Parameters.ParamByName('wf_spec').Value := trim(spec)//excel档的第二列插入到aa表的 b 栏位

execsql

END

end=

end

showmessage('数据导入成功!')

WorkBook.Close

ExcelApp.Quit

ExcelApp := Unassigned

WorkBook := Unassigned

ExcelWorkBook1.Close(false)

ExcelApplication1.Disconnect

ExcelApplication1.Quit

Screen.Cursor:=crDefault

end

导出:

uses Excel2000, OleServer,ComObj, ExcelXP

var

i,j:Integer

da,na,ena,com,spec:string

begin

i:=1

with data.product do begin

sql.Clear

sql.Add('select * from twoven where printquantity >= 1 order by number')

data.product.Active:=true

end

dbgrid2.Enabled:=false

try

if SaveDialog1.Execute then

begin

ExcelApplication1.Connect

excelapplication1.Workbooks.Add(null,0)

ExcelWorkBook1.ConnectTo(ExcelApplication1.Workbooks[1])

ExcelWorkSheet1.ConnectTo(ExcelWorkBook1.Sheets[1] as _WorkSheet)

ExcelWorkSheet1.Cells.Item[1,1]:='布号'

ExcelWorkSheet1.Cells.Item[1,2]:='品名'

ExcelWorkSheet1.Cells.Item[1,3]:='英文名称'

ExcelWorkSheet1.Cells.Item[1,4]:='成份'

ExcelWorkSheet1.Cells.Item[1,5]:='规格'

data.product.First

while not data.product.Eof do begin

if dbgrid2.DataSource.DataSet.FieldValues['enterdate']=null then

da:=datetimetostr(date())

else

da:=datetimetostr(dbgrid2.DataSource.DataSet.fieldvalues['enterdate'])

if dbgrid2.DataSource.DataSet.FieldValues['ename']=null then

ena:=''

else

ena:=trim(dbgrid2.DataSource.DataSet.fieldvalues['ename'])

if dbgrid2.DataSource.DataSet.FieldValues['name']=null then

na:=''

else

na:=trim(dbgrid2.DataSource.DataSet.fieldvalues['name'])

if dbgrid2.DataSource.DataSet.FieldValues['wf_comp']=null then

com:=''

else

com:=trim(dbgrid2.DataSource.DataSet.fieldvalues['wf_comp'])

if dbgrid2.DataSource.DataSet.FieldValues['wf_spec']=null then

spec:=''

else

spec:=trim(dbgrid2.DataSource.DataSet.fieldvalues['wf_spec'])

i:=i+1

ExcelWorkSheet1.Cells.Item[i,1]:=dbgrid2.DataSource.DataSet.fieldvalues['number']

ExcelWorkSheet1.Cells.Item[i,2]:=na

ExcelWorkSheet1.Cells.Item[i,3]:=ena

ExcelWorkSheet1.Cells.Item[i,4]:=com

ExcelWorkSheet1.Cells.Item[i,5]:=spec

data.product.next

end

showmessage('数据导出成功!')

ExcelWorkBook1.SaveCopyAs(SaveDialog1.FileName)

ExcelWorkBook1.Close(false)

ExcelApplication1.Disconnect

ExcelApplication1.Quit

Screen.Cursor:=crDefault

可以将excel中的一个页签视为一个表,excel文件视为一个数据库,使用ADO连接这个数据库,连接串中加入Extended

Properties=Excel

8.0,假如excel中的页签名是“测试”,在delphi中用sql *** 作时,类似语句如下:select

*

from

[测试$],虽然可以支持中文,不过不建议使用中文的页签名称。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10644700.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存