使用NPOI导出Excel模板

c#集成npoi根据excel模板导出excel 创建excel模板,替换其中的内容生成新的excel文件。NuGet中安装npoi。1、替换单个单元格内容;2、替换横向多个单元格;4、单元格中插入图片; 阅读详情

导出Excel包含的功能:

1.多表头导出最多支持到三行,表头格式说明

  • 相邻父列头之间用’#’分隔,父列头与子列头用空格(’ ‘)分隔,相邻子列头用逗号分隔(‘,’)

  • 两行:序号#分公司#组别#本日成功签约单数 预警,续约,流失,合计#累计成功签约单数 预警,续约,流失,合计#任务数#完成比例#排名

  • 三行:等级#级别#上期结存 件数,重量,比例#本期调入 收购调入 件数,重量,比例#本期发出 车间投料 件数,重量,比例#本期发出 产品外销百分比 件数,重量,比例#平均值

  • 三行时请注意:列头要重复

2.添加表头标题功能
3.添加序号功能
4.根据数据设置列宽


实体类

NPOIModel.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Web;

namespace NPOIDemo.Model
{
    /// <summary>
    /// 实体类
    /// </summary>
    public class NPOIModel
    {
        /// <summary>
        /// 数据源
        /// </summary>
        public DataTable dataSource { get; private set; }
        /// <summary>
        /// 要导出的数据列数组
        /// </summary>
        public string[] fileds { get; private set; }
        /// <summary>
        /// 工作薄名称数组
        /// </summary>
        public string sheetName { get; private set; }
        /// <summary>
        /// 表标题
        /// </summary>
        public string tableTitle { get; private set; }
        /// <summary>
        /// 表标题是否存在 1:存在 0:不存在
        /// </summary>
        public int isTitle { get; private set; }
        /// <summary>
        /// 是否添加序号
        /// </summary>
        public int isOrderby { get; private set; }
        /// <summary>
        /// 表头
        /// </summary>
        public string headerName { get; private set; }
        /// <summary>
        /// 取得列宽
        /// </summary>
        public int[] colWidths { get; private set; }
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="dataSource">数据来源 DataTable</param>
        /// <param name="filed">要导出的字段,如果为空或NULL,则默认全部</param> 
        /// <param name="sheetName">工作薄名称</param>
        /// <param name="headerName">表头名称 如果为空或NULL,则默认数据列字段
        /// 相邻父列头之间用'#'分隔,父列头与子列头用空格(' ')分隔,相邻子列头用逗号分隔(',')
        /// 两行:序号#分公司#组别#本日成功签约单数 预警,续约,流失,合计#累计成功签约单数 预警,续约,流失,合计#任务数#完成比例#排名 
        /// 三行:等级#级别#上期结存 件数,重量,比例#本期调入 收购调入 件数,重量,比例#本期发出 车间投料 件数,重量,比例#本期发出 产品外销百分比 件数,重量,比例#平均值 
        /// 三行时请注意:列头要重复
        /// </param>
        /// <param name="tableTitle">表标题</param> 
        /// <param name="isOrderby">是否添加序号 0:不添加 1:添加</param>
        public NPOIModel(DataTable dataSource, string filed, string sheetName, string headerName, string tableTitle = null, int isOrderby = 0)
        {
            if (!string.IsNullOrEmpty(filed))
            {
                this.fileds = filed.ToUpper().Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);

                // 移除多余数据列
                for (int i = dataSource.Columns.Count - 1; i >= 0; i--)
                {
                    DataColumn dc = dataSource.Columns[i];
                    if (!this.fileds.Contains(dataSource.Columns[i].Caption.ToUpper()))
                    {
                        dataSource.Columns.Remove(dataSource.Columns[i]);
                    }
                }

                // 列索引
                int colIndex = 0;
                // 循环排序
                for (int i = 0; i < dataSource.Columns.Count; i++)
                {
                    // 获取索引
                    colIndex = GetColIndex(dataSource.Columns[i].Caption.ToUpper());
                    // 设置下标
                    dataSource.Columns[i].SetOrdinal(colIndex);
                }
            }
            else
            {
                this.fileds = new string[dataSource.Columns.Count];
                for (int i = 0; i < dataSource.Columns.Count; i++)
                {
                    this.fileds[i] = dataSource.Columns[i].ColumnName;
                }
            }
            this.dataSource = dataSource;

            if (!string.IsNullOrEmpty(sheetName))
                this.sheetName = sheetName;

            if (!string.IsNullOrEmpty(headerName))
                this.headerName = headerName;
            else
                this.headerName = string.Join("#", this.fileds);

            if (!string.IsNullOrEmpty(tableTitle))
            {
                this.tableTitle = tableTitle;
                this.isTitle = 1;
            }

