asp.net 如何使用NPOI导出列表数据

11dmarpk  于 2023-01-10  发布在  .NET
关注(0)|答案(3)|浏览(243)

我正在使用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 (var data in ApplicationList)方面的帮助

nle07wnf

nle07wnf1#

写入数据时,可以创建单元格,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();

希望能有所帮助。

b1uwtaje

b1uwtaje2#

我知道我来晚了一点但我想这可能会帮助其他人
我使用NPOI包开发了一个excel实用程序,可以
1.只需将数据表或集合
1.并返回您的excel,同时保持所有数据表/列表数据类型在excel中完好无损。
Github代码库:https://github.com/ansaridawood/.NET-Generic-Excel-Export-Sample/tree/master/GenericExcelExport/ExcelExport
要查找代码解释,可以在此处找到:https://www.codeproject.com/Articles/1241654/Export-to-Excel-using-NPOI-Csharp-and-WEB-API
它使用NPOI DLL,并且有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);
    }
}

这是第二个也是最后一个文件AbstractDataExportBridge.cs

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);
                    }
                }
            }
        }
    }
}

有关详细说明,请参阅开头提供的链接。

yfjy0ee7

yfjy0ee73#

我也在使用NPOI将数据导出到Excel中。
但我有一个列表,将从NPOI创建的另一个Excel文件中提取数据。
不管怎么说,我认为我解决这个问题的方案,和你的没有太大区别,可以有效。
看到下面的代码示例后,请阅读说明。

await using var stream = new FileStream(@"C:\Users\Sina\Desktop\TestExcel.xlsx", FileMode.OpenOrCreate, FileAccess.Write);

IWorkbook workbook = new XSSFWorkbook();

var excelSheet = workbook.CreateSheet("TestSheet");

for (var i = 0; i < MyDataList.Count(); i++)
{
    var row = excelSheet.CreateRow(i);

    for (var j = 0; j < MyDataList[i].Cells.Count(); j++)
    {
        var cell = row.CreateCell(j);

        cell.SetCellValue(MyDataList[i].Cells[j].ToString());
    }
}

workbook.Write(stream);

正如我所说的,我使用的不是从数据库中获取数据的列表,而是从另一个Excel文件中获取数据的列表,这些数据是我通过NPOI提取的。
你可以在上面的代码片段(MyDataList)中看到它,它的类型是(List<IRow>)。
您必须创建与列表中的数据一样多的行,因此每次都在循环中创建。var row = excelSheet.CreateRow(i)
现在请注意,每行都有几个单元格,我用另一个循环填充这些单元格,您需要在行中创建任意数量的单元格,因此每次都在这个循环中创建。var cell = row.CreateCell(j)
现在可以使用cell.SetCellValue()设置每个单元格的数据,然后使用列表中的数据,而不是列表中的MyDataList[i].Cells[j]
注意,SetCellValue()方法的输入类型必须是字符串。
现在我想补充的是,我也使用了AddRange()方法而不是第二个循环(如-row.Cells.AddRange(FailedRowList[i].Cells)),但它不起作用,所以如果你能使用它,我将不胜感激,如果你说出来,让我知道更多。我希望我的回答是有帮助的。谢谢😁🙏🏻

相关问题