Delphi 将Word文档中表格中的单元格中的格式化文本复制到TRichEdit

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和一

我使用OLE自动化处理Word文档。 我可以使用

Table.Cell(行索引,共索引).Range.FormattedText

它返回一个变量。
我不确定是否使用了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。这可以防止在其他位置打开文档时出现问题