            // 取得数据列宽 数据列宽可以和表头列宽比较,采取最长宽度  
            colWidths = new int[this.dataSource.Columns.Count];
            foreach (DataColumn item in this.dataSource.Columns)
                colWidths[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
            // 循环比较最大宽度
            for (int i = 0; i < this.dataSource.Rows.Count; i++)
            {
                for (int j = 0; j < this.dataSource.Columns.Count; j++)
                {
                    int intTemp = Encoding.GetEncoding(936).GetBytes(this.dataSource.Rows[i][j].ToString()).Length;
                    if (intTemp > colWidths[j])
                        colWidths[j] = intTemp;
                }
            }

            if (isOrderby > 0)
            {
                this.isOrderby = isOrderby;
                this.headerName = "序号#" + this.headerName;
            }

        }

        /// <summary>
        /// 获取列名下标
        /// </summary>
        /// <param name="colName">列名称</param>
        /// <returns></returns>
        private int GetColIndex(string colName)
        {
            for (int i = 0; i < this.fileds.Length; i++)
            {
                if (colName == this.fileds[i])
                    return i;
            }
            return 0;
        }
    }
}

NPOIHeader.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace NPOIDemo.Model
{
    /// <summary>
    /// 表头构建类
    /// </summary>
    public class NPOIHeader
    {
        /// <summary>
        /// 表头
        /// </summary>
        public string headerName { get; set; }
        /// <summary>
        /// 起始行
        /// </summary>
        public int firstRow { get; set; }
        /// <summary>
        /// 结束行
        /// </summary>
        public int lastRow { get; set; }
        /// <summary>
        /// 起始列
        /// </summary>
        public int firstCol { get; set; }
        /// <summary>
        /// 结束列
        /// </summary>
        public int lastCol { get; set; }
        /// <summary>
        /// 是否跨行
        /// </summary>
        public int isRowSpan { get; private set; }
        /// <summary>
        /// 是否跨列
        /// </summary>
        public int isColSpan { get; private set; }
        /// <summary>
        /// 外加行
        /// </summary>
        public int rows { get; set; }

        public NPOIHeader() { }
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="headerName">表头</param>
        /// <param name="firstRow">起始行</param>
        /// <param name="lastRow">结束行</param>
        /// <param name="firstCol">起始列</param>
        /// <param name="lastCol">结束列</param>
        /// <param name="rows">外加行</param>
        /// <param name="cols">外加列</param>
        public NPOIHeader(string headerName, int firstRow, int lastRow, int firstCol, int lastCol, int rows = 0)
        {
            this.headerName = headerName;
            this.firstRow = firstRow;
            this.lastRow = lastRow;
            this.firstCol = firstCol;
            this.lastCol = lastCol;
            // 是否跨行判断
            if (firstRow != lastRow)
                isRowSpan = 1;
            if (firstCol != lastCol)
                isColSpan = 1;

            this.rows = rows;
        }
    }
}

NPOIHelper.cs辅助类

using System;
using System.Linq;
using System.Web;
using System.IO;
using NPOI;
using NPOI.SS.Util;
using NPOI.HSSF.Util;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using System.Data;
using System.Collections.Generic;
using System.Text;
using NPOIDemo.Model;

namespace NPOIDemo
{
    /// <summary>
    /// Excel导出
    /// </summary>
    public class NPOIHelper
    {
        #region 初始化
        /// <summary>
        /// 声明 HSSFWorkbook 对象
        /// </summary>
        private static HSSFWorkbook _workbook;
        /// <summary>
        /// 声明 HSSFSheet 对象
        /// </summary>
        private static HSSFSheet _sheet;
        #endregion

        /// <summary>
        /// Excel导出
        /// </summary>
        /// <param name="fileName">文件名称 如果为空或NULL,则默认“新建Excel.xls”</param>
        /// <param name="list"></param>
        /// <param name="method">导出方式 1:WEB导出(默认)2:按文件路径导出</param>
        /// <param name="filePath">文件路径 如果WEB导出,则可以为空;如果按文件路径导出,则默认桌面路径</param>
        public static void Export(string fileName, IList<NPOIModel> list, int method = 1, string filePath = null)
        {
            // 文件名称
            if (!string.IsNullOrEmpty(fileName))
            {
                if (fileName.IndexOf('.') == -1)
                    fileName += ".xls";
                else
                    fileName = fileName.Substring(1, fileName.IndexOf('.')) + ".xls";
            }
            else
                fileName = "新建Excel.xls";

            // 文件路径
            if (2 == method && string.IsNullOrEmpty(filePath))
                filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

            // 调用导出处理程序
            Export(list);

            // WEB导出
            if (1 == method)
            {
                System.Web.HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
                //设置下载的Excel文件名
                System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", fileName));

                using (MemoryStream ms = new MemoryStream())
                {
                    //将工作簿的内容放到内存流中
                    _workbook.Write(ms);
                    //将内存流转换成字节数组发送到客户端
                    System.Web.HttpContext.Current.Response.BinaryWrite(ms.GetBuffer());
                    System.Web.HttpContext.Current.Response.End();
                    _sheet = null;
                    _workbook = null;
                }
            }
            else if (2 == method)
            {
                using (FileStream fs = File.Open(filePath, FileMode.Append))
                {
                    _workbook.Write(fs);
                    _sheet = null;
                    _workbook = null;
                }
            }
        }

