使用Npoi导出excel封装的类

Npoi不需要安装excel软件就可以进行导出。
public class NpoiExcelExportHelper
{
private static NpoiExcelExportHelper _exportHelper;

    public static NpoiExcelExportHelper _
    {
        get => _exportHelper ?? (_exportHelper = new NpoiExcelExportHelper());
        set => _exportHelper = value;
    }

    /// <summary>
    /// TODO:先创建行,然后在创建对应的列
    /// 创建Excel中指定的行
    /// </summary>
    /// <param name="sheet">Excel工作表对象</param>
    /// <param name="rowNum">创建第几行(从0开始)</param>
    /// <param name="rowHeight">行高</param>
    public HSSFRow CreateRow(ISheet sheet, int rowNum, float rowHeight)
    {
        HSSFRow row = (HSSFRow)sheet.CreateRow(rowNum); //创建行
        row.HeightInPoints = rowHeight; //设置列头行高
        return row;
    }

    /// <summary>
    /// 创建行内指定的单元格
    /// </summary>
    /// <param name="row">需要创建单元格的行</param>
    /// <param name="cellStyle">单元格样式</param>
    /// <param name="cellNum">创建第几个单元格(从0开始)</param>
    /// <param name="cellValue">给单元格赋值</param>
    /// <returns></returns>
    public HSSFCell CreateCells(HSSFRow row, HSSFCellStyle cellStyle, int cellNum, string cellValue)
    {
        HSSFCell cell = (HSSFCell)row.CreateCell(cellNum); //创建单元格
        cell.CellStyle = cellStyle; //将样式绑定到单元格
        if (!string.IsNullOrWhiteSpace(cellValue))
        {
            //单元格赋值
            cell.SetCellValue(cellValue);
        }

        return cell;
    }


