Delphi 将Word文档中表格中的单元格中的格式化文本复制到TRichEdit
我使用OLE自动化处理Word文档。 我可以使用 Table.Cell(行索引,共索引).Range.FormattedText 它返回一个变量。Delphi 将Word文档中表格中的单元格中的格式化文本复制到TRichEdit,delphi,ms-word,cell,ole,trichedit,Delphi,Ms Word,Cell,Ole,Trichedit,我使用OLE自动化处理Word文档。 我可以使用 Table.Cell(行索引,共索引).Range.FormattedText 它返回一个变量。 我不确定是否使用了right属性,也不知道如何在不丢失格式的情况下将此文本粘贴到TRichEdit中(例如,上标文本)我放弃了使用OLE自动化解决此问题。 TRichView提供了所需的功能,但它不是免费的…我放弃了用OLE自动化解决这个问题。 TRichView提供了所需的功能,但它不是免费的…我建立了一个模型表单,上面只有一个richedit和一
我不确定是否使用了right属性,也不知道如何在不丢失格式的情况下将此文本粘贴到TRichEdit中(例如,上标文本)我放弃了使用OLE自动化解决此问题。
TRichView提供了所需的功能,但它不是免费的…我放弃了用OLE自动化解决这个问题。
TRichView提供了所需的功能,但它不是免费的…我建立了一个模型表单,上面只有一个richedit和一个按钮。下面的代码可能不是实现这一点的最佳方法,但它可以在WinXP上与Word 2007配合使用
uses Word_TLB;
procedure TForm1.Button1Click(Sender: TObject);
var
wordApp : _Application;
doc : WordDocument;
table : Word_TLB.Table;
filename : OleVariant;
aRange : Range;
aWdUnits : OleVariant;
count : OleVariant;
begin
//need to back up 2 characters from range object to exclude table border.
//Remove 1 character only if using selection
count := -2;
aWdUnits := wdCharacter;
filename := '"H:\Documents and Settings\HH\My Documents\testing.docx"';
RichEdit1.Clear;
try
wordApp := CoWordApplication.Create;
wordApp.visible := False;
doc := wordApp.documents.open( filename, emptyparam,emptyparam,emptyparam,
emptyparam,emptyparam,emptyparam,emptyparam,
emptyparam,emptyparam,emptyparam,emptyparam,
emptyparam,emptyparam,emptyparam,emptyparam );
table := doc.tables.item(1);
aRange := table.cell(3,1).Range;
aRange.MoveEnd(aWdUnits, count); //This is needed so border is not included
aRange.Copy;
RichEdit1.PasteFromClipboard;
RichEdit1.Lines.Add('');
finally
wordApp.quit(EmptyParam, EmptyParam, EmptyParam);
end;
end;
这就是结果:
.
唯一的问题是,多行文本在richedit中显示为一行。我建立了一个模型表单,上面只有一个richedit和一个按钮。下面的代码可能不是实现这一点的最佳方法,但它可以在WinXP上与Word 2007配合使用
uses Word_TLB;
procedure TForm1.Button1Click(Sender: TObject);
var
wordApp : _Application;
doc : WordDocument;
table : Word_TLB.Table;
filename : OleVariant;
aRange : Range;
aWdUnits : OleVariant;
count : OleVariant;
begin
//need to back up 2 characters from range object to exclude table border.
//Remove 1 character only if using selection
count := -2;
aWdUnits := wdCharacter;
filename := '"H:\Documents and Settings\HH\My Documents\testing.docx"';
RichEdit1.Clear;
try
wordApp := CoWordApplication.Create;
wordApp.visible := False;
doc := wordApp.documents.open( filename, emptyparam,emptyparam,emptyparam,
emptyparam,emptyparam,emptyparam,emptyparam,
emptyparam,emptyparam,emptyparam,emptyparam,
emptyparam,emptyparam,emptyparam,emptyparam );
table := doc.tables.item(1);
aRange := table.cell(3,1).Range;
aRange.MoveEnd(aWdUnits, count); //This is needed so border is not included
aRange.Copy;
RichEdit1.PasteFromClipboard;
RichEdit1.Lines.Add('');
finally
wordApp.quit(EmptyParam, EmptyParam, EmptyParam);
end;
end;
这就是结果:
.
唯一的问题是多行文本在richedit中显示为一行。MS word正在使用RTF,RTF功能正在随时间变化。Delphi TRichedit对RTF的支持有限,我认为它不支持word的表格。我不知道您需要哪种格式功能,但请记住,TRichedit可能无法提供您需要的结果(即,高级格式可能丢失或提供奇怪的结果)。另一种方法是使用TRichedit替换组件。Ooops…更正,上面应该是…我认为它对word表格的支持有限。顺便说一句,我假设richedit是4.1版。实际上,我不需要它来支持word的表格。我需要分别读取每个单元格,然后将其内容存储或保存为富文本,而不会丢失文本格式。单元格中没有高级格式,只有下标、上标、粗体、斜体等等。效率不起作用。MS word正在使用RTF,RTF功能正在随时间变化。Delphi TRichedit对RTF的支持有限,我认为它不支持word的表格。我不知道您需要哪种格式功能,但请记住,TRichedit可能无法提供您需要的结果(即,高级格式可能丢失或提供奇怪的结果)。另一种方法是使用TRichedit替换组件。Ooops…更正,上面应该是…我认为它对word表格的支持有限。顺便说一句,我假设richedit是4.1版。实际上,我不需要它来支持word的表格。我需要分别读取每个单元格,然后将其内容存储或保存为富文本,而不会丢失文本格式。单元格中没有高级格式,只有下标、上标、粗体、斜体等等。效率不起作用。正如你在自己的屏幕截图中所看到的,你确实在最后剪掉了一个角色。因此,您必须将计数设置为-1而不是-2。另外,对于Windows 7上的Word 2010,我必须在代码中更改以下内容:1)将
aRange
的类型从Range
更改为WordRange
,2)在aRange.MoveEnd
和aRange.Copy
code:wordApp.Selection.Range.SetRange(aRange.Start,aRange.End)之间插入以下行
3)或者,我已经将wordApp.documents.open
的第三个参数定义为OleVariant
变量readonly
,并将其设置为true。这可以防止在其他情况下打开文档时出现问题,而您可以在自己的屏幕截图中看到,您确实在最后切掉了一个字符。因此,您必须将计数设置为-1而不是-2。另外,对于Windows 7上的Word 2010,我必须在代码中更改以下内容:1)将aRange
的类型从Range
更改为WordRange
,2)在aRange.MoveEnd
和aRange.Copy
code:wordApp.Selection.Range.SetRange(aRange.Start,aRange.End)之间插入以下行
3)或者,我已经将wordApp.documents.open
的第三个参数定义为OleVariant
变量readonly
,并将其设置为true。这可以防止在其他位置打开文档时出现问题