        /// <summary>
        /// 导出方法实现
        /// </summary>
        /// <param name="list"></param>
        private static void Export(IList<NPOIModel> list)
        {
            #region 变量声明
            // 初始化
            _workbook = new HSSFWorkbook();
            // 声明 Row 对象
            IRow _row;
            // 声明 Cell 对象
            ICell _cell;
            // 总列数
            int cols = 0;
            // 总行数
            int rows = 0;
            // 行数计数器
            int rowIndex = 0;
            // 单元格值
            string drValue = null;
            #endregion

            foreach (NPOIModel model in list)
            {
                // 工作薄命名
                if (model.sheetName != null)
                    _sheet = (HSSFSheet)_workbook.CreateSheet(model.sheetName);
                else
                    _sheet = (HSSFSheet)_workbook.CreateSheet();

                // 获取数据源
                DataTable dt = model.dataSource;
                // 初始化
                rowIndex = 0;
                // 获取总行数
                rows = GetRowCount(model.headerName);
                // 获取总列数
                cols = GetColCount(model.headerName);

                // 循环行数
                foreach (DataRow row in dt.Rows)
                {
                    #region 新建表,填充表头,填充列头,样式
                    if (rowIndex == 65535 || rowIndex == 0)
                    {
                        if (rowIndex != 0)
                            _sheet = (HSSFSheet)_workbook.CreateSheet();

                        // 构建行
                        for (int i = 0; i < rows + model.isTitle; i++)
                        {
                            _row = _sheet.GetRow(i);
                            // 创建行
                            if (_row == null)
                                _row = _sheet.CreateRow(i);

                            for (int j = 0; j < cols; j++)
                                _row.CreateCell(j).CellStyle = bodyStyle;
                        }

                        // 如果存在表标题
                        if (model.isTitle > 0)
                        {
                            // 获取行
                            _row = _sheet.GetRow(0);
                            // 合并单元格
                            CellRangeAddress region = new CellRangeAddress(0, 0, 0, (cols - 1));
                            _sheet.AddMergedRegion(region);
                            // 填充值
                            _row.CreateCell(0).SetCellValue(model.tableTitle);
                            // 设置样式
                            _row.GetCell(0).CellStyle = titleStyle;
                            // 设置行高
                            _row.HeightInPoints = 20;
                        }

                        // 取得上一个实体
                        NPOIHeader lastRow = null;
                        IList<NPOIHeader> hList = GetHeaders(model.headerName, rows, model.isTitle);
                        // 创建表头
                        foreach (NPOIHeader m in hList)
                        {
                            var data = hList.Where(c => c.firstRow == m.firstRow && c.lastCol == m.firstCol - 1);
                            if (data.Count() > 0)
                            {
                                lastRow = data.First();
                                if (m.headerName == lastRow.headerName)
                                    m.firstCol = lastRow.firstCol;
                            }

                            // 获取行
                            _row = _sheet.GetRow(m.firstRow);
                            // 合并单元格
                            CellRangeAddress region = new CellRangeAddress(m.firstRow, m.lastRow, m.firstCol, m.lastCol);
                            _sheet.AddMergedRegion(region);
                            // 填充值
                            _row.CreateCell(m.firstCol).SetCellValue(m.headerName);
                        }

                        // 填充表头样式
                        for (int i = 0; i < rows + model.isTitle; i++)
                        {
                            _row = _sheet.GetRow(i);
                            for (int j = 0; j < cols; j++)
                            {
                                _row.GetCell(j).CellStyle = bodyStyle;
                                //设置列宽
                                _sheet.SetColumnWidth(j, (model.colWidths[j] + 1) * 256);
                            }
                        }

                        rowIndex = (rows + model.isTitle);
                    }
                    #endregion

                    #region 填充内容
                    // 构建列
                    _row = _sheet.CreateRow(rowIndex);
                    foreach (DataColumn column in dt.Columns)
                    {
                        // 添加序号列
                        if (1 == model.isOrderby && column.Ordinal == 0)
                        {
                            _cell = _row.CreateCell(0);
                            _cell.SetCellValue(rowIndex - rows);
                            _cell.CellStyle = bodyStyle;
                        }

                        // 创建列
                        _cell = _row.CreateCell(column.Ordinal + model.isOrderby);

                        // 获取值
                        drValue = row[column].ToString();

                        switch (column.DataType.ToString())
                        {
                            case "System.String"://字符串类型
                                _cell.SetCellValue(drValue);
                                _cell.CellStyle = bodyStyle;
                                break;
                            case "System.DateTime"://日期类型
                                DateTime dateV;
                                DateTime.TryParse(drValue, out dateV);
                                _cell.SetCellValue(dateV);

                                _cell.CellStyle = dateStyle;//格式化显示
                                break;
                            case "System.Boolean"://布尔型
                                bool boolV = false;
                                bool.TryParse(drValue, out boolV);
                                _cell.SetCellValue(boolV);
                                _cell.CellStyle = bodyStyle;
                                break;
                            case "System.Int16"://整型
                            case "System.Int32":
                            case "System.Int64":
                            case "System.Byte":
                                int intV = 0;
                                int.TryParse(drValue, out intV);
                                _cell.SetCellValue(intV);
                                _cell.CellStyle = bodyRightStyle;
                                break;
                            case "System.Decimal"://浮点型
                            case "System.Double":
                                double doubV = 0;
                                double.TryParse(drValue, out doubV);
                                _cell.SetCellValue(doubV);
                                _cell.CellStyle = bodyRightStyle;
                                break;
                            case "System.DBNull"://空值处理
                                _cell.SetCellValue("");
                                break;
                            default:
                                _cell.SetCellValue("");
                                break;
                        }

                    }
                    #endregion

                    rowIndex++;
                }
            }
        }

        #region 辅助方法
        /// <summary>
        /// 表头解析
        /// </summary>
        /// <remarks>
        /// author:zhujt
        /// create date:2015-9-10 19:24:51
        /// </remarks>
        /// <param name="header">表头</param>
        /// <param name="rows">总行数</param>
        /// <param name="addRows">外加行</param>
        /// <param name="addCols">外加列</param>
        /// <returns></returns>
        private static IList<NPOIHeader> GetHeaders(string header, int rows, int addRows)
        {
            // 临时表头数组
            string[] tempHeader;
            string[] tempHeader2;
            // 所跨列数
            int colSpan = 0;
            // 所跨行数
            int rowSpan = 0;
            // 单元格对象
            NPOIHeader model = null;
            // 行数计数器
            int rowIndex = 0;
            // 列数计数器
            int colIndex = 0;
            // 
            IList<NPOIHeader> list = new List<NPOIHeader>();
            // 初步解析
            string[] headers = header.Split(new string[] { "#" }, StringSplitOptions.RemoveEmptyEntries);
            // 表头遍历
            for (int i = 0; i < headers.Length; i++)
            {
                // 行数计数器清零
                rowIndex = 0;
                // 列数计数器清零
                colIndex = 0;
                // 获取所跨行数
                rowSpan = GetRowSpan(headers[i], rows);
                // 获取所跨列数
                colSpan = GetColSpan(headers[i]);

                // 如果所跨行数与总行数相等,则不考虑是否合并单元格问题
                if (rows == rowSpan)
                {
                    colIndex = GetMaxCol(list);
                    model = new NPOIHeader(headers[i],
                        addRows,
                        (rowSpan - 1 + addRows),
                        colIndex,
                        (colSpan - 1 + colIndex),
                        addRows);
                    list.Add(model);
                    rowIndex += (rowSpan - 1) + addRows;
                }
                else
                {
                    // 列索引
                    colIndex = GetMaxCol(list);
                    // 如果所跨行数不相等,则考虑是否包含多行
                    tempHeader = headers[i].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
                    for (int j = 0; j < tempHeader.Length; j++)
                    {

                        // 如果总行数=数组长度
                        if (1 == GetColSpan(tempHeader[j]))
                        {
                            if (j == tempHeader.Length - 1 && tempHeader.Length < rows)
                            {
                                model = new NPOIHeader(tempHeader[j],
                                    (j + addRows),
                                    (j + addRows) + (rows - tempHeader.Length),
                                    colIndex,
                                    (colIndex + colSpan - 1),
                                    addRows);
                                list.Add(model);
                            }
                            else
                            {
                                model = new NPOIHeader(tempHeader[j],
                                        (j + addRows),
                                        (j + addRows),
                                        colIndex,
                                        (colIndex + colSpan - 1),
                                        addRows);
                                list.Add(model);
                            }
                        }
                        else
                        {
                            // 如果所跨列数不相等,则考虑是否包含多列
                            tempHeader2 = tempHeader[j].Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                            for (int m = 0; m < tempHeader2.Length; m++)
                            {
                                // 列索引
                                colIndex = GetMaxCol(list) - colSpan + m;
                                if (j == tempHeader.Length - 1 && tempHeader.Length < rows)
                                {
                                    model = new NPOIHeader(tempHeader2[m],
                                        (j + addRows),
                                        (j + addRows) + (rows - tempHeader.Length),
                                        colIndex,
                                        colIndex,
                                        addRows);
                                    list.Add(model);
                                }
                                else
                                {
                                    model = new NPOIHeader(tempHeader2[m],
                                            (j + addRows),
                                            (j + addRows),
                                            colIndex,
                                            colIndex,
                                            addRows);
                                    list.Add(model);
                                }
                            }
                        }
                        rowIndex += j + addRows;
                    }
                }
            }
            return list;
        }

        /// <summary>
        /// 获取最大列
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        private static int GetMaxCol(IList<NPOIHeader> list)
        {
            int maxCol = 0;
            if (list.Count > 0)
            {
                foreach (NPOIHeader model in list)
                {
                    if (maxCol < model.lastCol)
                        maxCol = model.lastCol;
                }
                maxCol += 1;
            }

            return maxCol;
        }

