前言

网上使用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
}
}

使用NPOI读取Word文档内容并进行修改的更多相关文章

  1. C#读取Word文档内容代码

    首先要添加引用com组件:然后引用: using Word = Microsoft.Office.Interop.Word; 获取内容: /// /// 读取 word文档 返回内容 /// //// ...

  2. ASP 读取Word文档内容简单示例

    以下通过Word.Application对象来读取Doc文档内容并显示示例. 下面进行注册Word组件:1.将以下代码存档命名为:AxWord.wsc XML code复制代码 <?xml ve ...

  3. Python读取word文档内容

    1,利用python读取纯文字的word文档,读取段落和段落里的文字. 先读取段落,代码如下: 1 ''' 2 #利用python读取word文档,先读取段落 3 ''' 4 #导入所需库 5 fro ...

  4. ASP 读取Word文档内容简单示例_组件开发_新兴网络_20161014161610.jpg

  5. java中读取word文档里的内容

    package com.cn.peitest.excel.word; import java.io.FileInputStream; import java.io.FileOutputStream; ...

  6. 使用python编辑和读取word文档

    python调用word接口主要用到的模板为python-docx,基本操作官方文档有说明. python-docx官方文档地址 使用python新建一个word文档,操作就像文档里介绍的那样: fr ...

  7. Python读取word文档(python-docx包)

    最近想统计word文档中的一些信息,人工统计的话...三天三夜吧 python 不愧是万能语言,发现有一个包叫做 docx,非常好用,具体查看官方文档:https://python-docx.read ...

  8. C# 设置、删除、读取Word文档背景——基于Spire.Cloud.Word

    Spire.Cloud.Word.Sdk提供了接口SetBackgroudColor().SetBackgroudImage().DeleteBackground().GetBackgroudColo ...

  9. [转载]linux上用PHP读取WORD文档

    在linux上用PHP读取WORD文档,其实是使用了 antiword程序把word文档转化为txt文档. 再使用php执行系统命令调用而已. 具体操作如下: 1.安装antiword 官方站:htt ...

随机推荐

  1. Jmeter生成HTML测试报告

    jmeter轻便小巧,运行速度快,但是缺少直观的可视化测试报告,并且生成测试报告操作稍微有点麻烦. GUI界面没有生成测试报告的功能,只能使用命令行生成测试报告.这里需要提到一个jtl的文件,它是生成 ...

  2. 关于Linux虚拟机连接不上网络的问题

    前阵子自学Linux(版本是CentOS6 -VMware ),因为连不上网的问题搁置了一段时间,昨天又重新拾起来,花了一下午时间终于搞定.下面说几点,给自己学习历程一个记录,也希望能帮到其他初学者. ...

  3. 【HAOI2015】树上操作

    (题面来自洛谷) 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树 ...

  4. redis cluster可用性测试

    上一节,我们用三台redis组成了cluster,现在我们停掉一台试试: 比较奇怪的是,在停掉其中一台服务器之前建立的链接仍然可以正常执行命令,当我们断开重连时,命令就都被拒绝了: 关联知识: 什么时 ...

  5. mysql undo+redo+binlog

    rt 数据库事务开始之前,会将要修改的记录存放到UNdo日志里,当事务回滚时或数据库崩溃时,可以利用undo日志撤销未提交事务对数据库产生的影响. 逻辑日志,记录一个过程,提交后不会删除.delete ...

  6. 记一次Ddos遭遇

    万年不用的vps最近借朋友用了几天,今天突然跟我说连不上了 上服务器先暴力重启一波 还是不行,netstat一看 端口的连接状态是这个样子: 估计连接被打满了,遂换了个端口 重启之 问题解决

  7. 论如何优雅的抛出SpringBoot注解的异常

    平时我们在写代码的时候肯定要进行很多参数验证,最开始的时候我们一般都是这样处理的  如下图   看起来好像也没什么,但是  如果参数多了呢?你就会看到这样的校验 OMG!!!  有没有感觉稍微有点视觉 ...

  8. 16.java设计模式之迭代器模式

    基本需求: 展示一个学校的结构,比如一个学校下面有多个学院,学院下面有多个系,对其节点主要是遍历,与组合模式略有不同 传统方案: 学校<-学院<-系 依次继承 这种方式,在一个页面中展示出 ...

  9. PyQt(Python+Qt)学习随笔:QTableWidget表格部件中行高和列宽的计算方式

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget表格部件中行高和列宽的计算在Qt提供的资料中内容介绍比较泛,细节说得不清楚, ...

  10. PyQt(Python+Qt)学习随笔:Qt Designer中部件的样式表styleSheet属性

    styleSheet属性是定义部件外观的属性样式表,在Qt中styleSheet样式表是类似于html的css样式一样的方法,只是时专门为Qt中的部件开发的.styleSheet的定义语法也是类似CS ...