MVC实现datatable导出到excel

由于使用后台分页,所以datatables的导出excel只能导出当前页,所以只好重新写一个导出方法 

html代码
<div class="btn btn-primary" onclick="download()">下载</div>

 

js 代码 
   function download() {
        var EquipmentNo = $("#txtEquipmentNo").val();
        var OrganizationID = $("#txtOrganizationID").val();

             $.ajax({
                    type: 'POST',
                    url: '@Url.Action("GetMultiGNDFile")',
                            //contentType: "application/json; charset=utf-8",
                    data: {
                        OrganizationID: OrganizationID,
                        EquipmentNo: EquipmentNo,
                        dateFrom: dateFrom,
                        dateTo: dateTo,
                        StartIndex: 1,
                        PageSize: 100000,//最大只能是10万行
                    },
                    async: false,
                    success: function (result) { 
                            console.log(result);

                            window.location = '/DataAnalysis/Download?fileName=' + result;
  

                    },
                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                        //$.dialog.alert("查询失败");
                        //$wrapper.spinModal(false);
                    }

             });
 
    }

 

controller层
   
     public ActionResult Download(string fileName)
        { 
            return File(fileName, "application/vnd.ms-excel", "welcome.xlsx");
        }

        [HttpPost]
        public JsonResult GetMultiGNDFile(QueryModels qm)
        { 

            string ExcelFileName = Server.MapPath("~/WorkFolder/Excel/") + Guid.NewGuid().ToString() + ".xlsx";

            try
            { 
                DataSet ds = com.aaa.DAL.DataAnalysis.MultiGND.GetMultiGND1(qm);

                ExcelHelper.DataTableToExcel(ExcelFileName, ds.Tables[0], "sheet", true);

                return Json(ExcelFileName);
            }
            catch (Exception ex)
            { 
                return Json(ExcelFileName);
            }
        }
数据查询代码
     
       public static DataSet GetMultiGND1(QueryModels qm)
            {
                string sqlstr = @"select  EquipmentNo,Status,ROUND(StandResistance,2) AS StandResistance ,
                                          ROUND(Resistance1,2) AS Resistance1,ROUND(Resistance2,2) AS Resistance2,
                                          ROUND(Resistance3,2) AS Resistance3,ROUND(Resistance4,2) AS Resistance4,
                                          ROUND(Resistance5,2) AS Resistance5,ROUND(Resistance6,2) AS Resistance6,
                                          ROUND(Resistance7,2) AS Resistance7,ROUND(Resistance8,2) AS Resistance8,  CreateDate
                                    from multignd
                                        where EquipmentNo LIKE @EquipmentNo and CreateDate between @dateFrom and @dateTo AND
                                              EquipmentNo IN (SELECT EquipmentNo FROM equipment WHERE  EquipmentType='MultiGND' AND OrganizationID LIKE @OrganizationID )
                                    LIMIT @StartIndex,@PageSize;
                                select  count(1) as Total
                                    from multignd
                                        where EquipmentNo LIKE @EquipmentNo and CreateDate between @dateFrom and @dateTo AND
                                              EquipmentNo IN (SELECT EquipmentNo FROM equipment WHERE  EquipmentType='MultiGND' AND OrganizationID LIKE @OrganizationID );";

                MySqlParameter[] sqlParameter =  { 
                    new MySqlParameter("EquipmentNo",qm.EquipmentNo+"%"),
                    new MySqlParameter("dateFrom",qm.dateFrom),
                    new MySqlParameter("dateTo",qm.dateTo),
                    new MySqlParameter("OrganizationID",qm.OrganizationID+"%"),
                    new MySqlParameter("StartIndex",qm.StartIndex),
                    new MySqlParameter("PageSize",qm.PageSize),
            };

                DataSet ds = MySqlHelper_.ExecuteDataSet(sqlstr, sqlParameter);

                return ds;
            }

 

 

datatable导出excel代码

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

namespace com.aaa.Helper.NPOIExcel
{
    /// <summary>
    /// Excel文件和DataTable之间转换帮助类
    /// </summary>
    public class ExcelHelper : IDisposable
    {