        /// <summary>
        /// 获取表头行数
        /// </summary>
        /// <param name="newHeaders">表头文字</param>
        /// <returns></returns>
        private static int GetRowCount(string newHeaders)
        {
            string[] ColumnNames = newHeaders.Split(new char[] { '@' });
            int Count = 0;
            if (ColumnNames.Length <= 1)
                ColumnNames = newHeaders.Split(new char[] { '#' });
            foreach (string name in ColumnNames)
            {
                int TempCount = name.Split(new char[] { ' ' }).Length;
                if (TempCount > Count)
                    Count = TempCount;
            }
            return Count;
        }

        /// <summary>
        /// 获取表头列数
        /// </summary>
        /// <param name="newHeaders">表头文字</param>
        /// <returns></returns>
        private static int GetColCount(string newHeaders)
        {
            string[] ColumnNames = newHeaders.Split(new char[] { '@' });
            int Count = 0;
            if (ColumnNames.Length <= 1)
                ColumnNames = newHeaders.Split(new char[] { '#' });
            Count = ColumnNames.Length;
            foreach (string name in ColumnNames)
            {
                int TempCount = name.Split(new char[] { ',' }).Length;
                if (TempCount > 1)
                    Count += TempCount - 1;
            }
            return Count;
        }

        /// <summary>
        /// 列头跨列数
        /// </summary>
        /// <remarks>
        /// author:zhujt
        /// create date:2015-9-9 09:17:34
        /// </remarks>
        /// <param name="newHeaders">表头文字</param>
        /// <returns></returns>
        private static int GetColSpan(string newHeaders)
        {
            return newHeaders.Split(',').Count();
        }

        /// <summary>
        /// 列头跨行数
        /// </summary> 
        /// <remarks>
        /// author:zhujt
        /// create date:2015-9-9 09:17:14
        /// </remarks>
        /// <param name="newHeaders">列头文本</param>
        /// <param name="rows">表头总行数</param>
        /// <returns></returns>
        private static int GetRowSpan(string newHeaders, int rows)
        {
            int Count = newHeaders.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries).Length;
            // 如果总行数与当前表头所拥有行数相等
            if (rows == Count)
                Count = 1;
            else if (Count < rows)
                Count = 1 + (rows - Count);
            else
                throw new Exception("表头格式不正确!");
            return Count;
        }
        #endregion

        #region 单元格样式
        /// <summary>
        /// 数据单元格样式
        /// </summary>
        private static ICellStyle bodyStyle
        {
            get
            {
                ICellStyle style = _workbook.CreateCellStyle();
                style.Alignment = HorizontalAlignment.Center; //居中
                style.VerticalAlignment = VerticalAlignment.Center;//垂直居中 
                style.WrapText = true;//自动换行
                // 边框
                style.BorderBottom = BorderStyle.Thin;
                style.BorderLeft = BorderStyle.Thin;
                style.BorderRight = BorderStyle.Thin;
                style.BorderTop = BorderStyle.Thin;
                // 字体
                IFont font = _workbook.CreateFont();
                font.FontHeightInPoints = 10;
                font.FontName = "宋体";
                style.SetFont(font);

                return style;
            }
        }

        /// <summary>
        /// 数据单元格样式
        /// </summary>
        private static ICellStyle bodyRightStyle
        {
            get
            {
                ICellStyle style = _workbook.CreateCellStyle();
                style.Alignment = HorizontalAlignment.Right; //居中
                style.VerticalAlignment = VerticalAlignment.Center;//垂直居中 
                style.WrapText = true;//自动换行
                // 边框
                style.BorderBottom = BorderStyle.Thin;
                style.BorderLeft = BorderStyle.Thin;
                style.BorderRight = BorderStyle.Thin;
                style.BorderTop = BorderStyle.Thin;
                // 字体
                IFont font = _workbook.CreateFont();
                font.FontHeightInPoints = 10;
                font.FontName = "宋体";
                style.SetFont(font);

                return style;
            }
        }

        /// <summary>
        /// 标题单元格样式
        /// </summary>
        private static ICellStyle titleStyle
        {
            get
            {
                ICellStyle style = _workbook.CreateCellStyle();
                style.Alignment = HorizontalAlignment.Center; //居中
                style.VerticalAlignment = VerticalAlignment.Center;//垂直居中 
                style.WrapText = true;//自动换行 

                IFont font = _workbook.CreateFont();
                font.FontHeightInPoints = 14;
                font.FontName = "宋体";
                font.Boldweight = (short)FontBoldWeight.Bold;
                style.SetFont(font);

                return style;
            }
        }

        /// <summary>
        /// 日期单元格样式
        /// </summary>
        private static ICellStyle dateStyle
        {
            get
            {
                ICellStyle style = _workbook.CreateCellStyle();
                style.Alignment = HorizontalAlignment.Center; //居中
                style.VerticalAlignment = VerticalAlignment.Center;//垂直居中 
                style.WrapText = true;//自动换行
                // 边框
                style.BorderBottom = BorderStyle.Thin;
                style.BorderLeft = BorderStyle.Thin;
                style.BorderRight = BorderStyle.Thin;
                style.BorderTop = BorderStyle.Thin;
                // 字体
                IFont font = _workbook.CreateFont();
                font.FontHeightInPoints = 10;
                font.FontName = "宋体";
                style.SetFont(font);

                IDataFormat format = _workbook.CreateDataFormat();
                style.DataFormat = format.GetFormat("yyyy-MM-dd");
                return style;
            }
        }
        #endregion
    }

}