    /// <summary>
    /// 行内单元格常用样式设置
    /// </summary>
    /// <param name="workbook">Excel文件对象</param>
    /// <param name="hAlignment">水平布局方式</param>
    /// <param name="vAlignment">垂直布局方式</param>
    /// <param name="fontHeightInPoints">字体大小</param>
    /// <param name="isAddBorder">是否需要边框</param>
    /// <param name="boldWeight">字体加粗 (None = 0,Normal = 400,Bold = 700</param>
    /// <param name="fontName">字体(仿宋,楷体,宋体,微软雅黑...与Excel主题字体相对应)</param>
    /// <param name="isAddBorderColor">是否增加边框颜色</param>
    /// <param name="isItalic">是否将文字变为斜体</param>
    /// <param name="isLineFeed">是否自动换行</param>
    /// <param name="isAddCellBackground">是否增加单元格背景颜色</param>
    /// <param name="fillPattern">填充图案样式(FineDots 细点,SolidForeground立体前景,isAddFillPattern=true时存在)</param>
    /// <param name="cellBackgroundColor">单元格背景颜色(当isAddCellBackground=true时存在)</param>
    /// <param name="fontColor">字体颜色</param>
    /// <param name="underlineStyle">下划线样式(无下划线[None],单下划线[Single],双下划线[Double],会计用单下划线[SingleAccounting],会计用双下划线[DoubleAccounting])</param>
    /// <param name="typeOffset">字体上标下标(普通默认值[None],上标[Sub],下标[Super]),即字体在单元格内的上下偏移量</param>
    /// <param name="isStrikeout">是否显示删除线</param>
    /// <returns></returns>
    public static HSSFCellStyle CreateStyle(HSSFWorkbook workbook, HorizontalAlignment hAlignment, VerticalAlignment vAlignment, short fontHeightInPoints, bool isAddBorder, short boldWeight, string fontName = "宋体", bool isAddBorderColor = true, bool isItalic = false, bool isLineFeed = false, bool isAddCellBackground = false, FillPattern fillPattern = FillPattern.NoFill, short cellBackgroundColor = HSSFColor.Yellow.Index, short fontColor = HSSFColor.Black.Index, FontUnderlineType underlineStyle =
        FontUnderlineType.None, FontSuperScript typeOffset = FontSuperScript.None, bool isStrikeout = false)
    {
        HSSFCellStyle cellStyle = (HSSFCellStyle)workbook.CreateCellStyle(); //创建列头单元格实例样式
        cellStyle.Alignment = hAlignment; //水平居中
        cellStyle.VerticalAlignment = vAlignment; //垂直居中
        cellStyle.WrapText = isLineFeed;//自动换行

        //背景颜色,边框颜色,字体颜色都是使用 HSSFColor属性中的对应调色板索引,关于 HSSFColor 颜色索引对照表,详情参考:https://www.cnblogs.com/Brainpan/p/5804167.html

        //TODO:引用了NPOI后可通过ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置,FillPattern 为单元格背景色的填充样式

        //TODO:十分注意,要设置单元格背景色必须是FillForegroundColor和FillPattern两个属性同时设置,否则是不会显示背景颜色
        if (isAddCellBackground)
        {
            cellStyle.FillForegroundColor = cellBackgroundColor;//单元格背景颜色
            cellStyle.FillPattern = fillPattern;//填充图案样式(FineDots 细点,SolidForeground立体前景)
        }


        //是否增加边框
        if (isAddBorder)
        {
            //常用的边框样式 None(没有),Thin(细边框,瘦的),Medium(中等),Dashed(虚线),Dotted(星罗棋布的),Thick(厚的),Double(双倍),Hair(头发)[上右下左顺序设置]
            cellStyle.BorderBottom = BorderStyle.Thin;
            cellStyle.BorderRight = BorderStyle.Thin;
            cellStyle.BorderTop = BorderStyle.Thin;
            cellStyle.BorderLeft = BorderStyle.Thin;
        }

        //是否设置边框颜色
        if (isAddBorderColor)
        {
            //边框颜色[上右下左顺序设置]
            cellStyle.TopBorderColor = HSSFColor.DarkGreen.Index;//DarkGreen(黑绿色)
            cellStyle.RightBorderColor = HSSFColor.DarkGreen.Index;
            cellStyle.BottomBorderColor = HSSFColor.DarkGreen.Index;
            cellStyle.LeftBorderColor = HSSFColor.DarkGreen.Index;
        }

        /**
         * 设置相关字体样式
         */
        var cellStyleFont = (HSSFFont)workbook.CreateFont(); //创建字体

        //假如字体大小只需要是粗体的话直接使用下面该属性即可
        //cellStyleFont.IsBold = true;

        cellStyleFont.Boldweight = boldWeight; //字体加粗
        cellStyleFont.FontHeightInPoints = fontHeightInPoints; //字体大小
        cellStyleFont.FontName = fontName;//字体(仿宋,楷体,宋体 )
        cellStyleFont.Color = fontColor;//设置字体颜色
        cellStyleFont.IsItalic = isItalic;//是否将文字变为斜体
        cellStyleFont.Underline = underlineStyle;//字体下划线
        cellStyleFont.TypeOffset = typeOffset;//字体上标下标
        cellStyleFont.IsStrikeout = isStrikeout;//是否有删除线

        cellStyle.SetFont(cellStyleFont); //将字体绑定到样式
        return cellStyle;
    }


