0

リッチ テキスト ボックスを InfoPath 形式でセットアップしました。私のプログラムは、次のように Infopath XML を解析します。

XPathNavigator formNameNode = root.SelectSingleNode("/my:myFields/my:Responses/my:Q1", nsMgr);
string response1 = formNameNode.InnerXml;

次に、次のコードを使用して Word 文書を開き、response1 というプレーン テキスト コンテンツ コントロールを取得します。

    using (WordprocessingDocument myDoc =
WordprocessingDocument.Open(ms, true))
    {
        MainDocumentPart mainPart = myDoc.MainDocumentPart;

    List<OpenXmlElement> sdtList = InfoPathToWord.GetContentControl(mainPart.Document, "response1");
            InfoPathToWord.AddRichText(0, response1, ref mainPart, ref sdtList);
}

次に、コードは次のように InfoPathToWord.AddRichText を呼び出します。

public static void AddRichText(int id, string rtfValue,
          ref MainDocumentPart mainPart, ref List<OpenXmlElement> sdtList)
        {
            if (sdtList.Count != 0)
            {
                id++;
                string altChunkId = "AltChunkId" + id;
                AlternativeFormatImportPart chunk =
                  mainPart.AddAlternativeFormatImportPart(
                  AlternativeFormatImportPartType.Xhtml, altChunkId);

                using (MemoryStream ms = new MemoryStream(System.Text.Encoding.Default.GetBytes(rtfValue)))
                {
                    chunk.FeedData(ms);
                    ms.Close();
                }

                AltChunk altChunk = new AltChunk();
                altChunk.Id = altChunkId;

                InfoPathToWord.ReplaceContentControl(sdtList, altChunk);
            }
        }

そして最後に、altChunk が "response1" を置き換えます

    public static void ReplaceContentControl(
      List<OpenXmlElement> sdtList, OpenXmlElement element)
    {
        if (sdtList.Count != 0)
        {
            foreach (OpenXmlElement sdt in sdtList)
            {
                OpenXmlElement parent = sdt.Parent;
                parent.InsertAfter(element, sdt);
                sdt.Remove();
            }
        }
    }

問題は、テキストが置き換えられますが、書式設定が正しくなく、「?」が表示されることです。出力テキストの文字。エンコードが原因かどうかはわかりませんが、試してみましSystem.Text.Encoding.UTF8.GetBytes(rtfValue), System.Text.Encoding.ASCII.GetBytes(rtfValue)たが、どれも役に立たないようです。

誰かが私が間違っていることを教えてください。

前もって感謝します。

メイヴ

4

1 に答える 1

0

保存する前に、regx を使用して文字列を消去しています。

html = Regex.Replace(html, "/[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\x9F]/u", "") ' タブおよびその他の印刷可能な文字を許可します

Dim ms As New MemoryStream(System.Text.Encoding.UTF8.GetBytes(html)) ' 代替形式のインポート パーツを作成します。Dim formatImportPart As AlternativeFormatImportPart = mainDocPart.AddAlternativeFormatImportPart("application/xhtml+xml", altChunkId)

文字列からすべての特殊文字を削除する正規表現?

更新...厳密なテストの結果、docx の InfoPath RTF で文字エンコードの問題が多すぎることがわかりました。

于 2013-11-11T16:49:06.497 に答える