使用NPOI读取Excel表格内容并进行修改

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

参考示例:http://www.cnblogs.com/restran/p/3889479.html

本文使用的NPOI版本是 2.1.1.0,下载地址:http://files.cnblogs.com/files/masonblog/NPOI2.1.1%28.Net2.0%29.zip  

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Web;
  5 using System.Web.UI;
  6 using System.Web.UI.WebControls;
  7 using System.Data;
  8 using System.IO;
  9 using NPOI.SS.UserModel;
 10 using NPOI.XSSF.UserModel;
 11 using NPOI.HSSF.UserModel;
 12 
 13 namespace CourseMgr
 14 {
 15     public partial class EntireSchoolCourse : PageBase
 16     {
 17         BLL.Course _CourseBLL = null;
 18         Model.Course _CourseModel = null;
 19         protected void Page_Load(object sender, EventArgs e)
 20         {
 21             if (!IsPostBack)
 22             {
 23                 ExportToExcelByTemplate();
 24             }
 25         }       
 26 
 27         #region 根据学校课程表模板导出Excel表格
 28 
 29         public void ExportToExcelByTemplate()
 30         {
 31             string sYear1 = base.YearBegin;
 32             string sYear2 = base.YearEnd;
 33             string sSemester = base.Term;
 34             string sYear = sYear1 + "-" + sYear2;
 35             try
 36             {
 37                 #region 获取课程表数据
 38                 _CourseModel = new Model.Course
 39                 {
 40                     OrgNo = CurrentOperator.OrgNo,
 41                     YearStr = sYear,
 42                     Semester = sSemester
 43                 };
 44                 _CourseBLL = new BLL.Course();
 45                 DataTable dtResult = _CourseBLL.GetEntireSchoolCourse(_CourseModel);
 46                 #endregion
 47 
 48                 #region 打开Excel表格模板,并初始化到NPOI对象中
 49                 IWorkbook wk = null;
 50                 string filePath = Server.MapPath(@"~/Upload/CourseExportTemplate/学校课程表模板.xls");
 51                 if (!File.Exists(filePath))
 52                 {
 53                     Windows.MessageBox(Page, "导出失败:课程表模板不存在!", MessageType.Normal);
 54                     return;
 55                 }
 56                 string extension = System.IO.Path.GetExtension(filePath);
 57                 FileStream fs = File.OpenRead(filePath);
 58                 if (extension.Equals(".xls"))
 59                 {
 60                     //把xls文件中的数据写入wk中
 61                     wk = new HSSFWorkbook(fs);
 62                 }
 63                 else
 64                 {
 65                     //把xlsx文件中的数据写入wk中
 66                     wk = new XSSFWorkbook(fs);
 67                 }
 68                 fs.Close();
 69                 #endregion
 70 
 71                 #region 数据处理
 72                 //1.读取Excel表格中的第一张Sheet表
 73                 ISheet sheet = wk.GetSheetAt(0);
 74                 IRow row = null;//数据行
 75                 ICell cell = null;//数据行中的某列
 76                 //2.添加Excel数据行。处理表格的边框,没有数据的数据行就没有内外边框。
 77                 //获取数据行数(班级数量)
 78                 int iCount = dtResult.Rows.Count;
 79                 for (int i = 0; i < iCount - 1; i++)//循环次数:数据行-1,因为已经默认添加了一行Excel单元行。
 80                 {
 81                     //从第二行复制出新行,主要是单元格的属性已经在第二行中设置好。
 82                     sheet.CopyRow(2, 2 + 1 + i);
 83                 }
 84                 //3.填充数据
 85                 string sCourceTeacher = string.Empty;//从DataTable中获取的课程信息
 86                 string[] strCourceTeacher = null;//将课程名称和教师名称分割开
 87                 //3.1从索引2(第三行)开始填充单元格中的数据
 88                 for (int i = 2; i < iCount + 2; i++)
 89                 {
 90                     //3.2读取当前行的对象
 91                     row = sheet.GetRow(i);
 92                     if (row != null)
 93                     {
 94                         //3.3获取该行第一列,赋值班级名称
 95                         cell = row.GetCell(0);
 96                         cell.SetCellValue(dtResult.Rows[i - 2]["GradeName"].ToString() + dtResult.Rows[i - 2]["ClassName"].ToString());
 97                         //3.4循环获取后面列的对象
 98                         for (int j = 1; j < row.LastCellNum; j++)
 99                         {
100                             cell = row.GetCell(j);
101                             sCourceTeacher = dtResult.Rows[i - 2]["science" + GetWeekDaySectionByInt(j)].ToString();
102                             //3.4.1如果未获取到该班级星期节次的信息,则赋值\
103                             if (string.IsNullOrEmpty(sCourceTeacher))
104                             {
105                                 cell.SetCellValue("\\");
106                             }
107                             //3.4.2获取到课程则进行赋值(课程名称在上,换行,教师名称在下)
108                             else
109                             {
110                                 strCourceTeacher = sCourceTeacher.Split('|');
111                                 cell.SetCellValue(strCourceTeacher[0] + "\n" + strCourceTeacher[1]);
112                             }
113                         }
114                     }
115                 }
116                 #endregion
117 
118                 #region 表格导出
119                 System.IO.MemoryStream ms = new System.IO.MemoryStream();
120                 wk.Write(ms);
121                 Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", HttpUtility.UrlEncode("学校总课程表", System.Text.Encoding.UTF8)));
122                 Response.BinaryWrite(ms.ToArray());
123                 Response.End();
124                 #endregion
125             }
126             catch (Exception ex)
127             {
128                 LogWrite("导出课程表失败", ex.ToString(), CurrentOperator.Name, ResourceID);
129                 Windows.MessageBox(Page, "导出课程表失败", MessageType.Normal);
130             }
131         }
132 
133         /// 
134         /// 将列序号转换为节次和星期
135         /// 
136         /// 
137         /// 
138         public string GetWeekDaySectionByInt(int i)
139         {
140             //i-1 ,因为第一列为标题列
141             int iWeekDay = (i - 1) / 8;
142             int iSection = (i - 1) % 8;
143 
144             return (iSection + 1).ToString() + (iWeekDay + 1).ToString();
145         }
146         #endregion
147     }
148 }
View Code

运行结果:

使用NPOI读取Excel表格内容并进行修改_第1张图片

使用NPOI读取Excel表格内容并进行修改_第2张图片

 

 

实例Excel表格:http://files.cnblogs.com/files/masonblog/Excel%E8%BF%90%E8%A1%8C%E7%BB%93%E6%9E%9C.zip

转载于:https://www.cnblogs.com/masonblog/p/7097439.html

你可能感兴趣的:(使用NPOI读取Excel表格内容并进行修改)