NPOI 復制Word中的表格內容, 操作Word表格


操作NPOI中的Word表格,復制/克隆完整表格


NPOI中沒有提供復制表格/元素的方法,所以需要自己實現復制表格的方法

注意 以下操作均是操作docx文件

操作Word文檔需要操作XWPFDocument對象,復制表格需要操作XWPFTable對象

NPOI項目地址:https://github.com/tonyqus/npoi

代碼如下,需要修改XWPFTable的構造函數:

public XWPFTable(CT_Tbl table, IBody part, XWPFTable source)
        // create new table by origin table
        {
            this.part = part;
            this.ctTbl = table;
            tableRows = new List<XWPFTableRow>();
            XWPFTable target = this;
            target.ctTbl.tblPr = source.ctTbl.tblPr;
            target.ctTbl.tblGrid = source.ctTbl.tblGrid;

            for (int i = 0; i < source.Rows.Count; i++)
            {
                CT_Row targetRow = target.ctTbl.AddNewTr();

                XWPFTableRow row = source.Rows[i];
                targetRow.trPr = row.GetCTRow().trPr;
                targetRow.rsidR = row.GetCTRow().rsidR;
                targetRow.rsidTr = row.GetCTRow().rsidTr;
                targetRow.Table = table;
                XWPFTableRow tabRow = new XWPFTableRow(targetRow, this);
                tableRows.Add(tabRow);
                for (int c = 0; c < row.GetTableCells().Count; c++)
                {
                    CT_Tc targetCell = targetRow.AddNewTc();
                    XWPFTableCell cell = row.GetTableCells()[c];
                    targetCell.tcPr = cell.GetCTTc().tcPr;
                    for (int p = 0; p < cell.Paragraphs.Count; p++)
                    {
                        CT_P targetPhs = targetCell.AddNewP();
                        XWPFParagraph para = cell.Paragraphs[p];
                        targetPhs.pPr = para.GetCTP().pPr;
                        targetPhs.rsidR = para.GetCTP().rsidR;
                        targetPhs.rsidRPr = para.GetCTP().rsidRPr;
                        targetPhs.rsidRDefault = para.GetCTP().rsidRDefault;
                        targetPhs.rsidP = para.GetCTP().rsidP;

                        for (int r = 0; r < para.Runs.Count; r++)
                        {
                            CT_R targetRun = targetPhs.AddNewR();

                            XWPFRun run = para.Runs[r];
                            targetRun.rPr = run.GetCTR().rPr;
                            targetRun.rsidRPr = run.GetCTR().rsidRPr;
                            targetRun.rsidR = run.GetCTR().rsidR;
                            CT_Text text = targetRun.AddNewT();
                            text.Value = run.Text;
                        }


                    }

                }

            }


        }

不理解的可以Clone github上的代碼 拿工具看一下Word(docx)的結構就能大概明白了
不想修改構造函數的,可以使用反射直接操作元素
另外,NPOI畢竟是根據Java的POI改過來的,有些東西很多作者都沒有實現,商用請慎重!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM