使用npoi插件将excel文件导出

大致流程:前端使用URL地址的方式跳转到action后返回file类型数据

js:

 window.location.href = '/Home/index?Id=' + id

 后台代码:

/// <summary>
        /// 导出对比结果
        /// </summary>
        /// <param name="quarter"></param>
        /// <returns></returns>
        public FileResult index(int Id)
        {
            try
            {
                var list = 可以根据传入参数查找到数据库中需要导出的数据列表

                //创建Excel文件的对象
                NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
                //创建样式
                var style = book.CreateCellStyle();
                //单元格样式:水平对齐居中
                style.Alignment = HorizontalAlignment.Center;
                //字体样式
                var font=book.CreateFont();
                //加粗
                font.Boldweight=short.MaxValue;
                //字体样式加入到单元格样式里面
                style.SetFont(font);

                //添加一个sheet
                NPOI.SS.UserModel.ISheet sheet1 = book.CreateSheet("Sheet1");
                var titleCell = sheet1.AddMergedRegion(new CellRangeAddress(0, 2, 0, 3));
                var row = sheet1.CreateRow(0);
                row.CreateCell(0).SetCellValue("签到标题:" + title + " 反馈进度:" + feedBackProgress);
                //标题的样式设置
                row.CreateCell(0).CellStyle = style;
                //给sheet1添加第一行的头部标题
                NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(3);

                row1.CreateCell(0).SetCellValue("姓名");
                row1.CreateCell(1).SetCellValue("性别");
                row1.CreateCell(2).SetCellValue("年龄");
                //将数据逐步写入sheet1各个行

                for (int i = 0; i < list.Count; i++)
                {
                    NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 4);
                    rowtemp.CreateCell(0).SetCellValue(list[i].name);
                    rowtemp.CreateCell(1).SetCellValue(list[i].sex);//如果是时间字段需要tostring确定格式,否则导出到数据库的时候会变成一个小数的数字
                    rowtemp.CreateCell(2).SetCellValue(list[i].age);
                }
                // 写入到客户端 
                System.IO.MemoryStream ms = new System.IO.MemoryStream();
                book.Write(ms);
                ms.Seek(0, SeekOrigin.Begin);
                return File(ms, "application/vnd.ms-excel", string.Format("你的excel-{0}.xls", DateTime.Now.ToString("yyyyMMddhhmmss")));
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message + ex.StackTrace);
                return null;
            }
        }

 上述代码存在一个错误,就是导出的excel合并行的标题不见了,经过研究发现,要写成如下形式:

//添加一个sheet
                ISheet sheet1 = book.CreateSheet("Sheet1");
                sheet1.AddMergedRegion(new CellRangeAddress(0, 2, 0, 3));
                
                var row = sheet1.CreateRow(0);
                //标题的样式设置
                var titleRow = row.CreateCell(0);
                //创建样式
                var style = book.CreateCellStyle();
                //单元格样式:水平对齐居中
                style.Alignment = HorizontalAlignment.Center;
                //字体样式
                var font = book.CreateFont();
                //加粗
                font.Boldweight = short.MaxValue;
                //字体样式加入到单元格样式里面
                style.SetFont(font);
                titleRow.CellStyle = style;
                row.CreateCell(0).CellStyle = style;
                titleRow.SetCellValue("签到标题:" + title + " 反馈进度:" + feedBackProgress);

 

这里首先是

row.CreateCell(0)在设置的时候要统一用一个变量去设置,第二点就是
          titleRow.CellStyle = style;
          row.CreateCell(0).CellStyle = style;
先设置样式。再设置值,如果顺序颠倒也会出现比如字体不对或者不显示的问题.
另外,合并单元格方法的四个参数解释如下:
//CellRangeAddress四个参数为:起始行,结束行,起始列,结束列
 
posted @ 2019-03-22 15:44  洛晨随风  阅读(240)  评论(0编辑  收藏  举报