论坛:“基地”;
当前存档:2002.04.01;
下载:[xml.tar.bz2];
向下
先生们,帮助您从Excel中读取数据 找到类似的分支
← →
Санька (2002-03-05 13:28) [0]问题如下:
客户提供Excel文件,然后将所有数据传输到本地
DB进行进一步处理。 遗憾的是,这个文件在单元格中编写得不是很好(而不是自动传输)
一堆间隙m / s带有单词并按下输入....当将列复制到表格时,所有这些额外字符看起来都很难看,而且不是很正确。 如果它有帮助,这是代码。 也许有人会说。
程序TForm1.BitBtn1Click(发件人:TObject);
var i,k:integer;
n:字符串;
AppExcel,价值:变体;
开始
i:= 6; //来自Excel的第六行
AppExcel:= CreateOleObject(“Excel.Application”);
AppExcel.Workbooks.Open(“c:\ 111.xls”,False);
AppExcel.Visible:= True;
而我<= 34做
开始
n:= AppExcel.Cells.item [i,4] .Value;
taSS.edit;
taSS.insert;
taSs.fieldbyname(“Name”)。AsString:= n;
taSS.post;
taSS.Next;
i:= i + 1;
结束;
结束;
或者也许告诉我如何最好地组织所有这些......
如果可能的话,不要发送到网站D-Excel已经......
好吧,zadolbal,可能。 在此先感谢!!!
← →
MetallAdm (2002-03-05 16:38) [1]是否可以删除额外的空格等?
n:= AppExcel.Cells.item [i,4] .AsString; --- Sdes,也就是字符串do如果它是一个字符串
taSS.edit;
taSS.insert;
DelSpaces(N); ---就像这样:))
taSs.fieldbyname(“Name”)。AsString:= n;
过程DelSpaces(Var xx:String);
瓦尔
lt,i:整数;
ll,l:整数;
s:字符串;
b,a:字节;
开始
s:= xx;
ll:= 1;
Lt:=长度(S);
l:= 0;
a:= 0;
for i:= 1 to lt
开始
if String(s [i])=“”那么inc(l);
如果String(s [i])=“*”那么a:= 1;
结束;
如果l = lt那么
开始
s:=“*”;
a:= 1;
ll:= 1;
结束;
如果a = 0那么
开始
b:= 0;
对于i:= lt downto 2 do
开始
if String(s [i])<>“”然后
如果b = 0那么
开始
ll:= i;
b:= 1;
结束;
结束;
如果ll> 2则Setlength(s,ll)else s:=“*”;
结束;
xx:= s;
结束;
是的,即使是随行程序
当我写得好的时候,我也不知道它是多么正确
很久以前它是
是的,我没有打扰她。为了清晰起见,她用星号标记空白行:)
我想你会干净:)
← →
Санька (2002-03-05 17:29) [2]非常感谢,我会试试。 如果那再次呼吁你
(关于明星:))。
至于任务,原则上没有人出现
想法。 Mbyb有人遇到问题......
顺便说一下,在我的情况下,通过这个程序,计算机“思考”很长一段时间(只要它通过所有单元格,同时将其插入表格中的行)
了解您的意见,专家将是非常有趣的。
← →
MetallAdm (2002-03-05 17:47) [3]顺便说一句,该过程删除了该过程
只有从最后还有额外的空间
但我认为做这样的事并不难
在字符串中查找单个单词
然后他们连续穿过一条线上的间隙mona推
← →
Санька (2002-03-06 09:05) [4]Das ....
我认为我不会很快成功:就像帕斯卡一样
干净(在字符串处理方面)没有多少面子。 我更喜欢数据库。 那么lana - 试试.. Sanks。
其他的想法没有chtoli ....唉!
← →
gek (2002-03-06 09:40) [5]我想如果客户将以csv格式提供文件,那么
它会更容易消除差距等。
← →
MetallAdm (2002-03-06 09:51) [6]像我曾经在Turbo piskale上做过的事情:))
我加载一个文本文件,荣耀推入一个数组
也就是说,从数组中选择单个单词
好吧,如果不清楚,我会问自己
过程LoadFile(Var txt:POuts; Fl:String);
瓦尔
我,j,k:Word;
s:Word;
buff:字节的数组[1..lhtWord];
b阅读,bWrite:Word;
Sk,NumL:Word;
Strs:String;
开始
分配(Fls,Fl);
重置(Fls,1);
大小:= FileSize(Fls);
如果Size <65000则
开始
BlockRead(Fls,lBuff ^,Size,bRead);
i:= 1;
虽然(i <=大小)和(lBuff ^ [i] =“”)或(lBuff ^ [i] =#13)或(lBuff ^ [i] =#10)做
开始
Inc(i);
结束;
AddW:= 1;
k:= 0;
对于s:= i to Size do
开始
j:= 0;
如果(lbuff ^ [s] <>“”)和(lBuff ^ [s] <> #13)和(lBuff ^ [s] <>#10)和(lBuff ^ [s] <>“。”)和(lBuff ^ [s] <>“,”)然后
开始
{写(lbuff ^ [s]);}
Inc(k);
Strs [k]:= lbuff ^ [s];
Strs [0]:= Chr(k);
txt ^ [addW]:= Strs;
结束
其他
开始
j:= s;
k:= 0;
如果(lBuff ^ [j] =“。”)或(lBuff ^ [j] =“,”)那么
开始
{Strs [k]:= lbuff ^ [s];
Strs [0]:= Chr(k);}
如果(lBuff ^ [j + 1] <>“”)或(lBuff ^ [j + 1] <> #13)或(lBuff ^ [j + 1] <> #10)那么
开始
Inc(AddW);
s:= j;
结束;
结束
其他
开始
虽然(lBuff ^ [j] =“”)或(lBuff ^ [j] =#13)或(lBuff ^ [j] =#10)
开始
Inc(j);
{If(lBuff ^ [j] =#13)或(lBuff ^ [j] =#10)然后写(“|”)else写(“+”);}
结束;
Inc(AddW);
s:= j-1;
结束;
结束;
结束;
结束;
结束;
嘿龙程序:))
← →
Shirson (2002-03-06 12:50) [7]嗯......
XL有两个这样的功能:
1。 清除(文本)从文本中删除所有不可打印的字符(换行符适用于它们)。
2。 修剪(文本)删除单词之间的所有空格(单个除外)。
通过制作总计=修剪(清洁(A1))
可以避免长程序:)
← →
Санька (2002-03-06 14:10) [8]>希尔森
请直接在Excel中指定这些功能,还是应该从Delphi调用它们?
← →
Shirson (2002-03-06 14:35) [9]>桑卡
可以直接在XL。 有可能并且从德尔福 - 使用公式将任何细胞带入XL=修剪(清洁(A1))
,只用而不是A1,替换所有需要处理的单元格,并用Delphi读取数据并扔进数据库...呃......只是不完全清楚为什么你需要从Delphi中取一步:)你可以直接从XL把数据扔进数据库:) ))
← →
Санька (2002-03-06 14:45) [10]>希尔森
我会试试,谢谢......
至于直接转移到数据库:使用eksel的方式来做这件事 - 我的用户不会触摸它......然后,如果重复数据,那么我很难跟踪它。 所以 - 我复制到一个中间数据库,然后我使用SQL工具做它并选择我想要的主要...实际上,该项目非常愚蠢:)主程序已经工作了很长时间,一切都经过精心调整,但我开始厌倦了无聊并为用户发明了新的简化。
好吧,好吧,我会继续受苦。 谢谢大家!!! 有帮助!
很快可能会再次上诉。 ;)
← →
Санька (2002-03-06 15:13) [11]>希尔森
顺便说一下,我试过这个:
n:= AppExcel.Cells.item [i,4] .Value;
修剪(n); - 它工作,删除空格
干净(n); - 这个f-I Delphi不为人知
也许有些东西会取代这个功能。 在帮助工作的线路翻找 - 没有:(。???????
← →
TIP (2002-03-06 15:31) [12]Delphi有一个优秀的Qstrings库。
并在汇编程序中使用字符串。
← →
Shirson (2002-03-06 15:35) [13]通常,在Delphi中(至少在D6中),trim函数会删除行开头,行末尾的空格以及行本身的所有控制字符。 (如帮助翻找?:))
尝试仅修剪字符串 - 会发生什么?
← →
Shirson (2002-03-06 15:40) [14]>桑卡
“关于直接转移到数据库:使用eksel的方式来做nadati - 我的用户不会触摸......然后,如果重复数据,那么我将很难跟踪它。”
主人是主人:)我不会在一个花园,但在XL做了一切。 并且juzverej需要按下一个pimpu,而不考虑系统的机制。 并在那里检查你想要你做什么,并调整用户界面,等等。但如果你想delphi,这意味着你需要:)
← →
Санька (2002-03-06 16:21) [15]:)))))))是的,我想很久以前我离开了茶壶...... :)
使用字符串,说话和修剪是一个汇编芯片,%)
短于%%((。
嗯,“有,带有字符串的duc字符串...但除了对接,搜索字符等等,我找不到任何东西,但是关于删除空格和”输入“和”标签“以及它们 - 只看到修剪。
如果你告诉不幸的程序员 - 谢谢。
如果没有,去学习英语并购买D为dummers :))
而且,再次感谢大家,我去醉了!
← →
dmitryK (2002-03-06 18:13) [16]
>至于任务,原则上没有人出现
>想法。 Mbyb有人遇到问题......
>顺便说一句,在我的情况下,通过这个程序,计算机“思考”
>很长一段时间(直到所有的细胞通过,而在线
>插入tabla)
>了解您的意见,专家将是非常有趣的。
难怪这么久以来。 代码制动。
简而言之,您如何优化。 这是源代码:
> procedure TForm1.BitBtn1Click(Sender:TObject);
> var i,k:integer;
> n:string;
> AppExcel,价值:变体;
>开始
> i:= 6; //来自Excel的第六行
> AppExcel:= CreateOleObject(“Excel.Application”);
> AppExcel.Workbooks.Open(“c:\ 111.xls”,False);
> AppExcel.Visible:= True;
>而我<= 34
>开始
> n:= AppExcel.Cells.item [i,4] .Value;
> taSS.edit;
> taSS.insert;
> taSs.fieldbyname(“Name”)。AsString:= n;
>
> taSS.post;
> taSS.Next;
> i:= i + 1;
>结束;
>结束;
AppExcel.Visible:= True; - 为什么? 什么会慢慢运作?
这段代码表明需要可视化使用XL的过程,这自然会减慢工作速度。
n:= AppExcel.Cells.item [i,4] .Value; - 来自教科书的代码,绝对正确,但绝对制动。 我不确切知道它是如何工作的(在操作系统级别),但是随着时间的推移,你将从书页中卸载多少数据 - 一个单元格或1000完全没有区别。 为此,您必须创建所需大小的动态数组并在其中加载Range。
然后才分析这个数组,这个数组本身要快得多。
但是这段代码片段对我来说并不十分清楚。
> taSS.edit;
> taSS.insert;
> taSs.fieldbyname(“Name”)。AsString:= n;
>
> taSS.post;
> taSS.Next;
试图替换现有的字符串? 虽然它似乎是关于添加新的? 但无论如何,整体形成SQL查询并执行它们通常会更快。 因为根据代码,一次只能在少于一个30行中,您可以一次性发送整批更改(30 SQL修改/添加请求),这也将加快任务执行时间。
最后
i:= i + 1; - 最好用Inc(i)替换这样的片段;
关于在XL中优化数据访问速度的提示,我强烈建议您查看“德尔福王国”网站,并找到文章“通过推动的浪潮”。 我在这里简要提到的所有内容都在那里详细描述。 读它。
至于删除多余的空间,这个问题值得一试。 我不知道在D6中如何,但早期的TRIM只削减了前导和尾随空格。 如果现在他仍然是一个加号,这将删除中间控制字符,那么一切都很简单,好吧,如果没有,那么你必须花半个小时自己删除它们。
← →
dmitryK (2002-03-06 18:16) [17]
>提示(06.03.02 15:31)
> Delphi还有一个优秀的Qstrings库
>并在汇编程序中使用字符串。
顺便说一句,非常有用的建议,我强烈建议使用它。
← →
MetallAdm (2002-03-06 18:57) [18]嘿,是的,你已经提出了优化的问题:)
> Shirson顺便不知道不知道:)
我仍然无法打破dos的习惯
当任何程序必须从头开始:))
Страницы: 1 整个分支
论坛:“基地”;
当前存档:2002.04.01;
下载:[xml.tar.bz2];
内存:0.65 MB
时间:0.037 c