1

そのため、XML 経由の入力を受け入れるいくつかのプレーン テキスト形式 (リッチ テキスト形式も試しました) コントロールを備えた Microsoft Word 2007 ドキュメントがあります。

キャリッジ リターンの場合、キャリッジ リターンが必要なときに "\r\n" を含む文字列を XML 経由で渡しましたが、Word ドキュメントはそれを無視し、同じ行に折り返し続けました。また、C# マッパーで \r\n を System.Environment.NewLine に置き換えようとしましたが、とにかく \r\n を挿入しただけで、まだ機能しませんでした。

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

これは listMapper の XML です

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

これは、実際にリストをマップする listMapper C# であることに注意してください (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);
                }
            }
        }
    }
}

MS Word 2007 (docx) で改行文字の無視をやめる方法を知っている人はいますか??

4

4 に答える 4

2

次のような関数を使用します。

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;          
}
于 2012-11-01T05:59:48.597 に答える
1

上記の答えはどれも私にとって何の助けにもなりませんでした。

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

contentControl.MultiLine = true    
contentControl.Range.InsertAfter(your string)
于 2016-09-23T10:04:23.697 に答える
0

同じ問題が発生しましたが、テーブルセルにありました。

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

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

解決策は簡単でした。1行ずつ段落を作成し、これらの段落をすべてテーブルセルに追加します。

于 2011-03-16T21:54:03.337 に答える
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;  
}
于 2009-10-29T10:51:48.053 に答える