• 使用NPOI读取Word文档内容并进行修改


    前言

    网上使用NPOI读取Word文件的例子现在也不少,本文就是参考网上大神们的例子进行修改以适应自己需求的。

    参考博文

    http://www.cnblogs.com/mahongbiao/p/3760878.html

    本文使用的NPOI版本是 2.1.1.0(.net2.0)  下载链接  https://files.cnblogs.com/files/masonblog/NPOI2-1-1DotNet2-0.zip

    本例Word文档  https://files.cnblogs.com/files/masonblog/NPOIWordTestRun.zip

    运行结果

     

    示例代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Data;
    using System.Web.UI.WebControls;
    using System.IO;
    using GXEIS.Web.Main.Common;
    using System.Configuration;
    using Newtonsoft.Json;
    using NPOI.XWPF.UserModel;
    using NPOI.OpenXmlFormats.Wordprocessing;
    using System.Text;
    
    namespace CourseMgr
    {
        public partial class CourseList : PageBase
        {
    
            BLL.Course _CourseBLL = null;
            Model.v_Course _v_CourseModel = null;
            BLL.Grade _GradeBLL = null;
            Model.Grade _GradeModel = null;
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    ExportToWordByTemplate();
                }
            }
               
            #region 根据课程表模板下载Word文档
    
            /// <summary>
            /// 根据课程表模板下载Word文档
            /// </summary>
            /// <param name="fileName"></param>
            /// <returns></returns>
            public void ExportToWordByTemplate()
            {
                string sClassName = hfSelectedClass.Value.Trim();
                string sYear1 = txtYear1.Text.Trim();
                string sYear2 = txtYear2.Text.Trim();
                string sSemester = txtSemester.Text.Trim();
                string sYear = sYear1 + "-" + sYear2;
                #region 数据验证
                if (string.IsNullOrEmpty(sClassName))
                {
                    Windows.MessageBox(Page, "请先选择班级", MessageType.Normal);
                    return;
                }
                if (string.IsNullOrEmpty(sYear1))
                {
                    Windows.MessageBox(Page, "学年不可为空", MessageType.Normal);
                    return;
                }
                if (string.IsNullOrEmpty(sYear2))
                {
                    Windows.MessageBox(Page, "学年不可为空", MessageType.Normal);
                    return;
                }
                if (string.IsNullOrEmpty(sSemester))
                {
                    Windows.MessageBox(Page, "学期不可为空", MessageType.Normal);
                    return;
                }
                #endregion
                try
                {
                    #region 获取课程表数据
                    DataTable dtExport = new DataTable();
                    BLL.Grade GradeBLL = new BLL.Grade();
                    Model.Grade GradeModel = GradeBLL.GetModelByGradeClassName(CurrentOperator.OrgNo, sClassName);
                    _CourseBLL = new BLL.Course();
                    DataView dvResult = _CourseBLL.GetViewList(string.Format("OrgNo='{0}' and YearStr='{1}' and Semester='{2}' and ClassNo='{3}' ", CurrentOperator.OrgNo, sYear, sSemester, GradeModel.GradeNo)).Tables[0].DefaultView;
                    #endregion
    
                    #region 打开文档
                    string fileName = Server.MapPath(@"~/Upload/CourseExportTemplate/班级课程表模板.doc");
                    if (!File.Exists(fileName))
                    {
                        Windows.MessageBox(Page, "导出失败:课程表模板不存在!", MessageType.Normal);
                        return;
                    }
                    XWPFDocument document = null;
                    using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                    {
                        document = new XWPFDocument(file);
                    }
    
                    #endregion
    
                    #region 正文段落
                    foreach (XWPFParagraph paragraph in document.Paragraphs)
                    {
                        //判断是否是"**课程表"标题
                        if (paragraph.ParagraphText.Contains("GradeClassName课程表"))
                        {
                            IList<XWPFRun> listRun = paragraph.Runs;
                            while (listRun.Count > 0)
                            {
                                paragraph.RemoveRun(0);
                            }
                            XWPFRun xwpgr1 = paragraph.CreateRun();
                            xwpgr1.SetBold(true);
                            xwpgr1.FontSize = 23;
                            xwpgr1.SetText(sClassName + "课程表");
                            xwpgr1.SetTextPosition(30);
                        }
                    }
                    #endregion
    
                    #region 表格
                    int iRow = 0;//表中行的循环索引
                    int iCell = 0;//表中列的循环索引
                    //1.循环Word文档中的表格(该Word模板中就一个课程表)
                    foreach (XWPFTable table in document.Tables)
                    {
                        //2.循环表格行
                        foreach (XWPFTableRow row in table.Rows)
                        {
                            iRow = table.Rows.IndexOf(row);//获取该循环在List集合中的索引
                            //3.循环没行中的列
                            foreach (XWPFTableCell cell in row.GetTableCells())
                            {
                                iCell = row.GetTableCells().IndexOf(cell);//获取该循环在List集合中的索引
                                //4.进行单元格中内容的获取操作
                                //4.1获取单元格中所有的XWPFParagraph(单元格中每行数据都是一个XWPFParagraph对象)
                                IList<XWPFParagraph> listXWPFParagraph = cell.Paragraphs;
                                //4.1.1如果列中的XWPFParagraph为1个以上则是课程+教师,进行数据操作。                            
                                if (listXWPFParagraph.Count > 1)
                                {
                                    //4.2根据行列获取对应的星期节次的课程信息
                                    dvResult.RowFilter = string.Format(" Section='{0}' and WorkingDay='{1}' ", iRow + 1, iCell + 1);
                                    //4.2.1获取到对应的课程信息,将单元格中的课程名称和教师名称进行替换
                                    if (dvResult.Count > 0)
                                    {
                                        //第一个XWPFParagraph为课程名称
                                        XWPFParagraph xwpfPCource = listXWPFParagraph[0];
                                        if (xwpfPCource != null)
                                        {
                                            //获取现有的Run集合
                                            IList<XWPFRun> listRun = xwpfPCource.Runs;
                                            //循环移除
                                            while (listRun.Count > 0)
                                            {
                                                xwpfPCource.RemoveRun(0);
                                            }
                                            //添加获取的数据
                                            XWPFRun xwpgRScience = xwpfPCource.CreateRun();
                                            xwpgRScience.SetText(dvResult[0]["ScienceName"].ToString().Trim());
                                            xwpgRScience.FontSize = 12;
                                            xwpfPCource.AddRun(xwpgRScience);
                                        }
                                        //第二个XWPFParagraph为教师名称
                                        XWPFParagraph xwpfPTeacher = listXWPFParagraph[1];
                                        if (xwpfPTeacher != null)
                                        {
                                            //获取现有的Run集合
                                            IList<XWPFRun> listRun = xwpfPTeacher.Runs;
                                            //循环移除
                                            while (listRun.Count > 0)
                                            {
                                                xwpfPTeacher.RemoveRun(0);
                                            }
                                            //添加获取的数据
                                            XWPFRun xwpgRTeacher = xwpfPTeacher.CreateRun();
                                            xwpgRTeacher.SetText(dvResult[0]["TeacherName"].ToString().Trim());
                                            xwpgRTeacher.FontSize = 12;
                                            xwpfPTeacher.AddRun(xwpgRTeacher);
                                        }
                                    }
                                    //4.2.2没有对应的课程信息。为了美观,移除单元格中的第二个XWPFParagraph,避免出现多个换行符。
                                    else
                                    {
                                        cell.RemoveParagraph(1);
                                    }
                                }
                                //4.1.2如果列中的XWPFParagraph为1个则是标题单元格(星期和节次),不进行数据操作。
                                else { }
                            }
                        }
                    }
                    #endregion
    
                    #region 导出文件
                    System.IO.MemoryStream ms = new System.IO.MemoryStream();
                    document.Write(ms);
                    Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.doc", HttpUtility.UrlEncode(sClassName + "课程表", System.Text.Encoding.UTF8)));
                    Response.BinaryWrite(ms.ToArray());
                    Response.End();
                    #endregion
                }
    
                catch (Exception ex)
                {
                    Windows.MessageBox(Page, "导出失败!", MessageType.Normal);
                    LogWrite("导出失败!", ex.ToString(), CurrentOperator.OperatorNo, ResourceID);
                }
            }
            #endregion
        }
    }    
  • 相关阅读:
    Ubuntu 14.04 LTS 火狐浏览器中,鼠标选择文字被删除的解决办法
    Android 冷启动时间优化
    Word 2010 小技巧篇
    Word 2010 制作文档结构之图标自动编号设置
    Word 2010 制作文档结构之章节自动编号
    Word 2010 制作文档结构之页码从正文开始设置
    字幕通-字幕翻译工具
    图灵社区 和 大家网
    Python GUI编程之WxPython
    VLC媒体视频播放器 v3.0.2官方版
  • 原文地址:https://www.cnblogs.com/masonblog/p/7097483.html
Copyright © 2020-2023  润新知