C# 如何使用NPOI导出列表数据

C# 如何使用NPOI导出列表数据,c#,asp.net,asp.net-core,npoi,C#,Asp.net,Asp.net Core,Npoi,我正在使用NPOI将数据导出到excel中。 所以我创建了一个列表,可以从我的数据库中提取数据。 现在我的问题是如何读取列表数据并将数据写入excel表格。 以下是我代码的一部分: IWorkbook workbook; workbook = new NPOI.XSSF.UserModel.XSSFWorkbook(); ISheet excelSheet = workbook.CreateSheet("Candidates

我正在使用NPOI将数据导出到excel中。 所以我创建了一个列表,可以从我的数据库中提取数据。 现在我的问题是如何读取列表数据并将数据写入excel表格。 以下是我代码的一部分:

            IWorkbook workbook;
            workbook = new NPOI.XSSF.UserModel.XSSFWorkbook();
            ISheet excelSheet = workbook.CreateSheet("Candidates");
            IRow row = excelSheet.CreateRow(0);


            foreach (var data in ApplicationList)
            {

            }
            workbook.Write(fs);

因此,基本上我需要有关
foreach(ApplicationList中的var数据)

的帮助,而编写数据单元格可以创建,SetCellValue可以帮助设置数据

下面我试着迭代一列和一列字符串。 这在我的系统上运行良好

IWorkbook workbook = new HSSFWorkbook();
ISheet excelSheet = workbook.CreateSheet("Candidates");
IRow row = excelSheet.CreateRow(0);
var applicantList = new List<string> { "David", "Paul" };
var excelColumns = new[] { "Name" };
IRow headerRow = excelSheet.CreateRow(0);
var headerColumn = 0;
excelColumns.ToList().ForEach(excelColumn =>
{
    var cell = headerRow.CreateCell(headerColumn);
    cell.SetCellValue(excelColumn);
    headerColumn++;
 });
var rowCount = 1;
applicantList.ForEach(applicant => {
    var row = excelSheet.CreateRow(rowCount);
    var cellCount = 0;
    excelColumns.ToList().ForEach(column => {
        var cell = row.CreateCell(cellCount);
        cell.SetCellValue(applicant);
        cellCount++;
    });
    rowCount++;
});
var stream = new MemoryStream();
workbook.Write(stream);
string FilePath = "/Users/hemkumar/hem.xls"; //path to download
FileStream file = new FileStream(FilePath, FileMode.CreateNew, 
                   FileAccess.Write);
stream.WriteTo(file);
file.Close();
stream.Close();
IWorkbook工作簿=新的HSSFWorkbook();
ISheet excelSheet=workbook.CreateSheet(“候选者”);
IRow row=excelSheet.CreateRow(0);
var applicationlist=新列表{“David”,“Paul”};
var excelColumns=new[]{“Name”};
IRow headerRow=excelSheet.CreateRow(0);
var headerColumn=0;
excelColumns.ToList().ForEach(excelColumn=>
{
变量单元格=headerRow.CreateCell(headerColumn);
cell.SetCellValue(excelColumn);
headerColumn++;
});
var rowCount=1;
申请者列表。ForEach(申请者=>{
var row=excelSheet.CreateRow(行计数);
var-cellCount=0;
excelColumns.ToList().ForEach(列=>{
var cell=row.CreateCell(cellCount);
cell.SetCellValue(申请人);
cellCount++;
});
行计数++;
});
var stream=newmemoryStream();
工作簿。写(流);
字符串FilePath=“/Users/hemkumar/hem.xls”//下载路径
FileStream file=newfilestream(FilePath,FileMode.CreateNew,
FileAccess.Write);
stream.WriteTo(文件);
file.Close();
stream.Close();

我希望这会有帮助。

我知道我来晚了一点,但我认为这可能会帮助其他人

我使用NPOI包开发了一个excel实用程序,它可以

  • 只需获取数据表或集合
  • 并返回excel,同时在excel中保持所有数据表/列表数据类型不变
  • Github代码报告:

    要查找代码解释,可以在此处找到:

    它使用NPOIDLL,它有2个cs文件要包括,然后你就可以去了

    下面是供参考的第一个文件AbstractDataExport.cs

    using NPOI.SS.UserModel;
    using NPOI.XSSF.UserModel;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Net;
    using System.Net.Http;
    using System.Net.Http.Headers;
    
    namespace GenericExcelExport.ExcelExport
    {
        public interface IAbstractDataExport
        {
            HttpResponseMessage Export(List exportData, string fileName, string sheetName);
        }
    
        public abstract class AbstractDataExport : IAbstractDataExport
        {
            protected string _sheetName;
            protected string _fileName;
            protected List _headers;
            protected List _type;
            protected IWorkbook _workbook;
            protected ISheet _sheet;
            private const string DefaultSheetName = "Sheet1";
    
            public HttpResponseMessage Export
                  (List exportData, string fileName, string sheetName = DefaultSheetName)
            {
                _fileName = fileName;
                _sheetName = sheetName;
    
                _workbook = new XSSFWorkbook(); //Creating New Excel object
                _sheet = _workbook.CreateSheet(_sheetName); //Creating New Excel Sheet object
    
                var headerStyle = _workbook.CreateCellStyle(); //Formatting
                var headerFont = _workbook.CreateFont();
                headerFont.IsBold = true;
                headerStyle.SetFont(headerFont);
    
                WriteData(exportData); //your list object to NPOI excel conversion happens here
    
                //Header
                var header = _sheet.CreateRow(0);
                for (var i = 0; i < _headers.Count; i++)
                {
                    var cell = header.CreateCell(i);
                    cell.SetCellValue(_headers[i]);
                    cell.CellStyle = headerStyle;
                }
    
                for (var i = 0; i < _headers.Count; i++)
                {
                    _sheet.AutoSizeColumn(i);
                }
    
                using (var memoryStream = new MemoryStream()) //creating memoryStream
                {
                    _workbook.Write(memoryStream);
                    var response = new HttpResponseMessage(HttpStatusCode.OK)
                    {
                        Content = new ByteArrayContent(memoryStream.ToArray())
                    };
    
                    response.Content.Headers.ContentType = new MediaTypeHeaderValue
                           ("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                    response.Content.Headers.ContentDisposition = 
                           new ContentDispositionHeaderValue("attachment")
                    {
                        FileName = $"{_fileName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"
                    };
    
                    return response;
                }
            }
    
            //Generic Definition to handle all types of List
            public abstract void WriteData(List exportData);
        }
    }
    
    using NPOI.SS.UserModel;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Text.RegularExpressions;
    
    namespace GenericExcelExport.ExcelExport
    {
        public class AbstractDataExportBridge : AbstractDataExport
        {
            public AbstractDataExportBridge()
            {
                _headers = new List<string>();
                _type = new List<string>();
            }
    
            public override void WriteData<T>(List<T> exportData)
            {
                PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
    
                DataTable table = new DataTable();
    
                foreach (PropertyDescriptor prop in properties)
                {
                    var type = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
                    _type.Add(type.Name);
                    table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? 
                                      prop.PropertyType);
                    string name = Regex.Replace(prop.Name, "([A-Z])", " $1").Trim(); //space separated 
                                                                               //name by caps for header
                    _headers.Add(name);
                }
    
                foreach (T item in exportData)
                {
                    DataRow row = table.NewRow();
                    foreach (PropertyDescriptor prop in properties)
                        row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
                    table.Rows.Add(row);
                }
    
                IRow sheetRow = null;
    
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    sheetRow = _sheet.CreateRow(i + 1);
                    for (int j = 0; j < table.Columns.Count; j++)
                    {
                        ICell Row1 = sheetRow.CreateCell(j);
    
                        string type = _type[j].ToLower();
                        var currentCellValue = table.Rows[i][j];
    
                        if (currentCellValue != null && 
                            !string.IsNullOrEmpty(Convert.ToString(currentCellValue)))
                        {
                            if (type == "string")
                            {
                                Row1.SetCellValue(Convert.ToString(currentCellValue));
                            }
                            else if (type == "int32")
                            {
                                Row1.SetCellValue(Convert.ToInt32(currentCellValue));
                            }
                            else if (type == "double")
                            {
                                Row1.SetCellValue(Convert.ToDouble(currentCellValue));
                            }
                        }
                        else
                        {
                            Row1.SetCellValue(string.Empty);
                        }
                    }
                }
            }
        }
    }
    
    使用NPOI.SS.UserModel;
    使用NPOI.XSSF.UserModel;
    使用制度;
    使用System.Collections.Generic;
    使用System.IO;
    Net系统;
    使用System.Net.Http;
    使用System.Net.Http.Header;
    命名空间GenericExcelExport.ExcelExport
    {
    公共接口IAbstractDataExport
    {
    HttpResponseMessage导出(列表导出数据、字符串文件名、字符串名称);
    }
    公共抽象类AbstractDataExport:IAbstractDataExport
    {
    受保护的字符串\u sheetName;
    受保护的字符串\u文件名;
    受保护的列表头;
    受保护列表类型;
    受保护的IWorkbook\u工作簿;
    受保护的ISHET_表;
    private const string DefaultSheetName=“Sheet1”;
    公共HttpResponseMessage导出
    (列出exportData、字符串文件名、字符串sheetName=DefaultSheetName)
    {
    _fileName=文件名;
    _sheetName=sheetName;
    _工作簿=新建XSSF工作簿();//创建新的Excel对象
    _工作表=\u工作簿.CreateSheet(\u sheetName);//创建新的Excel工作表对象
    var headerStyle=_工作簿.CreateCellStyle();//格式
    var headerFont=_workbook.CreateFont();
    headerFont.IsBold=true;
    headerStyle.SetFont(headerFont);
    WriteData(exportData);//列表对象到NPOI excel的转换在此处进行
    //标题
    var头=_sheet.CreateRow(0);
    对于(变量i=0;i<\u headers.Count;i++)
    {
    var cell=header.CreateCell(i);
    cell.SetCellValue(_头[i]);
    cell.CellStyle=headerStyle;
    }
    对于(变量i=0;i<\u headers.Count;i++)
    {
    _表1.AutoSizeColumn(i);
    }
    使用(var memoryStream=new memoryStream())//创建memoryStream
    {
    _工作簿。编写(memoryStream);
    var响应=新的HttpResponseMessage(HttpStatusCode.OK)
    {
    Content=newbyteArray内容(memoryStream.ToArray())
    };
    response.Content.Headers.ContentType=新的MediaTypeHeaderValue
    (“application/vnd.openxmlformats of cedocument.spreadsheetml.sheet”);
    response.Content.Headers.ContentDisposition=
    新内容配置HeaderValue(“附件”)
    {
    FileName=$“{{u FileName}{DateTime.Now.ToString(“yyyyMMddHHmmss”)}.xlsx”
    };
    返回响应;
    }
    }
    //处理所有类型列表的通用定义
    公共摘要无效写入数据(列表导出数据);
    }
    }
    
    这是第二个也是最后一个文件AbstractDataExportBridge.cs

    using NPOI.SS.UserModel;
    using NPOI.XSSF.UserModel;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Net;
    using System.Net.Http;
    using System.Net.Http.Headers;
    
    namespace GenericExcelExport.ExcelExport
    {
        public interface IAbstractDataExport
        {
            HttpResponseMessage Export(List exportData, string fileName, string sheetName);
        }
    
        public abstract class AbstractDataExport : IAbstractDataExport
        {
            protected string _sheetName;
            protected string _fileName;
            protected List _headers;
            protected List _type;
            protected IWorkbook _workbook;
            protected ISheet _sheet;
            private const string DefaultSheetName = "Sheet1";
    
            public HttpResponseMessage Export
                  (List exportData, string fileName, string sheetName = DefaultSheetName)
            {
                _fileName = fileName;
                _sheetName = sheetName;
    
                _workbook = new XSSFWorkbook(); //Creating New Excel object
                _sheet = _workbook.CreateSheet(_sheetName); //Creating New Excel Sheet object
    
                var headerStyle = _workbook.CreateCellStyle(); //Formatting
                var headerFont = _workbook.CreateFont();
                headerFont.IsBold = true;
                headerStyle.SetFont(headerFont);
    
                WriteData(exportData); //your list object to NPOI excel conversion happens here
    
                //Header
                var header = _sheet.CreateRow(0);
                for (var i = 0; i < _headers.Count; i++)
                {
                    var cell = header.CreateCell(i);
                    cell.SetCellValue(_headers[i]);
                    cell.CellStyle = headerStyle;
                }
    
                for (var i = 0; i < _headers.Count; i++)
                {
                    _sheet.AutoSizeColumn(i);
                }
    
                using (var memoryStream = new MemoryStream()) //creating memoryStream
                {
                    _workbook.Write(memoryStream);
                    var response = new HttpResponseMessage(HttpStatusCode.OK)
                    {
                        Content = new ByteArrayContent(memoryStream.ToArray())
                    };
    
                    response.Content.Headers.ContentType = new MediaTypeHeaderValue
                           ("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                    response.Content.Headers.ContentDisposition = 
                           new ContentDispositionHeaderValue("attachment")
                    {
                        FileName = $"{_fileName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"
                    };
    
                    return response;
                }
            }
    
            //Generic Definition to handle all types of List
            public abstract void WriteData(List exportData);
        }
    }
    
    using NPOI.SS.UserModel;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Text.RegularExpressions;
    
    namespace GenericExcelExport.ExcelExport
    {
        public class AbstractDataExportBridge : AbstractDataExport
        {
            public AbstractDataExportBridge()
            {
                _headers = new List<string>();
                _type = new List<string>();
            }
    
            public override void WriteData<T>(List<T> exportData)
            {
                PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
    
                DataTable table = new DataTable();
    
                foreach (PropertyDescriptor prop in properties)
                {
                    var type = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
                    _type.Add(type.Name);
                    table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? 
                                      prop.PropertyType);
                    string name = Regex.Replace(prop.Name, "([A-Z])", " $1").Trim(); //space separated 
                                                                               //name by caps for header
                    _headers.Add(name);
                }
    
                foreach (T item in exportData)
                {
                    DataRow row = table.NewRow();
                    foreach (PropertyDescriptor prop in properties)
                        row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
                    table.Rows.Add(row);
                }
    
                IRow sheetRow = null;
    
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    sheetRow = _sheet.CreateRow(i + 1);
                    for (int j = 0; j < table.Columns.Count; j++)
                    {
                        ICell Row1 = sheetRow.CreateCell(j);
    
                        string type = _type[j].ToLower();
                        var currentCellValue = table.Rows[i][j];
    
                        if (currentCellValue != null && 
                            !string.IsNullOrEmpty(Convert.ToString(currentCellValue)))
                        {
                            if (type == "string")
                            {
                                Row1.SetCellValue(Convert.ToString(currentCellValue));
                            }
                            else if (type == "int32")
                            {
                                Row1.SetCellValue(Convert.ToInt32(currentCellValue));
                            }
                            else if (type == "double")
                            {
                                Row1.SetCellValue(Convert.ToDouble(currentCellValue));
                            }
                        }
                        else
                        {
                            Row1.SetCellValue(string.Empty);
                        }
                    }
                }
            }
        }
    }
    
    使用NPOI.SS.UserModel;
    使用制度;
    使用System.Collections.Generic;
    使用系统组件模型;
    使用系统数据;
    使用System.Text.RegularExpressions;
    命名空间GenericExcelExport.ExcelExport
    {
    公共类AbstractDataExportBridge:AbstractDataExport
    {
    公共抽象数据导出桥()
    {
    _headers=新列表();
    _类型=新列表();
    }
    公共覆盖无效写入数据(列表导出数据)
    {
    PropertyDescriptorCollection属性=TypeDescriptor.GetProperties(typeof(T));
    DataTable=新的DataTable();
    foreach(属性中的PropertyDescriptor属性)
    {
    var type=Nullable.getUnderlineType(prop.PropertyType)??prop.PropertyType;
    _type.Add(type.Name);
    table.Columns.Add(prop.Name,null.getUnderlinegType(prop.PropertyType)??
    属性类型);