如何控制word,主要是读取,分析(100分)

  • 主题发起人 主题发起人 sunbuger
  • 开始时间 开始时间
S

sunbuger

Unregistered / Unconfirmed
GUEST, unregistred user!
如题。现在想将一份word文档读取出来,word里面基本上是文字和表格。想先从开始进行分析文档,逐行分析,文字的地方直接存入数据库,表格的地方读取表格内容存入数据库,并且存入表格标志位。不是要特别准确的分析,能大体分析出来就行,因为每次word文档的内容是变化的。读出后再进行人工整理。
 
还不如把word文档直接保存到数据库。用的时候取出。方法和图片存取一样
 
可以实现。研究VBA(研究方法:录制宏改成delphi测试),我做的一个自动阅卷系统就用到了这种技术,十分准确而不是大体准确,文本和表格是两个不同的对象,您只要理解了word中的对象概念就行了。
 
newsmile兄,是否能详细说明一下?
或者给个例子。
分还可以追加:)
 
我这有一篇以前写的。 你看看吧。 http://www.delphibbs.com/keylife/iblog_show.asp?xid=7666

控制word, 最好的办法就是不断录制宏, 然后看看它的代码, 你就知道怎么做了。
 
问题问的有点大 给一段代码参考一下 具体应用只能自己改了
我是赞同newsmile的看法的

sTabCount:=WordApplication1.ActiveDocument.Tables.Count;
if sTabCount=0 then
begin
Application.MessageBox('您所打开的文档没有数据,请重新选择!','提示信息',MB_OK);
Exit;
end;
For i:=1 to sTabCount do
begin
WordApplication1.ActiveDocument.Tables.Item(i).Rows.Item(1).Cells.Item(1).Range.Select;
sEname:=Trim(WordApplication1.Selection.Range.Text);
if sTabEname <> '名称' then
Continue;
WordApplication1.ActiveDocument.Tables.Item(i).Rows.Item(1).Cells.Item(2).Range.Select;
sEname:=Uppercase(Trim(WordApplication1.Selection.Range.Text));
if Qry1.Locate('NAME',sEname,[]) then
Qry1.Edit
else
Qry1.Append;
Qry1.FieldByName('NAME').AsString := sEname;
WordApplication1.ActiveDocument.Tables.Item(i).Rows.Item(1).Cells.Item(4).Range.Select;
Qry1.FieldByName('DESC').AsString := Trim(WordApplication1.Selection.Range.Text);
Qry1.Post;
end;
Qry1.Close;
 
建议您去看 http://www.delphibbs.com/delphibbs/dispq.asp?lid=737517 把这帖子理解了就可以随心所欲地控制word了。例子那里面都有。
 
谢谢各位、现在通过vba进行控制总算有了头绪。现在文档主要是通过编号1。2。3。进行分割。但是vba函数里面没有找到读取一个编号里所有内容的方法。比如说我想读取编号1。里面的内容进行分析。使用了对象lists和Paragraphs、但是都不是我想要的内容、不是多就是少。大家谁知道呀?
 
编号这个问题就比较烦了,如果您是生手能绕开就绕开,我给您看一段例程吧
//比对文档中所用的列表模板
// ListParagraphs 属性返回所有具有列表格式的段落
//List属性返回一个 List对象,该对象代表在指定 ListFormat对象中包含的第一个已设置格式的列表。
//listformat代表可用于某一区域中各段落的列表格式属性。
//ListTemplates代表指定的 Style 或 ListFormat 对象的列表格式。
//每个ListTemplate有1个(项目符号或编号)或9个ListLevels(多级符号)
if sfn.Range.ListParagraphs.Count > 0 then
begin
flag := 0;
inc(currow);
myrow := currow;
SGd.Cells[0, currow] := '设置的列表模板';
for I := 1 to sfn.lists.count do
for J := 1 to 9 do
begin
stdrange := sfn.ListTemplates.item(i).ListLevels.item(J);
cmprange := cfn.ListTemplates.item(i).ListLevels.item(J);
if not cmpgallery(stdrange, cmprange, sgd) then //比对项目编号12项
flag := 1;
end;
if flag = 0 then
SGd.Cells[1, myrow] := '√'
else
begin
totalflag := 1;
SGd.Cells[2, myrow] := '╳';
end;
end;
 
谢谢各位、这是我最后的程序.还是不能读取最上层的编号.这个是所有编号都读出来了.先放分吧.
procedure TForm1.ToolButton2Click(Sender: TObject);
var str,wordName:String;
var doc,msword:variant;
t,i:integer;
begin
if OpenDialog1.Execute then
begin
wordName:=OpenDialog1.FileName;
ShowMessage(wordName);
msword:=CreateOleObject('word.application');
doc:=msword.documents.open(filename:=wordName,readonly:=true);
memo.Lines.Clear;
try
begin
t:=1;
for i:=1 to doc.Paragraphs.Count do
begin
memo.lines.add(doc.Paragraphs.item(i).range.ListFormat.ListString);
memo.Lines.add(doc.Paragraphs.item(i).range.text);
end;
end;
finally
msword.quit;
end;
end;
end;
 
谢谢各位、这是我最后的程序.但是还是不能读最上层的编号内容、这个是将所有编号内容都读取出来了.先发分了.
procedure TForm1.ToolButton2Click(Sender: TObject);
var str,wordName:String;
var doc,msword:variant;
t,i:integer;
begin
if OpenDialog1.Execute then
begin
wordName:=OpenDialog1.FileName;
ShowMessage(wordName);
msword:=CreateOleObject('word.application');
doc:=msword.documents.open(filename:=wordName,readonly:=true);
memo.Lines.Clear;
try
begin
t:=1;
for i:=1 to doc.Paragraphs.Count do
begin
memo.lines.add(doc.Paragraphs.item(i).range.ListFormat.ListString);
memo.Lines.add(doc.Paragraphs.item(i).range.text);
end;
end;
finally
msword.quit;
end;
end;
end;
 

Similar threads

后退
顶部