        /// <summary>
        /// 把DataTable的数据写入到指定的excel文件中
        /// </summary>
        /// <param name="TargetFileNamePath">目标文件excel的路径</param>
        /// <param name="sourceData">要写入的数据</param>
        /// <param name="sheetName">excel表中的sheet的名称,可以根据情况自己起</param>
        /// <param name="IsWriteColumnName">是否写入DataTable的列名称</param>
        /// <returns>返回写入的行数</returns>
        public static int DataTableToExcel(string TargetFileNamePath, DataTable sourceData, string sheetName, bool IsWriteColumnName)
        {

            //数据验证
            //if (!File.Exists(TargetFileNamePath))
            //{
            //    //excel文件的路径不存在
            //    throw new ArgumentException("excel文件的路径不存在或者excel文件没有创建好");
            //}
            if (sourceData == null)
            {
                throw new ArgumentException("要写入的DataTable不能为空");
            }

            if (sheetName == null && sheetName.Length == 0)
            {
                throw new ArgumentException("excel中的sheet名称不能为空或者不能为空字符串");
            }



            //根据Excel文件的后缀名创建对应的workbook
            IWorkbook workbook = null;
            if (TargetFileNamePath.IndexOf(".xlsx") > 0)
            {  //2007版本的excel
                workbook = new XSSFWorkbook();
            }
            else if (TargetFileNamePath.IndexOf(".xls") > 0) //2003版本的excel
            {
                workbook = new HSSFWorkbook();
            }
            else
            {
                return -1;    //都不匹配或者传入的文件根本就不是excel文件,直接返回
            }



            //excel表的sheet名
            ISheet sheet = workbook.CreateSheet(sheetName);
            if (sheet == null) return -1;   //无法创建sheet,则直接返回


            //写入Excel的行数
            int WriteRowCount = 0;



            //指明需要写入列名,则写入DataTable的列名,第一行写入列名
            if (IsWriteColumnName)
            {
                //sheet表创建新的一行,即第一行
                IRow ColumnNameRow = sheet.CreateRow(0); //0下标代表第一行
                //进行写入DataTable的列名
                for (int colunmNameIndex = 0; colunmNameIndex < sourceData.Columns.Count; colunmNameIndex++)
                {
                    ColumnNameRow.CreateCell(colunmNameIndex).SetCellValue(sourceData.Columns[colunmNameIndex].ColumnName);
                }
                WriteRowCount++;
            }


            //写入数据
            for (int row = 0; row < sourceData.Rows.Count; row++)
            {
                //sheet表创建新的一行
                IRow newRow = sheet.CreateRow(WriteRowCount);
                for (int column = 0; column < sourceData.Columns.Count; column++)
                {

                    newRow.CreateCell(column).SetCellValue(sourceData.Rows[row][column].ToString());

                }

                WriteRowCount++;  //写入下一行
            }


            //写入到excel中
            FileStream fs = new FileStream(TargetFileNamePath, FileMode.OpenOrCreate, FileAccess.Write);
            workbook.Write(fs);

            fs.Flush();
            fs.Close();

            workbook.Close();
            return WriteRowCount;
        }





        /// <summary>
        /// 从Excel中读入数据到DataTable中
        /// </summary>
        /// <param name="sourceFileNamePath">Excel文件的路径</param>
        /// <param name="sheetName">excel文件中工作表名称</param>
        /// <param name="IsHasColumnName">文件是否有列名</param>
        /// <returns>从Excel读取到数据的DataTable结果集</returns>
        public static DataTable ExcelToDataTable(string sourceFileNamePath, string sheetName, bool IsHasColumnName)
        {

            if (!File.Exists(sourceFileNamePath))
            {
                throw new ArgumentException("excel文件的路径不存在或者excel文件没有创建好");
            }

            if (sheetName == null || sheetName.Length == 0)
            {
                throw new ArgumentException("工作表sheet的名称不能为空");
            }

            //根据Excel文件的后缀名创建对应的workbook
            IWorkbook workbook = null;
            //打开文件
            FileStream fs = new FileStream(sourceFileNamePath, FileMode.Open, FileAccess.Read);
            if (sourceFileNamePath.IndexOf(".xlsx") > 0)
            {  //2007版本的excel
                workbook = new XSSFWorkbook(fs);
            }
            else if (sourceFileNamePath.IndexOf(".xls") > 0) //2003版本的excel
            {
                workbook = new HSSFWorkbook(fs);
            }
            else
            {
                return null;    //都不匹配或者传入的文件根本就不是excel文件,直接返回
            }




            //获取工作表sheet
            ISheet sheet = workbook.GetSheet(sheetName);
            //获取不到,直接返回
            if (sheet == null) return null;



            //开始读取的行号
            int StartReadRow = 0;
            DataTable targetTable = new DataTable();



            //表中有列名,则为DataTable添加列名
            if (IsHasColumnName)
            {
                //获取要读取的工作表的第一行
                IRow columnNameRow = sheet.GetRow(0);   //0代表第一行
                                                        //获取该行的列数(即该行的长度)
                int CellLength = columnNameRow.LastCellNum;

                //遍历读取
                for (int columnNameIndex = 0; columnNameIndex < CellLength; columnNameIndex++)
                {
                    //不为空,则读入
                    if (columnNameRow.GetCell(columnNameIndex) != null)
                    {
                        //获取该单元格的值
                        string cellValue = columnNameRow.GetCell(columnNameIndex).StringCellValue;
                        if (cellValue != null)
                        {
                            //为DataTable添加列名
                            targetTable.Columns.Add(new DataColumn(cellValue));
                        }
                    }
                }

                StartReadRow++;
            }



            ///开始读取sheet表中的数据

            //获取sheet文件中的行数
            int RowLength = sheet.LastRowNum;
            //遍历一行一行地读入
            for (int RowIndex = StartReadRow; RowIndex < RowLength; RowIndex++)
            {
                //获取sheet表中对应下标的一行数据
                IRow currentRow = sheet.GetRow(RowIndex);   //RowIndex代表第RowIndex+1行

                if (currentRow == null) continue;  //表示当前行没有数据,则继续
                //获取第Row行中的列数,即Row行中的长度
                int currentColumnLength = currentRow.LastCellNum;

                //创建DataTable的数据行
                DataRow dataRow = targetTable.NewRow();
                //遍历读取数据
                for (int columnIndex = 0; columnIndex < currentColumnLength; columnIndex++)
                {
                    //没有数据的单元格默认为空
                    if (currentRow.GetCell(columnIndex) != null)
                    {
                        dataRow[columnIndex] = currentRow.GetCell(columnIndex);
                    }
                }
                //把DataTable的数据行添加到DataTable中
                targetTable.Rows.Add(dataRow);
            }


            //释放资源
            fs.Close();
            workbook.Close();

            return targetTable;
        }


        #region IDisposable 成员

        public void Dispose()
        {

        }

        #endregion
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值