excel数据导入数据库后数据格式错误或丢失

水向东流时光怎么偷 2011-04-11 11:02:50
由于我excel数据格式是常规,导入数据库后有乱码或丢失数据,想问一下大家是怎么处理此类问题的,能不能在不改变excel格式前提下,来处理此类问题?



原贴http://topic.csdn.net/u/20110409/17/5da85312-084c-4827-837a-acc69b546563.html

导入代码
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, ADODB, Grids, DBGrids;

type
TForm2 = class(TForm)
dbgrd1: TDBGrid;
con1: TADOConnection;
qry1: TADOQuery;
qry2: TADOQuery;
ds1: TDataSource;
btn1: TButton;
dlgOpen1: TOpenDialog;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.btn1Click(Sender: TObject);
var s:string;
ADOConn:TADOConnection;
aDataSet:TADODataSet;
begin
if dlgOpen1.Execute then
begin
ADOConn:=TADOConnection.Create(self);
ADOConn.LoginPrompt:=false;
ADOConn.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='
+dlgOpen1.FileName
+';Extended Properties=Excel 8.0;Persist Security Info=False';
aDataSet:=TADODataSet.Create(self);
aDataSet.Connection:=ADOConn;
ADOConn.OpenSchema(siTables,EmptyParam,EmptyParam,aDataSet);
aDataSet.Last;
s:=aDataSet.Fields.Fields[2].AsString;//获取第一工作表表名
aDataSet.Close;
aDataSet.Free;
ADOConn.Close;
ADOConn.Free;

qry1.Connection:=con1;
qry1.SQL.Clear;
qry1.SQL.Append('insert stock select * from OPENROWSET(');//将这个‘qqq’字改为你的数据库中的表名
qry1.SQL.Append(quotedstr('MICROSOFT.JET.OLEDB.4.0'));
qry1.SQL.Append(','+quotedstr('Excel 5.0;HDR=YES;Excel 8.0;DATABASE='+dlgOpen1.FileName)+',['+s+'])');
qry1.ExecSQL;
qry2.Active:=True;
showmessage('ok');
end;
end;
end.


sql字段数据类型
create table stock
(
st_id varchar(10),
st_dcdate datetime,
st_gc varchar(10),
st_kcd int,
st_zt varchar(10),
st_lx varchar(10),
st_sx varchar(14),
st_gys varchar(20),
st_sku varchar(12),
st_spmc varchar(80),
st_pch varchar(16),
st_tkdate datetime,
st_kw varchar(10),
st_qty float,
st_bzs float,
st_tj float,
st_zl float,
st_tps float,
st_mj float,
st_kcts float,
st_bz varchar(80)
)
...全文
589 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
浩南_哥 2011-04-11
  • 打赏
  • 举报
回复
你大概说下,你说的数据乱码,是哪些乱码了
丢失 是一条数据里面的某个字段的值丢失了 还是丢失整条数据
举个例子看看
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 m617105 的回复:]
你可以试试 在导入之前先将你需要导入的Excel复制一份到另外一个Excel内,在这个Excel里面把数据设置成你需要的格式,例如设置成日期类型,然后从这个Excel里导入数据库。

至于你说的数据丢失的问题,你可以在导入完成后检测下哪些没有导入,然后用你之前的那种方式从导入一次

PS:上面的都实验过,
[/Quote]



上面都写了大哥""能不能在不改变excel格式前提下,来处理此类问题?""
浩南_哥 2011-04-11
  • 打赏
  • 举报
回复
你可以试试 在导入之前先将你需要导入的Excel复制一份到另外一个Excel内,在这个Excel里面把数据设置成你需要的格式,例如设置成日期类型,然后从这个Excel里导入数据库。

至于你说的数据丢失的问题,你可以在导入完成后检测下哪些没有导入,然后用你之前的那种方式从导入一次

PS:上面的都实验过,
  • 打赏
  • 举报
回复
能不能在delphi导入数据代码下实现excel格式转换?
广州佬 2011-04-11
  • 打赏
  • 举报
回复
if OpenDialog1.Execute then
begin
try
v:= CreateOleObject('Excel.Application');
v.Workbooks.Open(OpenDialog1.FileName);
Sheet:=v.Workbooks[1].WorkSheets[1];
Sheet.Select;
v.Visible:=false;
Sheet.Columns[4].NumberFormatLocal:='@';//假定你的数据4列需要转换改为文本属性
Sheet.Columns[5].NumberFormatLocal:='@';//假定你的数据5列需要转换改为文本属性
Sheet.Columns[6].NumberFormatLocal:='@';//假定你的数据6列需要转换改为文本属性

//跟着放你原来数据导出代码:
//.........


finally
Showmessage('初始化Excel失败,可能没装Excel,或者其他错误;请重起再试。');
v.DisplayAlerts:=false;
v.Quit;
exit;
end;
Application.Restore;
Application.BringToFront;
end;
这样导出数据就ok了,且因退出excel前没保留改变,你原来的文件就跟没被改过一样啦。
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tjianliang 的回复:]
数据前面加上一个单引号',都强制显示为文本
[/Quote]

大大,怎么加,请明示,谢谢!
亮剑_ 2011-04-11
  • 打赏
  • 举报
回复
数据前面加上一个单引号',都强制显示为文本
浩南_哥 2011-04-11
  • 打赏
  • 举报
回复
如果还是不行的话 我建议lz到MS-SQL Server板块去问问吧 这个属于数据库的事情了
  • 打赏
  • 举报
回复
例如:st_pch字段 101203801 导进去就变成了1.01204e+008,SA610403C导进去就变成了空值
st_tj字段 0.000001 导进去就变成1E-06

这只是其中一部分!

2,499

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