asp.net使用MVC4框架基于NPOI做导出数据到Excel表

NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。


使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作。使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作。


下面我们使用NPOI在MVC4框架下制作一个导出的功能。
(1)在DAL数据访问层,定义需要需要导出的数据表,可以根据需要导出的字段,进行SQL语句的组织条件。

public DataTable GetData()
       {
           DataTable dt = new DataTable();
           using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["connStr"].ToString()))
           {
               string sql = "select [LoginID],[WageID],[Name],[UserLimit],[OnDutyTime],[CarShiFa],[OnDutyDay],[NightOnDuty],[AllNightOnDuty],[CarAllowance],[WorkOvertime],[WeekendNightWork],[WeekendOverNight] from Kaoqinsum where OnDutyTime=datename(yy,getdate()) + '-' + datename(m,dateadd(m,-1,getdate()))";
               conn.Open();
               SqlCommand cmd = new SqlCommand(sql, conn);
               SqlDataAdapter sda = new SqlDataAdapter(cmd);
               sda.Fill(dt);
               conn.Close();
               return dt;
           }
       }
  (2)在BLL业务逻辑层,调用数据访问层中的GetDate();


  public DataTable GetDate()
        {
            return new SalaryManageDAL.KaoqinsumDAL().GetData();
        }
  (3)在控制器中,我们来书写导出功能的主要代码。

