NPOI导入导出Excel

 

  下面的这个例子呢,是直接使用NPOI导出的,但是在.Net MVC 项目里面,我们往往需要通过前端调用后端的方法来导出Excel,这个时候一般回出现一个问题:

就是哪里都不报错,但是无法下载Excel   出现这种问题的原因是因为你使用了ajax来调用方法,ajax不能调用下载功能的方法,所以替换成location吧

前端:

$("#btnEcxel").click(function () {

            var postData = $('#tbVehicleList').datagrid('getData');     
            var datas= { 
                
                json: JSON.stringify(postData),
                time: $("#StartTime").datebox('getValue') + "~" + $("#EndTime").datebox('getValue')
            
            };
            location.href = "/Home/Export?json=" + datas.json + "&time=" + datas.time + "";

           
        });

 

 

 

  上次写了一篇C#导出Excel的文章,用的是Office组件,现在介绍一个很好用的方式,NPOI导出Excel,参考的这篇文章

NPOI的方式,要求你得用浏览器导出,所以控制台之类的就不能用了,下面新建一个MVC项目

 

  public class HomeController : Controller
    {
        //
        // GET: /Home/

        public FileResult Index()
        {
            DataTable table = CreatTable();

         MemoryStream ms = CreateSheet("蜀云泉", table);
        ms.Seek(0,SeekOrigin.Begin);
        return File(ms, "application/ms-excel", "蜀云泉.xls");

        }
        /// <summary>
        /// 创建工作簿
        /// </summary>
        /// <param name="fileName">下载文件名</param>
        /// <param name="dt">数据源</param>
        public static MemoryStream CreateSheet(string fileName, DataTable dt)
        {
            HSSFWorkbook workbook = new HSSFWorkbook();
            MemoryStream ms = new MemoryStream();

            //创建一个名称为Payment的工作表
            ISheet paymentSheet = workbook.CreateSheet("Payment");

            //数据源
            DataTable tbPayment = dt;

            //头部标题
            IRow paymentHeaderRow = paymentSheet.CreateRow(0);

            //循环添加标题
            foreach (DataColumn column in tbPayment.Columns)
                paymentHeaderRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);

            // 内容
            int paymentRowIndex = 1;

            foreach (DataRow row in tbPayment.Rows)
            {
                IRow newRow = paymentSheet.CreateRow(paymentRowIndex);

                //循环添加列的对应内容
                foreach (DataColumn column in tbPayment.Columns)
                {
                    newRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
                }

                paymentRowIndex++;
            }

            //列宽自适应,只对英文和数字有效
            for (int i = 0; i <= dt.Rows.Count; i++)
            {
                paymentSheet.AutoSizeColumn(i);
            }
            //获取当前列的宽度,然后对比本列的长度,取最大值
            for (int columnNum = 0; columnNum <= dt.Columns.Count; columnNum++)
            {
                int columnWidth = paymentSheet.GetColumnWidth(columnNum) / 256;
                for (int rowNum = 1; rowNum <= paymentSheet.LastRowNum; rowNum++)
                {
                    IRow currentRow;
                    //当前行未被使用过
                    if (paymentSheet.GetRow(rowNum) == null)
                    {
                        currentRow = paymentSheet.CreateRow(rowNum);
                    }
                    else
                    {
                        currentRow = paymentSheet.GetRow(rowNum);
                    }

                    if (currentRow.GetCell(columnNum) != null)
                    {
                        ICell currentCell = currentRow.GetCell(columnNum);
                        int length = Encoding.Default.GetBytes(currentCell.ToString()).Length;
                        if (columnWidth < length)
                        {
                            columnWidth = length;
                        }
                    }
                }
                paymentSheet.SetColumnWidth(columnNum, columnWidth * 256);
            }

            //将表内容写入流 通知浏览器下载
            workbook.Write(ms);
       ms.flush();
       return ms;
} /// <summary> /// 虚拟 DataTable内容 /// </summary> /// <returns></returns> public static DataTable CreatTable() { //创建DataTable 将数据库中没有的数据放到这个DT中 DataTable datatable = new DataTable(); datatable.Columns.Add("列1", typeof(string)); datatable.Columns.Add("列2", typeof(string)); datatable.Columns.Add("列3", typeof(string)); //创建DatatTable 结束--------------------------- //开始给临时datatable赋值 for (int i = 0; i < 10; i++) { DataRow row = datatable.NewRow(); row["列1"] = "车牌号"; row["列2"] = "里程数"; row["列3"] = "哈哈哈"; datatable.Rows.Add(row); } return datatable; } }

  

  NPOI写入Excel参考这篇文章 ,不过我稍微做了些修改。

 

posted @ 2018-03-26 10:48  蜀云泉  阅读(488)  评论(0编辑  收藏  举报