    public static void SaveDataExport<T>(List<T> loginfos,List<String> columns,string excelName, string SavePath )
    {
        try
        {
            if (loginfos == null)
            {
                Console.WriteLine("导出数据不能为空");
                return;
            }

            if (string.IsNullOrEmpty(excelName) || string.IsNullOrEmpty(SavePath))
            {
                Console.WriteLine("导出文件名或者保存路劲异常");
                return;
            }

            //首先创建Excel文件对象
            var workbook = new HSSFWorkbook();

            //创建工作表,也就是Excel中的sheet,给工作表赋一个名称(Excel底部名称)
            var sheet = workbook.CreateSheet("SHEET1");


            sheet.ForceFormulaRecalculation = true;//TODO:是否开始Excel导出后公式仍然有效(非必须)

            #region table 表格内容设置

            #region 标题样式

            //标题列样式设置
            var headTopStyle =  CreateStyle(workbook, HorizontalAlignment.Center, VerticalAlignment.Center, 15, true, 700, "楷体", true, false, false, true, FillPattern.SolidForeground, HSSFColor.Grey25Percent.Index, HSSFColor.Black.Index,
            FontUnderlineType.None, FontSuperScript.None, false);

            //表头名称
            var headerName = columns.ToArray();

            var row = NpoiExcelExportHelper._.CreateRow(sheet, 0, 24);//第二行
            var cell = row.CreateCell(0);
            for (var i = 0; i < headerName.Length; i++)
            {
                cell = NpoiExcelExportHelper._.CreateCells(row, headTopStyle, i, headerName[i]);
            }
            #endregion


            #region 单元格内容信息

            //单元格边框样式
            var cellStyle =  CreateStyle(workbook, HorizontalAlignment.Center, VerticalAlignment.Center, 10, true, 400);

            for (var i = 0; i < loginfos.Count; i++)
            {
                row = NpoiExcelExportHelper._.CreateRow(sheet, i + 1, 20); //sheet.CreateRow(i+2);//在上面表头的基础上创建行

            
                //创建单元格列公众类课程
                //cell = NpoiExcelExportHelper._.CreateCells(row, cellStyle, 0, loginfos[i].Id);
                //cell = NpoiExcelExportHelper._.CreateCells(row, cellStyle, 1, loginfos[i].Documenttype);
                //cell = NpoiExcelExportHelper._.CreateCells(row, cellStyle, 2, loginfos[i].UniqueKey);
                //cell = NpoiExcelExportHelper._.CreateCells(row, cellStyle, 3, loginfos[i].MethodName);
                //cell = NpoiExcelExportHelper._.CreateCells(row, cellStyle, 4, loginfos[i].Date.ToString("yyyy-MM-dd"));
                //cell = NpoiExcelExportHelper._.CreateCells(row, cellStyle, 5, loginfos[i].Date.ToString("yyyy-MM"));
                //cell = NpoiExcelExportHelper._.CreateCells(row, cellStyle, 6, loginfos[i].Message);
                //cell = NpoiExcelExportHelper._.CreateCells(row, cellStyle, 7, loginfos[i].StackTrace);
            }
            #endregion

            #endregion

            string folder = DateTime.Now.ToString("yyyyMMdd");


            //excel保存文件名
            string excelFileName = excelName + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls";

            //创建目录文件夹
            if (!Directory.Exists(SavePath))
            {
                Directory.CreateDirectory(SavePath);
            }

            //Excel的路径及名称
            string excelPath = SavePath + excelFileName;

            //使用FileStream文件流来写入数据(传入参数为:文件所在路径,对文件的操作方式,对文件内数据的操作)
            var fileStream = new FileStream(excelPath, FileMode.OpenOrCreate, FileAccess.ReadWrite);

            //向Excel文件对象写入文件流,生成Excel文件
            workbook.Write(fileStream);

            //关闭文件流
            fileStream.Close();

            //释放流所占用的资源
            fileStream.Dispose();

        }
        catch (Exception e)
        {
        }
    }
}

设置多列为一列



//设置style
ICellStyle cellstyle = workbook.CreateCellStyle();
cellstyle.VerticalAlignment = VerticalAlignment.Center;
cellstyle.Alignment = HorizontalAlignment.Center;

//合并操作

sheet.AddMergedRegion(new CellRangeAddress(index["firstRow"], index["lastRow"], index["firstCol"], index["lastCol"]));//起始行,结束行,起始列,结束列

//设置合并后style
var cell = sheet.GetRow(index["firstRow"]).GetCell(index["firstCol"]);
cell.CellStyle = cellstyle;
在这里插入代码片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落叶@Henry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值