DemoTest.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DemoTest.aspx.cs" Inherits="NPOIDemo.DemoTest" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Button runat="server" ID="btn_Export" Text="导出" OnClick="btn_Export_Click" />
        </div>
    </form>
</body>
</html>

DemoTest.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using NPOIDemo.Model;


namespace NPOIDemo
{
    public partial class DemoTest : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btn_Export_Click(object sender, EventArgs e)
        {
            DataTable dt = CreateDataTable();
            IList<NPOIModel> list = new List<NPOIModel>();
            list.Add(new NPOIModel(dt, "name;sex;workyear;position;hiredate;skill;hobby;avg", "测试1",
                "姓名#性别#工作情况 工作年限,职位#入职日期#其他信息 能力 技能,爱好#其他信息 年龄", "测试1"));
            dt = CreateDataTable();
            list.Add(new NPOIModel(dt, null, "测试2", null, "测试2"));

            //dt = FarmerList();
            //list.Add(new NPOIModel(dt, "rowid;tname;vname;Name;IdNumber;education;political;mz;Household;HouseholdType;Phone;Domicile", "测试3",
            //    "所属乡镇 序号,乡镇,行政村#所在村 基本信息 姓名,身份证号,文化程度,政治面貌,民族,户籍,户籍性质,手机,现居住地", "崇明县农业从业人员信息统计表"));

            NPOIHelper.Export(null, list);
        }

        //private DataTable FarmerList() {
        //    string sql = @"SELECT TOP 20 ROW_NUMBER()OVER(ORDER BY a.Id) rowid,b.Name tname,c.Name vname,a.Name,a.IdNumber,d.Name education,e.Name political,
        //                '汉族' mz,a.Household,a.HouseholdType,a.Phone,Domicile FROM dbo.tb_FarmerInfo a
        //                LEFT JOIN dbo.View_Area b ON b.id=a.CurrentArea
        //                LEFT JOIN dbo.View_Area c ON c.id=a.InCome
        //                LEFT JOIN dbo.tb_BaseData d ON d.Id=a.Education
        //                LEFT JOIN dbo.tb_BaseData e ON e.Id=a.Political
        //                WHERE a.InCome IS NOT NULL";

        //    return DbHelperSQL.Query(sql).Tables[0];
        //}

        private DataTable CreateDataTable()
        {
            DataTable dt = new DataTable();
            DataColumn col = new DataColumn("name", typeof(string));
            dt.Columns.Add(col);
            col = new DataColumn("sex", typeof(string));
            dt.Columns.Add(col);
            col = new DataColumn("avg", typeof(int));
            dt.Columns.Add(col);
            col = new DataColumn("mobilephone", typeof(decimal));
            dt.Columns.Add(col);
            col = new DataColumn("workyear", typeof(int));
            dt.Columns.Add(col);
            col = new DataColumn("position", typeof(string));
            dt.Columns.Add(col);
            col = new DataColumn("skill", typeof(string));
            dt.Columns.Add(col);
            col = new DataColumn("hobby", typeof(string));
            dt.Columns.Add(col);
            col = new DataColumn("hiredate", typeof(DateTime));
            dt.Columns.Add(col);

            DataRow rw = dt.NewRow();
            rw["name"] = "卡尔";
            rw["sex"] = "男";
            rw["avg"] = 20;
            rw["mobilephone"] = 15800034430;
            rw["workyear"] = 3;
            rw["position"] = "程序员";
            rw["skill"] = ".net,oracel,sqlserver,html5,css3";
            rw["hobby"] = "打篮球,运动";
            rw["hiredate"] = DateTime.Now;
            dt.Rows.Add(rw);
            rw = dt.NewRow();
            rw["name"] = "玫瑰";
            rw["sex"] = "女";
            rw["avg"] = 23;
            rw["mobilephone"] = 17800034430;
            rw["workyear"] = 4;
            rw["position"] = "美工";
            rw["skill"] = "ps";
            rw["hobby"] = "唱歌,跳舞,做饭";
            rw["hiredate"] = DateTime.Now;
            dt.Rows.Add(rw);
            rw = dt.NewRow();
            rw["name"] = "boss";
            rw["sex"] = "男";
            rw["avg"] = 45;
            rw["mobilephone"] = 13800039980;
            rw["workyear"] = 20;
            rw["position"] = "老总";
            rw["skill"] = "人际关系,企业管理";
            rw["hobby"] = "爬山,摄影,跑步,游泳";
            rw["hiredate"] = DateTime.Now;
            dt.Rows.Add(rw);
            return dt;
        }
    }
}

运行结果如图:

这里写图片描述

