3

ブックマークとopenXMLを使用してWord文書に複数の行を追加することは可能ですか?

レポートテンプレートとして機能するワードドキュメントがあります。そのテンプレートに、いくつかのトランザクション行を追加する必要があります。問題は、行数が静的ではないことです。たとえば、0、1、または42になります。

現在のテンプレート(変更可能)には、TransactionPart、TransactionPart2、TransactionPart3の3つのブックマークを追加しました。ツリーtransactionpartsは、3つの異なるデータコンテンツ(ID、説明、金額)を持つ単一の行を形成します

トランザクション行が1つしかない場合、それらのブックマークにデータを追加するのに問題はありませんが、行2を追加する必要がある場合はどうすればよいでしょうか。これ以上の行のブックマークはありません。

これを行うための賢い方法はありますか?

または、行がテーブルになるようにworddocumentを変更する必要がありますか?それはより良い方法で問題を解決しますか?

4

1 に答える 1

3

3列のテーブル内に「トランザクション」と呼ぶブックマークを1つ配置します。このような テーブルレイアウト

テーブルのデザインはわかっているが、必要な行数がわからない場合、最も簡単な方法は、データの行ごとに行を追加することです。

このようなコードでそれを達成できます

//make some data.
            List<String[]> data = new List<string[]>();

            for (int i = 0; i < 10; i++)
                data.Add(new String[] {"this","is","sparta" });
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open("yourDocument.docx", true))
                {
                    var mainPart = wordDoc.MainDocumentPart;
                    var bookmarks = mainPart.Document.Body.Descendants<BookmarkStart>();
                    var bookmark = 
                        from n in bookmarks 
                        where n.Name == "transactions" 
                        select n;

                    OpenXmlElement elem = bookmark.First().Parent;
                    //isolate tabel
                    while (!(elem is DocumentFormat.OpenXml.Wordprocessing.Table))
                        elem = elem.Parent;
                    var table = elem; //found
                    //save the row you wanna copy in each time you have data.
                    var oldRow = elem.Elements<TableRow>().Last();
                    DocumentFormat.OpenXml.Wordprocessing.TableRow row = (TableRow)oldRow.Clone();
                    //remove old row
                    elem.RemoveChild<TableRow>(oldRow);
                    foreach (String[] s in data)
                    {
                        DocumentFormat.OpenXml.Wordprocessing.TableRow newrow = (TableRow)row.Clone();
                        var cells = newrow.Elements<DocumentFormat.OpenXml.Wordprocessing.TableCell>();
                        //we know we have 3 cells
                        for(int i = 0; i < cells.Count(); i++)
                        {
                            var c = cells.ElementAt(i);
                            var run = c.Elements<Paragraph>().First().Elements<Run>().First();
                            var text = run.Elements<Text>().First();
                            text.Text = s[i];
                        }
                        table.AppendChild(newrow);
                    }
                }

あなたはこれで終わります

ファイナルテーブル

私はかなり基本的なドキュメントでこのコードをテストし、それが機能することを知っています. 頑張ってください。さらに明確にすることができればお知らせください。

于 2013-04-03T08:08:26.273 に答える