利用NPOI生成DOCX文档

首先安装NPOI控件:

Install-Package NPOI

代码:

复制代码
using NPOI.OpenXmlFormats.Wordprocessing;
using NPOI.XWPF.UserModel;
using System.IO;
using System.Windows;

namespace NPOIDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MemoryStream ms = new MemoryStream();
            XWPFDocument m_Docx = new XWPFDocument();
            m_Docx = CreatDocxTable();
            m_Docx.Write(ms);
            ms.Flush();
            SaveToFile(ms, "d:\\test.docx");
        }

        private XWPFDocument CreatDocxTable()
        {
            XWPFDocument m_Docx = new XWPFDocument();
            XWPFParagraph p0 = m_Docx.CreateParagraph();
            XWPFRun r0 = p0.CreateRun();
            r0.SetText("DOCX表");

            XWPFTable table = m_Docx.CreateTable(1, 3);//创建一行3列表  
            table.GetRow(0).GetCell(0).SetText("111");
            table.GetRow(0).GetCell(1).SetText("222");
            table.GetRow(0).GetCell(2).SetText("333");

            XWPFTableRow m_Row = table.CreateRow();//创建一行  
            m_Row = table.CreateRow();//创建一行  
            m_Row.GetCell(0).SetText("211");

            //合并单元格  
            m_Row = table.InsertNewTableRow(0);//表头插入一行  
            XWPFTableCell cell = m_Row.CreateCell();//创建一个单元格,创建单元格时就创建了一个CT_P  
            CT_Tc cttc = cell.GetCTTc();
            CT_TcPr ctPr = cttc.AddNewTcPr();
            ctPr.AddNewGridspan();
            ctPr.gridSpan.val = "3";//合并3列  
            cttc.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
            cttc.GetPList()[0].AddNewR().AddNewT().Value = "abc";

            XWPFTableRow td3 = table.InsertNewTableRow(table.Rows.Count - 1);//插入行  
            cell = td3.CreateCell();
            cttc = cell.GetCTTc();
            ctPr = cttc.AddNewTcPr();
            ctPr.AddNewGridspan();
            ctPr.gridSpan.val = "3";//合并3列  
            cttc.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
            cttc.GetPList()[0].AddNewR().AddNewT().Value = "qqq";

            //表增加行,合并列  
            CT_Row m_NewRow = new CT_Row();
            m_Row = new XWPFTableRow(m_NewRow, table);
            table.AddRow(m_Row); //必须要!!!  
            cell = m_Row.CreateCell();
            cttc = cell.GetCTTc();
            ctPr = cttc.AddNewTcPr();
            ctPr.AddNewGridspan();
            ctPr.gridSpan.val = "3";//合并3列  
            cttc.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
            cttc.GetPList()[0].AddNewR().AddNewT().Value = "sss";

            //表未增加行,合并2列,合并2行  
            //1行  
            m_NewRow = new CT_Row();
            m_Row = new XWPFTableRow(m_NewRow, table);
            table.AddRow(m_Row);
            cell = m_Row.CreateCell();
            cttc = cell.GetCTTc();
            ctPr = cttc.AddNewTcPr();
            ctPr.AddNewGridspan();
            ctPr.gridSpan.val = "2";//合并3列  
            ctPr.AddNewVMerge().val = ST_Merge.restart;//合并行  
            ctPr.AddNewVAlign().val = ST_VerticalJc.center;//垂直居中  
            cttc.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
            cttc.GetPList()[0].AddNewR().AddNewT().Value = "xxx";
            cell = m_Row.CreateCell();
            cell.SetText("ddd");
            //2行,多行合并类似  
            m_NewRow = new CT_Row();
            m_Row = new XWPFTableRow(m_NewRow, table);
            table.AddRow(m_Row);
            cell = m_Row.CreateCell();
            cttc = cell.GetCTTc();
            ctPr = cttc.AddNewTcPr();
            ctPr.AddNewGridspan();
            ctPr.gridSpan.val = "2";//合并3列  
            ctPr.AddNewVMerge().val = ST_Merge.@continue;//合并行  
            cell = m_Row.CreateCell();
            cell.SetText("kkk");
            ////3行  
            //m_NewRow = new CT_Row();  
            //m_Row = new XWPFTableRow(m_NewRow, table);  
            //table.AddRow(m_Row);  
            //cell = m_Row.CreateCell();  
            //cttc = cell.GetCTTc();  
            //ctPr = cttc.AddNewTcPr();  
            //ctPr.gridSpan.val = "2";  
            //ctPr.AddNewVMerge().val = ST_Merge.@continue;  
            //cell = m_Row.CreateCell();  
            //cell.SetText("hhh");  

            return m_Docx;
        }

        private void SaveToFile(MemoryStream ms, string fileName)
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
            {
                byte[] data = ms.ToArray();

                fs.Write(data, 0, data.Length);
                fs.Flush();
                data = null;
            }
        }
    }
}
复制代码

 

posted @   wzwyc  阅读(469)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示