NPOI导出EXCEL之多层级表头以及多列行合并 表二和表三没啥好看的属于是常规数据,主要是看表一的列多行合并以及表三的多表头。导出一个excel对应多个sheet。效果就是这么个效果,下面上代码。数据源格式dataSet。 阅读详情

相关推荐

c# 使用NPOI按模板导出excel

excel模板设置 私车公用单 申请信息 申请单号: $header.ORDER_NO 申请日期: $header.CREATE_TIME $auotheight 申请部门: $header.APPLY_DEPT 申请人: $header.APPLY_USER $auotheight 项目: ...

LU142857的专栏 3290

.Net NPOI Excel 导出

最终效果图环境:Revit,WPF,NPOI 2.5.6,.Net Framework 4.7.2。

2301_78287784的博客 3635

NPOI按模板导出Excel

public void ExportPrjToExcel(int prjId, string excelPath,bool showBox) { IWorkbook wk = null; string templateExcelPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "template.xlsx"); string extension =...

qq_42362351的博客 860

NPOI 实现Excel模板导出

所需Json数据 对应参数 List listData。记录一下使用NPOI实现定制的Excel导出模板,已下实现需求及主要逻辑。

SsStr的博客 884

Winform中通过NPOI导出Excel的三种方式(HSSFWorkbook,XSSFWorkbook,SXSSFWorkbook)附代码下载

场景 HSSFworkbook,XSSFworkbook,SXSSFworkbook区别 HSSFWorkbook: 是操作Excel2003以前(包括2003)的版本,扩展名是.xls;导出excel最常用的方式;但是此种方式的局限就是导出的行数至多为65535行,超出65536条后系统就会报错。 XSSFWorkbook: 是操作Excel2007后的版本,扩展名是.xlsx;为了突破HSSFWorkbook的65535行局限。其对应的是excel2007(1048576行,16384列)扩展

BADAO_LIUMANG_QIZHI的博客 6142

NPOI导出自定义多行表头的电子表格

  NPOI导出真正的电子表格,支持 自定义多行表头(表头风格设置),支持多个sheet页面导出 ,调用简单方便

Excel 的NPOI导出和模板导出