public ActionResult DaoChu()
        {
            DataTable dt = new SalaryManageBLL.KaoqinsumBLL().GetDate();
            //1、实例化workbook工作簿对象
            HSSFWorkbook hssfworkbook = new HSSFWorkbook();
            //2、创建文档摘要信息
            DocumentSummaryInformation dsf = PropertySetFactory.CreateDocumentSummaryInformation();
            dsf.Company = "沈阳工学院";//公司
            dsf.Category = "Statistics";//类别
            //CustomProperties 自定义属性
            SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
            si.Author = "院办";//作者
            //Comments 评论 CreateDateTime 创建时间 Template模板
            si.Keywords = "kaoqin,yuanban";//关键字
            si.Subject = "kaoqin";//主题
            si.Title = "考勤汇总";//标题
            si.RevNumber = "1.0";//版本号
            //3、将写好的文档摘要 赋值workbook对象
            hssfworkbook.DocumentSummaryInformation = dsf;
            hssfworkbook.SummaryInformation = si;
            //4、创建Sheet
            HSSFSheet Sheet1 = (HSSFSheet)hssfworkbook.CreateSheet("Sheet1");
            HSSFSheet Sheet2 = (HSSFSheet)hssfworkbook.CreateSheet("Sheet2");
            HSSFSheet Sheet3 = (HSSFSheet)hssfworkbook.CreateSheet("Sheet3");
            //5、创建页眉页脚
            Sheet1.CreateRow(0).CreateCell(1).SetCellValue(123);
 
            Sheet1.Header.Center = "统计数据";
            Sheet1.Header.Left = "logo.png";
            Sheet1.Header.Right = "zhguAddress";
            Sheet1.Footer.Center = "page";
            //6、标题
            string yeartime = time();
 
            HSSFCell fcell = (HSSFCell)Sheet1.CreateRow(0).CreateCell(0);//第一行
            fcell.SetCellValue("沈阳工学院" + yeartime + "考勤汇总情况表");//文本
            //合并单元格
            Sheet1.AddMergedRegion(new CellRangeAddress(0, 0, 0, 13));//2.0使用 2.0以下为Region
            //标题样式
            HSSFCellStyle fCellStyle = (HSSFCellStyle)hssfworkbook.CreateCellStyle();
            HSSFFont ffont = (HSSFFont)hssfworkbook.CreateFont();
            ffont.FontHeight = 20 * 20;
            ffont.FontName = "宋体";
            ffont.Color = HSSFColor.BLUE.index;
            fCellStyle.SetFont(ffont);
            fCellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.CENTER;//垂直对齐
            fCellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;//水平对齐
            fcell.CellStyle = fCellStyle;
 
 
            //7、设置单元格格式 创建单元格
            /*模拟设定7列*/
            HSSFDataFormat dataformat = (HSSFDataFormat)hssfworkbook.CreateDataFormat();//数据格式
            HSSFFont font = (HSSFFont)hssfworkbook.CreateFont();//数据字体
            font.Color = HSSFColor.BLACK.index; //颜色 
            font.IsItalic = false;//斜体
            font.IsStrikeout = false;//加粗
            font.FontName = "宋体";//字体
 
            //必不可少 可以变更在循环输出数据时指定类型 需要调用sqlDbType 较复杂
            //Id  int类型
            HSSFCell cell1 = (HSSFCell)Sheet1.CreateRow(1).CreateCell(0); //创建单元格
            HSSFCellStyle cellStyle1 = (HSSFCellStyle)hssfworkbook.CreateCellStyle();//单元格样式
            cellStyle1.DataFormat = HSSFDataFormat.GetBuiltinFormat("");
            // CellRangeAddressList ranglist1 = new CellRangeAddressList(0, 65535, 0, 0);//集合限定类型
            // DVConstraint constraint1 = DVConstraint.CreateNumericConstraint(DVConstraint.ValidationType.INTEGER, DVConstraint.OperatorType.BETWEEN, "0", "100");//约束
            cellStyle1.SetFont(font);
            cell1.CellStyle = cellStyle1;
            cell1.SetCellValue("");
 
 
            //Name
            HSSFCell cell2 = (HSSFCell)Sheet1.CreateRow(1).CreateCell(1);
            HSSFCellStyle cellStyle2 = (HSSFCellStyle)hssfworkbook.CreateCellStyle();
            cellStyle2.DataFormat = HSSFDataFormat.GetBuiltinFormat("");
            cellStyle2.SetFont(font);
            cell2.CellStyle = cellStyle2;
            cell2.SetCellValue("");
 
 
            //phone
            HSSFCell cell3 = (HSSFCell)Sheet1.CreateRow(1).CreateCell(2);
            HSSFCellStyle cellStyle3 = (HSSFCellStyle)hssfworkbook.CreateCellStyle();
            cellStyle3.DataFormat = HSSFDataFormat.GetBuiltinFormat("");
            cellStyle3.SetFont(font);
            cell3.CellStyle = cellStyle3;
            cell3.SetCellValue("");
 
 
            //address
            HSSFCell cell4 = (HSSFCell)Sheet1.CreateRow(1).CreateCell(3);
            HSSFCellStyle cellStyle4 = (HSSFCellStyle)hssfworkbook.CreateCellStyle();
            cellStyle4.DataFormat = HSSFDataFormat.GetBuiltinFormat("");
            cellStyle4.SetFont(font);
            cell4.CellStyle = cellStyle4;
            cell4.SetCellValue("");
 
 
            //Status
            HSSFCell cell5 = (HSSFCell)Sheet1.CreateRow(1).CreateCell(4);
            HSSFCellStyle cellStyle5 = (HSSFCellStyle)hssfworkbook.CreateCellStyle();
            cellStyle5.DataFormat = HSSFDataFormat.GetBuiltinFormat("");
            cellStyle5.SetFont(font);
            cell5.CellStyle = cellStyle5;
            cell5.SetCellValue("");
 
 
            //balance
            HSSFCell cell6 = (HSSFCell)Sheet1.CreateRow(1).CreateCell(5);
            HSSFCellStyle cellStyle6 = (HSSFCellStyle)hssfworkbook.CreateCellStyle();
            cell6.SetCellValue("");
            cellStyle6.DataFormat = HSSFDataFormat.GetBuiltinFormat("");
            cellStyle6.SetFont(font);
            cell6.CellStyle = cellStyle6;
 
 
            //CreateDate
            HSSFCell cell7 = (HSSFCell)Sheet1.CreateRow(1).CreateCell(6);
            HSSFCellStyle cellStyle7 = (HSSFCellStyle)hssfworkbook.CreateCellStyle();
            cellStyle7.DataFormat = HSSFDataFormat.GetBuiltinFormat("");
            cellStyle7.SetFont(font);
            cell7.CellStyle = cellStyle7;
            cell7.SetCellValue("");
 
            HSSFCell cell8 = (HSSFCell)Sheet1.CreateRow(1).CreateCell(7);
            HSSFCellStyle cellStyle8 = (HSSFCellStyle)hssfworkbook.CreateCellStyle();
            cellStyle8.DataFormat = HSSFDataFormat.GetBuiltinFormat("");
            cellStyle8.SetFont(font);
            cell8.CellStyle = cellStyle8;
            cell8.SetCellValue("");
 
            HSSFCell cell9 = (HSSFCell)Sheet1.CreateRow(1).CreateCell(8);
            HSSFCellStyle cellStyle9 = (HSSFCellStyle)hssfworkbook.CreateCellStyle();
            cellStyle9.DataFormat = HSSFDataFormat.GetBuiltinFormat("");
            cellStyle9.SetFont(font);
            cell9.CellStyle = cellStyle9;
            cell9.SetCellValue("");
 
            HSSFCell cell10 = (HSSFCell)Sheet1.CreateRow(1).CreateCell(9);
            HSSFCellStyle cellStyle10 = (HSSFCellStyle)hssfworkbook.CreateCellStyle();
            cellStyle10.DataFormat = HSSFDataFormat.GetBuiltinFormat("");
            cellStyle10.SetFont(font);
            cell10.CellStyle = cellStyle10;
            cell10.SetCellValue("");
 
            HSSFCell cell11 = (HSSFCell)Sheet1.CreateRow(1).CreateCell(10);
            HSSFCellStyle cellStyle11 = (HSSFCellStyle)hssfworkbook.CreateCellStyle();
            cellStyle11.DataFormat = HSSFDataFormat.GetBuiltinFormat("");
            cellStyle11.SetFont(font);
            cell11.CellStyle = cellStyle11;
            cell11.SetCellValue("");
 
 
            HSSFCell cell12 = (HSSFCell)Sheet1.CreateRow(1).CreateCell(11);
            HSSFCellStyle cellStyle12 = (HSSFCellStyle)hssfworkbook.CreateCellStyle();
            cellStyle12.DataFormat = HSSFDataFormat.GetBuiltinFormat("");
            cellStyle12.SetFont(font);
            cell12.CellStyle = cellStyle12;
            cell12.SetCellValue("");
 
 
            HSSFCell cell13 = (HSSFCell)Sheet1.CreateRow(1).CreateCell(12);
            HSSFCellStyle cellStyle13 = (HSSFCellStyle)hssfworkbook.CreateCellStyle();
            cellStyle13.DataFormat = HSSFDataFormat.GetBuiltinFormat("");
            cellStyle13.SetFont(font);
            cell13.CellStyle = cellStyle13;
            cell13.SetCellValue("");
 
            //8、创建单元格 加入数据
            HSSFRow r = (HSSFRow)Sheet1.CreateRow(1);//第二行 标题
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                r.CreateCell(i).SetCellValue(dt.Columns[i].ToString());
            }
            if (dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    HSSFRow row = (HSSFRow)Sheet1.CreateRow(i + 2);//写入行
                    for (int j = 0; j < dt.Columns.Count; j++)//写入列
                    {
                        if (dt.Columns[j].ColumnName == "balance")
                        {
                            row.CreateCell(j).CellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");
                            row.CreateCell(j).SetCellValue(Convert.ToDouble(dt.Rows[i][j].ToString()));
                        }
                        else
                        {
                            row.CreateCell(j).SetCellValue(dt.Rows[i][j].ToString());
                        }
                    }
                }
            }
            //9、求和 SUM函数
            HSSFCell cesum = (HSSFCell)Sheet1.CreateRow(Sheet1.LastRowNum + 1).CreateCell(5);//最后一行+1行等于总计行
            HSSFCell cebegin = (HSSFCell)Sheet1.GetRow(2).GetCell(5);//开始
            HSSFCell ceend = (HSSFCell)Sheet1.GetRow(Sheet1.LastRowNum - 1).GetCell(5);//结束
            cesum.SetCellFormula("sum(" + GetA_Z(5) + 3 + ":" + GetA_Z(5) + Sheet1.LastRowNum + ")");
            FileStream fs = new FileStream(Server.MapPath("~/ExportFiles/" + yeartime + "考勤信息.xls"), FileMode.Create);
            hssfworkbook.Write(fs);
            fs.Close();
            //Response.Write("导出完成");
            return View();  
            //return ;
        }
  
