2009-08-28 7 views
1

したがって、私はXML経由で入力を受け入れるいくつかのプレーンテキストフォーマット(リッチテキストフォーマットも試しました)コントロールを備えたMicrosoft Word 2007ドキュメントを持っています。Microsoft Word文書コントロールがキャリッジリターンを受け付けない

キャリッジリターンの場合、キャリッジリターンが必要なときに文字列に "\ r \ n"を含むXMLが渡されていましたが、ドキュメントは無視され、同じ行にラッピングされます。私はまた、\ r \ nをSystem.Environment.NewLineでC#マッパーに置き換えようと試みましたが、それはちょうど\ r \ nとにかく入れましたが、まだ動作しませんでした。

また、コントロール自体に、コントロールのプロパティで「キャリッジリターン(複数のParagrpahs)を許可する」と設定していることにも注意してください。

これはこれは私が実際にリストをマップlistMapperのC#であることをlistMapper

<Field id="32" name="32" fieldType="SimpleText"> 
    <DataSelector path="/Data/DB/DebtProduct"> 
     <InputField fieldType="" 
        path="/Data/DB/Client/strClientFirm" 
        link="" type=""/> 
     <InputField fieldType="" 
        path="strClientRefDebt" 
        link="" type=""/> 
    </DataSelector> 
    <DataMapper formatString="{0} Account Number: {1}" 
       name="SimpleListMapper" type=""> 
     <MapperData></MapperData> 
    </DataMapper> 
</Field> 

注意(私は試してみてsystem.environment.newlineを追加ところに気づく)

namespace DocEngine.Core.DataMappers 
{ 
    public class CSimpleListMapper:CBaseDataMapper 
    { 
     public override void Fill(DocEngine.Core.Interfaces.Document.IControl control, CDataSelector dataSelector) 
     { 
      if (control != null && dataSelector != null) 
      { 
       ISimpleTextControl textControl = (ISimpleTextControl)control; 
       IContent content = textControl.CreateContent(); 
       CInputFieldCollection fileds = dataSelector.Read(Context); 
       StringBuilder builder = new StringBuilder(); 

       if (fileds != null) 
       { 
        foreach (List<string> lst in fileds) 
        { 
         if (CanMap(lst) == false) continue; 
         if (builder.Length > 0 && lst[0].Length > 0) 
          builder.Append(Environment.NewLine); 
         if (string.IsNullOrEmpty(FormatString)) 
          builder.Append(lst[0]); 
         else 
          builder.Append(string.Format(FormatString, lst.ToArray())); 
        } 

        content.Value = builder.ToString(); 

        textControl.Content = content; 
        applyRules(control, null); 
       } 
      } 
     } 
    } 
} 
ためのXMLです

私の改行文字を無視して終了するには、MS Word 2007(docx)をどのように手に入れることができますか?

答えて

0

私はそれが

WordprocessingDocument _docx = WordprocessingDocument.Create("c:\\Test.docx", WordprocessingDocumentType.Document); 
MainDocumentPart _part = _docx.MainDocumentPart; 
string _str = "abc\ndef\ngeh"; 
string _strArr[] = _str.Split('\n'); 

foreach (string _line in _strArr) 
{ 
    Body _body = new Body(); 
    _body.Append(NewText(_text)); 
    _part.Append(_body); 
} 
_part.Document.Save(); 
_docx.Close(); 

をうまくいくと思います。

static Paragraph NewText(string _text) 
{ 
    Paragraph _head = new Paragraph(); 
    Run _run = new Run(); 
    Text _line = new Text(_text); 
    _run.Append(_line); 
    _head.Append(_run); 
    return _head; 
} 
0

私は同じ問題を抱えていましたが、それはテーブルセルにありました。

テーブルセルに追加された段落に追加されたTextオブジェクトに改行(複数行)を含む1つの文字列がありました。

=>キャリッジリターンは単語によって無視されました。

解決策は簡単でした: 行ごとに1つずつ作成し、これらの段落をすべて表のセルに追加します。このような

1

使用機能:上記の回答の

private static Run InsertFormatRun(Run run, string[] formatText) 
{ 
    foreach (string text in formatText) 
    { 
     run.AppendChild(new Text(text)); 
     RunProperties runProps = run.AppendChild(new RunProperties()); 
     Break linebreak = new Break(); 
     runProps.AppendChild(linebreak); 
    } 
    return run;   
} 
0

なしには、私のために任意のヘルプました。

InsertAfterメソッドは\vの元のXML文字列に\nを置き換え、これがコンテンツコントロールに渡されると正しくレンダリングされることがわかりました。

contentControl.MultiLine = true  
contentControl.Range.InsertAfter(your string) 
関連する問題