2

このコード サンプル:

object miss = System.Reflection.Missing.Value;
object Visible = true;
Microsoft.Office.Interop.Word.Application WordApp = new Microsoft.Office.Interop.Word.Application();
Document report = WordApp.Documents.Add(ref miss, ref miss, ref miss, ref miss);

Paragraph para = report.Content.Paragraphs.Add(ref miss);
String prefix = "Prefix";
String suffix = "text after the colon";
String allText = prefix + ":" + suffix;
para.Range.Text = allText;
para.Range.Font.Bold = 0;
para.Range.Font.Size = 12;

Object start = para.Range.Start;
Object end = para.Range.Start + allText.IndexOf(":");

Range bold = report.Range(ref start, ref end);
bold.Bold = 1;

para.Range.InsertParagraphAfter();

object filename = "test.doc";
report.SaveAs(ref filename, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss);
object saveChanges = Microsoft.Office.Interop.Word.WdSaveOptions.wdPromptToSaveChanges;
object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdWordDocument;
object routeDocument = true;
((_Document)report).Close(saveChanges, originalFormat, routeDocument);

次のテキストを含む Word ドキュメントが正常に作成されます。

プレフィックス: コロンの後のテキスト

ただし、このコード:

object miss = System.Reflection.Missing.Value;
object Visible = true;
Microsoft.Office.Interop.Word.Application WordApp = new Microsoft.Office.Interop.Word.Application();
Document report = WordApp.Documents.Add(ref miss, ref miss, ref miss, ref miss);

Paragraph para = report.Content.Paragraphs.Add(ref miss);
String prefix = "Prefix";
String suffix = "text after the colon\n"; // <-- Note the additional newline in the string
String allText = prefix + ":" + suffix;
para.Range.Text = allText;
para.Range.Font.Bold = 0;
para.Range.Font.Size = 12;

Object start = para.Range.Start;
Object end = para.Range.Start + allText.IndexOf(":");

Range bold = report.Range(ref start, ref end);
bold.Bold = 1;

para.Range.InsertParagraphAfter();

object filename = "test.doc";
report.SaveAs(ref filename, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss);
object saveChanges = Microsoft.Office.Interop.Word.WdSaveOptions.wdPromptToSaveChanges;
object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdWordDocument;
object routeDocument = true;
((_Document)report).Close(saveChanges, originalFormat, routeDocument);

COMException: Value out of range次の行で例外をスローします。

Range bold = report.Range(ref start, ref end);

これら 2 つのコード スニペットの唯一の違いは、この行の改行文字です。

String suffix = "text after the colon\n"; // <-- Note the additional newline in the string

スタックトレース

参考になるかわかりませんが、これはエラーの完全なスタック トレースです。

at Microsoft.Office.Interop.Word.DocumentClass.Range(Object& Start, Object& End)
at Sandbox.Program.Main(String[] args) in C:\Users\ricardo\Documents\Visual Studio 2010\Projects\Sandbox\Sandbox\Program.cs:line 48
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

デバッグ結果

繰り返しますが、役に立たないかもしれませんが、各コード サンプルをデバッグすると、これらの結果が得られます。最初の結果では、例外が発生する行の直前の変数の値は次のとおりです。

para.Range.Text == "Prefix: text after the colon\r"
start == 0
end == 0

2 番目の結果の値は次のとおりです。

para.Range.Text == "\r"
start == 28
end == 34

明らかに、何かが間違っていますが、正確に何を特定することはできません。

4

3 に答える 3

1

Wordを混乱させる間違った行末である可能性があります-try"text after the colon\r\n"または"text after the colon" + Environment.NewLine。それが機能しない場合は、改行文字によってWordが新しい段落を開始し、それをpara指していることが原因である可能性があります。新しい段落にはテキストが含まれていないため、範囲を選択することはできません。

その場合、同じ結果を得るには、テキストに改行を入れないでください。

  • 2番目の段落が必要な場合は、別のreport.Content.Paragraphs.Add呼び出しを行います。
  • 段落区切りではない改行を追加できます。これはCtrlキーを押しながらWordで入力し、コードで表現できるようにする必要があります(方法はわかりません)。
于 2012-07-23T15:27:24.457 に答える
1

推測では、これは実際には検証されていませんが、動作は論理的です。\ nは、WordでEnterキーを押すのと同じように、新しい段落を追加します。したがって、Textプロパティを割り当てると段落参照が変更され、追加された空の段落を指すようになります。したがって、最終値は範囲外です。前の段落を参照する必要があります。または、ラインフィードを使用しないでください。

于 2012-07-23T17:22:08.090 に答える
1

これは他の誰かに役立つ可能性があるため、回答を追加します。受け入れられた回答に対するコメントには長すぎると思います。

Word の新しい行に関連する問題がありました。エラーはありませんが、新しい行を開始するためのスペースがあります。

例:

string wordText = "First line";
wordText += "\r\n"; // or System.Environment.NewLine;
wordText += "Second line";

Word 文書で次の結果が得られます。

First line
 Second line

この質問を見た後、「\r」のみを使用してみましたが、うまくいきました! だから今私は持っています:

string wordText = "First line";
wordText += "\r";
wordText += "Second line";

結果は次のとおりです。

First line
Second line
于 2013-04-18T15:59:34.727 に答える