Excel 导出:主要是利用了浏览器的下载功能。通过window.open(), 在一个新的窗口打开下载的路径 一、NPOI导出Excel: .xls 后缀名 是1997~2003的版本,是Excel基本的版本,和.xlsx的版本相比,.xls的兼容性更强 .xlsx 后缀名,是比.xls更好的版本,只是代码实现相对.xls的更加复杂 导出步骤:一、查询需要导出的数据 二、创建工作簿和工作表 三、然后在工作表中创建行(注意:Excel的官方定义是先有行,再有列) 四、( 设置表标题及样式 -&g

shmily_Laowang的博客 1990

NPOI基于模板导出到excel

NPOI基于模板导出到excel, 支持excel2007以上版本和2003以下版本

NPOI基于模板导出到Excel

NPOI基于模板导出到Excel 【下载地址】NPOI基于模板导出到Excel NPOI基于模板导出到Excel是一款高效便捷的工具,帮助用户轻松将数据导出到Excel文件中。它支持Excel2007及以上版本以及2003以下版本,满足不同场景需求。通过预设模板,用户可以快速生成格式规范的Excel文件,简化数据处理流程...

gitblog_06756的博客 348

POI使用Excel模板文件循环输出行并导出Excel

POI使用excel模板循环输出行到文件并导出的一个小例子

系统安装、qt配置、安装pcie驱动

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 安装Linux系统指定:ununtu20.04并配置相关软件环境 前言 提示:这里可以添加本文要记录的大概内容: ununtu20.04、Qt 5.9.0、pcie驱动 提示:以下是本篇文章正文内容,下面案例可供参考 一、安装系统 制作系统盘(win10),在开机时按相应键进入BIOS,(华硕需要先改配置启动->CSM->开启->第一个选项选第一个或第二个),等待即可 进入后按照https://www.sysgeek.

weixin_44832804的博客 2204

NPOI制作特定模板导出excel

今天捣鼓了一天NPOI导出excel终于把制作

2331

ESD 防护深度解析:模型、等级、系统设计与防护策略

本文系统阐述了静电放电(ESD)防护的核心技术体系。首先对比分析了HBM(人体模型)和CDM(充电设备模型)两种基础ESD模型的物理特性、测试标准及分级要求,指出相同电压下CDM的破坏性是HBM的15-20倍。其次详细解析了IEC61000-4-2系统级ESD标准,包括接触/空气放电测试方法及判定等级。重点提出了系统级防护的三层架构:空间隔离(≥10mm间距)、电气隔离(地平面分割)和TVS管选型(响应时间<1ns),并对比了MOV、SCR等防护器件特性。针对不同应用场景(消费电子、工业控制等)给出了差异化

bother3000的博客 1882

WeihanLi.Npoi 根据模板导出Excel

WeihanLi.Npoi 根据模板导出Excel石头 www.10tou.com Intro 原来的导出方式比较适用于比较简单的导出,每一条数据在一行,数据列虽然自定义程度比较高,如果要一条数据对应多行就做不到了,于是就想支持根据模板导出,在 1.8.0 版本中引入了根据模板导出的功能 使用示例 示例模板 模板规划的可以有三种数据: Global:一个是导出的时候可以指定一些参数,作...

终极冥帝 363

2026四款AI原生IDE实测:Trae、Qoder、CodeBuddy、Cursor能力边界深度解析

AI原生IDE正从代码编辑器演进为开发者智能工作流中枢,其核心在于对上下文理解、AST编辑意图建模与多模态任务调度的工程化实现。区别于传统插件式AI辅助,真正的AI原生IDE需具备知识库嵌入、符号图索引、操作链固化等底层能力,从而支撑Figma转码、N+1查询修复、跨语言迁移等复杂场景。Trae强调中文语境与企业规范的强绑定,Qoder聚焦AST级编辑轨迹预测,CodeBuddy通过IDE/插件/CLI三态划分控制权边界,Cursor则以云端Agent实现开发任务的时空并行。本文基于真实项目压测,揭示免费版

ctk87443的博客 2448

《通信工程施工与管理》

制作馈线接头必须使用专用的工具,专用工具包括:馈线切割刀、馈线安全刀、小金属丝毛刷、固定尺寸或大号活动扳手、小号扁锉刀、细齿小手锯、接头扩孔器、3M防水胶或防水接头盒;如图所示,详情如表所示。

2302_78710464的博客 1653

C# Excel模板导出数据,基于NPOI

Excel模板 Helper类 public class Helper<T> where T : class, new() { /// <summary> /// 使用模板导出Excel /// </summary> /// <param name="list">数据&l...

u010120164的博客 1825

别再手动抓波形了!用Synopsys AXI VIP的Port Monitor自动收集事务数据(附完整连接Scoreboard代码)

当标准Port Monitor无法满足需求时,Synopsys提供的callback机制就像一套精密的手术工具,允许你深入VIP内部进行定制化改造。创建自定义监控点的四步法继承基类// 其他自定义字段...endclass重写目标phase方法// 克隆事务并发送到自定义端口在env中注册callbackcustom_cb);连接自定义端口到分析组件经典应用场景地址phase特定检查数据beat级监控自定义性能统计异常注入检测。

weixin_28716181的博客 396

C# NPOI 导出Excel模板

1. winForm 导出 Excel模板 SaveFileDialog fileDialog = new SaveFileDialog(); fileDialog.Filter = "Excel(97-2003)|*.xls|Excel(2007)|*.xlsx"; if (fileDialog.ShowDialog() ...

weixin_30418341的博客 1397

工业级4~20mA转0~3V信号调理电路原理图设计,已量产(电流传感器)

在工业现场,4~20mA 电流信号是模拟量传输的 “老熟人”—— 抗干扰强、能跑长距离,但嵌入式 MCU 的 ADC 一般只认电压信号。最近做项目时,我设计了一款能覆盖 0~25mA(含超量程冗余)、线性输出 0~3V 的调理电路,经过现场调试挺稳定,分享下细节。

不脱发的程序猿 525

EndNote X9 参考文献附录列表 格式调整

EndNote X9 插入参考文献常见问题总结

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 2567

C# 根据模板 导出 Excel 图表 (NPOI组件)

C# 根据模板 导出  Excel  图表 (NPOI组件) 我的数据是放在List中的。     //导出         protected void onclickbutton(object sender, EventArgs e)         {             getlist();//取出数据,就不详细说明         }

qq_39168779的博客 8375

YOLOv11改进 | 主干/Backbone篇 | 利用目标检测轻量化网络MobileNetV2替换Backbone(yolov11系列全系轻量化)

本文给大家带来的改进机制是,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。其在MobilNetV1的基础上采用反转残差结构和线性瓶颈层。这种结构通过轻量级的深度卷积和线性卷积过滤特征,同时去除狭窄层中的非线性,以维持表征能力。MobileNetV2在性能上和精度上都要比V1版本强很多,其在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中都展现了一定的有效性。YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍二、MobileNetV2的框架原理。

Snu77的博客 2841

NPOI基于模板导出到Excel:高效数据处理新选择

NPOI基于模板导出到Excel:高效数据处理新选择 【下载地址】NPOI基于模板导出到Excel NPOI基于模板导出到Excel是一款高效便捷的工具,帮助用户轻松将数据导出到Excel文件中。它支持Excel2007及以上版本以及2003以下版本,满足不同场景需求。通过预设模板,用户可以快速生成格式规范的Excel文...

gitblog_06758的博客 964

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C#基于Npoi通过特性的方式导出简单数据到Excel或基于特性以及基于Excel模板导出数据到Excel以及从Excel中把数据导入到对象中

基于Npoi/Excel模板以及结合特性完成数据导出到Excel中,这里你可以以最简单的方式实现数据导出到Excel或基于Excel模板导出

weixin_43872830的博客 4152

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: Reactjs入门官方文档(十一)【Thinking in React】
下一篇: MVC5中根据word模板填充数据生成word
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值