NPOI 导出excel

/// <summary>
    /// NPOI导出Excel
    /// </summary>
    /// <param name="dt">数据</param>
    /// <param name="title">文件名称</param>
    /// <param name="loadWhere">导出条件</param>
    /// <param name="type">类别(是否需要合计)type=-1不需要合计</param>
    public void NpoiExcel(DataTable dt, string title, string loadWhere, int type, string fileName = "")
    {
        NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();

        var sheet1 = book.CreateSheet(title);
        int dtRows = dt.Rows.Count;
        int dtColums = dt.Columns.Count;

        //1.标题合并单元格
        sheet1.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dtColums - 1));
        var row0 = sheet1.CreateRow(0);
        row0.HeightInPoints = 30;
        var cell0 = row0.CreateCell(0);
        cell0.SetCellValue(title);
        var style0 = book.CreateCellStyle();
        style0.Alignment = HorizontalAlignment.Center;//水平居中 
        style0.VerticalAlignment = VerticalAlignment.Center;//垂直居中 
        style0.WrapText = true;//自动换行
        var font0 = book.CreateFont();
        font0.Boldweight = 700;
        font0.FontHeightInPoints = 16;
        style0.SetFont(font0);
        cell0.CellStyle = style0;

        //2.导出条件合并单元格
        sheet1.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(1, 1, 0, dtColums - 1));
        var row1 = sheet1.CreateRow(1);
        row1.HeightInPoints = 20;
        var cell1 = row1.CreateCell(0);
        cell1.SetCellValue(loadWhere);

        //3.列名样式
        var style2 = book.CreateCellStyle();
        style2.Alignment = HorizontalAlignment.Center;//水平居中 
        style2.VerticalAlignment = VerticalAlignment.Center;//垂直居中 
        style2.WrapText = true;//自动换行
        var font2 = book.CreateFont();
        font2.Boldweight = 700;
        font2.FontHeightInPoints = 10;
        style2.SetFont(font2);
        style2.BottomBorderColor = IndexedColors.Black.Index;
        style2.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
        style2.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
        style2.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
        style2.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
        style2.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
        style2.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
        style2.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index;
        style2.FillPattern = NPOI.SS.UserModel.FillPattern.SolidForeground;

        //列名
        var row = sheet1.CreateRow(2);
        row.HeightInPoints = 20;
        for (int i = 0; i < dtColums; i++)
        {
            var cellCo = row.CreateCell(i);
            cellCo.CellStyle = style2;
            cellCo.SetCellValue(dt.Columns[i].ColumnName);
        }

        //4.行内容样式
        var style3 = book.CreateCellStyle();
        var styleInt = book.CreateCellStyle();
        var styleDecimal = book.CreateCellStyle();

        style3.WrapText = true;
        styleInt.DataFormat = 0;
        style3.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
        style3.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
        style3.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
        style3.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
        style3.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
        style3.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
        style3.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.White.Index;
        style3.FillPattern = NPOI.SS.UserModel.FillPattern.SolidForeground;

        styleInt.CloneStyleFrom(style3);
        styleInt.Alignment = HorizontalAlignment.Right;
        var test = NPOI.HSSF.UserModel.HSSFDataFormat.GetBuiltinFormats();
        styleInt.DataFormat = 38;
        styleDecimal.CloneStyleFrom(style3);
        styleDecimal.Alignment = HorizontalAlignment.Right;
        styleDecimal.DataFormat = 40;

        //
        for (int i = 0; i < dtRows; i++)
        {
            var rowtemp = sheet1.CreateRow(i + 3);
            rowtemp.HeightInPoints = 20;
            for (int a = 0; a < dtColums; a++)
            {
                var cellCo = rowtemp.CreateCell(a);
                if (dt.Columns[a].DataType == typeof(string) || dt.Columns[a].DataType == typeof(DateTime))
                {
                    cellCo.SetCellValue(Convert.ToString(dt.Rows[i][a]));
                    cellCo.CellStyle = style3;
                }
                else if (dt.Columns[a].DataType == typeof(decimal) || dt.Columns[a].DataType == typeof(float) || dt.Columns[a].DataType == typeof(double))
                {
                    cellCo.CellStyle = styleDecimal;
                    if (dt.Rows[i][a] != DBNull.Value)
                    {
                        cellCo.SetCellValue(Convert.ToDouble(dt.Rows[i][a]));
                    }
                }
                else // int
                {
                    cellCo.CellStyle = styleInt;
                    if (dt.Rows[i][a] != DBNull.Value)
                    {
                        cellCo.SetCellValue(Convert.ToDouble(dt.Rows[i][a]));
                    }
                }
            }
        }

        //合计行以及备注信息,type=-1时,不计算合计行
        if (type >= 0)
        {
            var rowFooter = sheet1.CreateRow(dtRows + 3);
            rowFooter.HeightInPoints = 20;
            var cellCo = rowFooter.CreateCell(0);
            cellCo.CellStyle = style3;
            cellCo.SetCellValue("合计");
            for (int i = 1; i < dtColums; i++)
            {
                if (i < type)
                {
                    cellCo = rowFooter.CreateCell(i);
                    cellCo.CellStyle = style3;
                }
                else
                {
                    cellCo = rowFooter.CreateCell(i);
                    if (dt.Rows.Count > 0)
                    {
                        cellCo.SetCellFormula(string.Format("SUM({0}:{1})", GetExcelColumnName(i) + 4, GetExcelColumnName(i) + (dt.Rows.Count + 3)));
                        if (dt.Columns[i].DataType == typeof(decimal) || dt.Columns[i].DataType == typeof(float) || dt.Columns[i].DataType == typeof(double))
                        {
                            cellCo.CellStyle = styleDecimal;
                        }
                        else // int
                        {
                            cellCo.CellStyle = styleInt;
                        }
                    }
                }
            }
        }
        this.AutoColumnWidth(sheet1, dtColums);

        // 写入到客户端 
        if (string.IsNullOrEmpty(fileName))
        {
            fileName = title + "(" + DateTime.Now.ToString("yyyy-MM-dd") + ")";
        }
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        book.Write(ms);
        System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode(fileName + ".xls", System.Text.Encoding.UTF8) + "\"");
        System.Web.HttpContext.Current.Response.BinaryWrite(ms.ToArray());
        System.Web.HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
        book = null;
        ms.Close();
        ms.Dispose();
    }

 

posted @ 2020-05-28 11:10  救赎之路其修远兮  阅读(268)  评论(0编辑  收藏  举报