zoukankan      html  css  js  c++  java
  • 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参考这篇文章 ,不过我稍微做了些修改。

  • 相关阅读:
    hibernate中对象的3种状态:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)
    object references an unsaved transient instance
    前端JS利用canvas的drawImage()对图片进行压缩
    js获取上传图片的尺寸大小
    多线程经典问题1——主线程子线程交替问题
    hdu 1689 Alien’s Necklace (bfs层次图剪枝)
    新炬数据库大师—暑期公益体验课
    怎样高速地安装Ubuntu SDK
    Spring boot 整合spring Data JPA+Spring Security+Thymeleaf框架(上)
    iOS 合并.a文件,制作通用静态库
  • 原文地址:https://www.cnblogs.com/yunquan/p/8649451.html
Copyright © 2011-2022 走看看