public string GetA_Z(double p)
         {
             string[] str = { "0:A", "1:B", "2:C", "3:D", "4:E", "5:F", "6:G", "7:H", "8:I", "9:J", "10:K", "11:L", "12:M", "13:N", "14:O", "15:P", "16:Q", "17:R", "18:S", "19:T", "20:U", "21:V", "22:W", "23:X", "24:Y", "25:Z" };
             for (int i = 0; i < str.Length; i++)
             {
                 if (p.ToString() == str[i].Split(':')[0].ToString())
                 {
                     return str[i].Split(':')[1].ToString();
                 }
             }
             return "";
         }
  由于实际项目中需要时间的条件限制。定义了一个返回值类型为string的time();


public String time()
        {
            string time = "";
            DateTime dt = DateTime.Now;
            int year = dt.Year;
            int month = dt.Month;
            if (1 < month && 10 > month)
            {
                time = year + "-";
                time += "0";
                time = time + Convert.ToString(month - 1);
            }
            if (month == 1)
            {
                year = dt.Year - 1;
                time = Convert.ToString(year) + "-";
                time += "12";
            }
            return time;
        }
  (4)在前台UI界面定义一个按钮,来实现点击触发控制器中的DaoChu();
<a href="#" id="daochu" class="easyui-linkbutton" data-options="iconCls:'icon-search'">导出数据</a>
  定义id="daochu"所触发的事件。

  $("#daochu").click(function () {
                getdaochu = "/Kaoqinsum/DaoChu";
          //提交执行控制器的方法
                initDataGrid("#dg", colums, getdaochu);
          //创建个返回值日期,用于导出时对时间的判断,导出对应月份的数据。
                var date = new Date();
                var year = date.getFullYear();
                var month = date.getMonth();
                var clock;
                if (0 < month < 10) {
                    clock = year + "-";
                    clock += "0";
                    clock += month;
                }
                if (month == 0) {
                    year = date.getFullYear() - 1;
                    clock = year + "-";
                    clock += "12";
                }
                if ($("#OnDutyTime").datebox('getValue') != "") {
                    geturl3 = "../ExportFiles/" + $("#OnDutyTime").datebox('getValue') + "考勤信息.xls"; ;
                    window.open(geturl3);
                }
                if ($("#OnDutyTime").datebox('getValue') == "") {
                    geturl2 = "../ExportFiles/" + clock + "考勤信息.xls";
                    window.open(geturl2);
                }
            })
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值