C# EPPlus Excel导出-每个记录的所有数据值都进入A列?

C# EPPlus Excel导出-每个记录的所有数据值都进入A列?,c#,asp.net-mvc,linq,export-to-excel,epplus,C#,Asp.net Mvc,Linq,Export To Excel,Epplus,我正试图通过库和System.Linq.Dynamic将Excel导出功能添加到我的MVC5/Code First实体框架应用程序中。在我的导出视图中,我用我的库存资产模型属性填写了一个多选列表。然后将这些字段传递到myExportController,以指定要导出的模型字段 我已经获得了要导出到第1行的标题,但仍然难以获得要导出的数据。目前,我所选字段的数据都会出现,但每个值都会作为一个长字符串导出到a列中它自己的行中。例如,如果我选择以下字段(状态、ip\U地址、mac\U地址、备注、所有者

我正试图通过库和System.Linq.Dynamic将Excel导出功能添加到我的MVC5/Code First实体框架应用程序中。在我的导出
视图
中,我用我的
库存资产
模型属性填写了一个
多选列表
。然后将这些字段传递到my
ExportController
,以指定要导出的模型字段

我已经获得了要导出到第1行的标题,但仍然难以获得要导出的数据。目前,我所选字段的数据都会出现,但每个值都会作为一个长字符串导出到a列中它自己的行中。例如,如果我选择以下字段(状态、ip\U地址、mac\U地址、备注、所有者、成本、po\U编号和描述),我会得到以下结果:

第1行:
[状态][ip地址][mac地址][备注][所有者][成本][采购订单编号][说明]

第2行:
[{Status=SIGNEDOUT,ip_address=10.10.121.25,mac_address=10.10.134.11,note=,owner=John Smith,cost=35.00,po_number=G348,description=这是项目的说明。}[]

有人知道如何将这些值分解到正确的列单元格中,而不是作为一个巨大的长字符串吗

下面的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using InventoryTracker.DAL;
using OfficeOpenXml;
using InventoryTracker.Models;
using System.Linq.Dynamic;


namespace InventoryTracker.Controllers
{
    public class ExportController : Controller
    {
        InventoryTrackerContext _db = new InventoryTrackerContext();
        public static List<DynamicColumns> DynamicColumnsCollection = new List<DynamicColumns>();

        [HttpPost]
        public ActionResult ExportUsingEPPlus(ExportAssetsViewModel model)
        {
            ExcelPackage package = new ExcelPackage();
            var ws = package.Workbook.Worksheets.Add("TestExport");

            var exportFields = new List<string>();
            foreach (var selectedField in model.SelectedFields)
            {
                // Adds selected fields to [exportFields] List<string>
                exportFields.Add(model.ListOfExportFields.First(s => s.Key == selectedField).Value);
            }

            IQueryable selectStatement = DynamicSelectionColumns(exportFields);

            // Loops to insert column headings into Row 1 of Excel
            for (int i = 0; i < exportFields.Count(); i++)
            {
                ws.Cells[1, i + 1].Value = exportFields[i].ToString();
            }

            // Insert Data -- Currently all one long string in Column A per record
            if (selectStatement.Count() > 0)
            {
                ws.Cells["A2"].LoadFromCollection(selectStatement.Cast<object>(), true);
            }

            var memoryStream = new MemoryStream();
            package.SaveAs(memoryStream);

            string fileName = "Exported-InventoryAssets-" + DateTime.Now + ".xlsx";
            string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

            memoryStream.Position = 0;
            return File(memoryStream, contentType, fileName);
        }

        public IQueryable DynamicSelectionColumns(List<string> fieldsForExport)
        {
            using (var db = new InventoryTrackerContext())
            {
                string fieldIds = "," + "4,5,3,2,6,17,11,12" + ",";

                var taskColum = Enum.GetValues(typeof(EnumTasks)).Cast<EnumTasks>().Where(e => fieldIds.Contains("," + ((int)e).ToString() + ",")).Select(e => e.ToString().Replace("_", ""));

                string select = "new (  " + string.Join(", ", fieldsForExport) + ")";

                return db.INV_Assets.ToList().Select(t => new DynamicColumns()
                {
                    Id = t.Id,
                    Manufacturer = Convert.ToString(t.Manufacturer.manufacturer_description),
                    Type = t.Type.type_description,
                    Location = t.Location.location_room,
                    Vendor = t.Vendor.vendor_name,
                    Status = t.Status.status_description,
                    ip_address = t.ip_address,
                    mac_address = t.mac_address,
                    note = t.note,
                    owner = t.owner,
                    //Module = t.Module != null ? t.Module.Name : "", 
                    cost = t.cost,
                    po_number = t.po_number,
                    description = t.description,
                    invoice_number = t.invoice_number,
                    serial_number = t.serial_number,
                    asset_tag_number = t.asset_tag_number,
                    acquired_date = t.acquired_date,
                    disposed_date = t.disposed_date,
                    verified_date = t.verified_date,
                    created_date = t.created_date,
                    created_by = t.created_by,
                    modified_date = t.modified_date,
                    modified_by = t.modified_by
                }).ToList().AsQueryable().Select(select);
            }
        }
    }

    public class DynamicColumns : INV_Assets
    {
        public string Model { get; set; }
        public string Manufacturer { get; set; }
        public string Type { get; set; }
        public string Location { get; set; }
        public string Vendor { get; set; }
        public string Status { get; set; }
        public string ip_address { get; set; }
        public string mac_address { get; set; }
        public string note { get; set; }
        public string owner { get; set; }
        public decimal cost { get; set; }
        public string po_number { get; set; }
        public string description { get; set; }
        public int invoice_number { get; set; }
        public string serial_number { get; set; }
        public string asset_tag_number { get; set; }
        public DateTime? acquired_date { get; set; }
        public DateTime? disposed_date { get; set; }
        public DateTime? verified_date { get; set; }
        public DateTime created_date { get; set; }
        public string created_by { get; set; }
        public DateTime? modified_date { get; set; }
        public string modified_by { get; set; }
    }

    public enum EnumTasks
    {
        Model = 1,
        Manufacturer = 2,
        Type = 3,
        Location = 4,
        Vendor = 5,
        Status = 6,
        ip_address = 7,
        mac_address = 8,
        note = 9,
        owner = 10,
        cost = 11,
        po_number = 12,
        description = 13,
        invoice_number = 14,
        serial_number = 15,
        asset_tag_number = 16,
        acquired_date = 17,
        disposed_date = 18,
        verified_date = 19,
        created_date = 20,
        created_by = 21,
        modified_date = 22,
        modified_by = 23
    }
}
但是,当执行当前导出时,excel中的
[状态]
列在导出的每个记录的每个单元格中都包含
InventoryTracker.Models.INV\u Status
,而不是说
可用


任何人都可以深入了解如何不仅将直接导出的
INV_Assets
字段,而且将
模型、位置、状态、供应商、制造商和类型的
ForeignKey
值也导入Excel?

您不需要动态查询。您可以在
LoadFromCollection
中指定要显示的字段。 我没有编译这个(因为这是你的代码),但它在我的机器上用假数据工作

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.IO;
    using InventoryTracker.DAL;
    using OfficeOpenXml;
    using InventoryTracker.Models;
    using System.Reflection;
    using OfficeOpenXml.Table;


    namespace InventoryTracker.Controllers
    {
        public class ExportController : Controller
        {
            private InventoryTrackerContext _db = new InventoryTrackerContext();

            [HttpPost]
            public ActionResult ExportUsingEPPlus(ExportAssetsViewModel model)
            {
                //FileInfo newExcelFile = new FileInfo(output);
                ExcelPackage package = new ExcelPackage();
                var ws = package.Workbook.Worksheets.Add("TestExport");

                var exportFields = new List<string>();
                foreach (var selectedField in model.SelectedFields)
                {
                    // Adds selected fields to [exportFields] List<string>
                    exportFields.Add(model.ListOfExportFields.First(s => s.Key == selectedField).Value);
                }

                // Loops to insert column headings into Row 1 of Excel
                for (int i = 0; i < exportFields.Count(); i++)
                {
                    ws.Cells[1, i + 1].Value = exportFields[i].ToString();
                }

                var membersToShow = typeof(INV_Asset).GetMembers()
                    .Where(p => exportFields.Contains(p.Name))
                    .ToArray();

                ws.Cells["A2"].LoadFromCollection(_db.INV_Assets.ToList(), false, TableStyles.None, BindingFlags.Default, membersToShow);


                var memoryStream = new MemoryStream();
                package.SaveAs(memoryStream);

                string fileName = "Exported-InventoryAssets-" + DateTime.Now + ".xlsx";
                string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

                memoryStream.Position = 0;
                return File(memoryStream, contentType, fileName);
            }
        }
    }
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.Mvc;
使用System.Web.UI;
使用System.Web.UI.WebControl;
使用System.IO;
使用InventoryTracker.DAL;
使用OfficeOpenXml;
使用InventoryTracker.Models;
运用系统反思;
使用OfficeOpenXml.Table;
命名空间InventoryTracker.Controllers
{
公共类导出控制器:控制器
{
私有InventoryTrackerContext_db=新的InventoryTrackerContext();
[HttpPost]
公共行动结果ExportUsingApplus(ExportAssetViewModel模型)
{
//FileInfo newExcelFile=newfileinfo(输出);
ExcelPackage=新的ExcelPackage();
var ws=package.Workbook.Worksheets.Add(“TestExport”);
var exportFields=新列表();
foreach(模型中的变量selectedField.SelectedFields)
{
//将选定字段添加到[exportFields]列表中
Add(model.ListOfExportFields.First(s=>s.Key==selectedField.Value);
}
//循环将列标题插入Excel的第1行
对于(int i=0;iexportFields.Contains(p.Name))
.ToArray();
ws.Cells[“A2”].LoadFromCollection(_db.INV_Assets.ToList(),false,TableStyles.None,BindingFlags.Default,membersToShow);
var memoryStream=新的memoryStream();
package.SaveAs(memoryStream);
string fileName=“导出的InventoryAssets-”+日期时间.Now+“.xlsx”;
string contentType=“application/vnd.openxmlformats officedocument.spreadsheetml.sheet”;
memoryStream.Position=0;
返回文件(memoryStream、contentType、文件名);
}
}
}

在我所需的每个模型上添加了一个
ToString()
覆盖,以确保值通过,而不仅仅是对象类型:

public class INV_Models
{

    public override string ToString()
    {
        return this.model_description;
    }
}

public class INV_Manufacturers
{
    public override string ToString()
    {
        return this.manufacturer_description;
    }
}

public class INV_Locations
{
    public override string ToString()
    {
        return this.location_dept + "|" + this.location_room;
    }
}

public class INV_Vendors
{
    public override string ToString()
    {
        return this.vendor_name;
    }
}

public class INV_Types
{
    public override string ToString()
    {
        return this.type_description;
    }
}

public class INV_Statuses
{
    public override string ToString()
    {
        return this.status_description;
    }
}
导出控制器

    [HttpPost]
    public ActionResult ExportUsingEPPlus(ExportAssetsViewModel model)
    {
        ExcelPackage package = new ExcelPackage();
        var ws = package.Workbook.Worksheets.Add("TestExport");

        var exportFields = new List<string>();
        foreach (var selectedField in model.SelectedFields)
        {
            // Adds selected fields to [exportFields] List<string>
            exportFields.Add(model.ListOfExportFields.First(s => s.Key == selectedField).Value);
        }

       {
            ws.Cells[1, i + 1].Value = exportFields[i].ToString();
        }

        var membersToShow = typeof(INV_Assets).GetMembers().Where(p => exportFields.Contains(p.Name)).ToArray();

        ws.Cells["A2"].LoadFromCollection(_db.INV_Assets.ToList(), false, TableStyles.None, BindingFlags.Default, membersToShow);

        var memoryStream = new MemoryStream();
        package.SaveAs(memoryStream);

        string fileName = "Exported-InventoryAssets-" + DateTime.Now + ".xlsx";
        string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        memoryStream.Position = 0;
        return File(memoryStream, contentType, fileName);
    }
    [HttpPost]
    public ActionResult ExportUsingEPPlus(ExportAssetsViewModel model)
    {
        ExcelPackage package = new ExcelPackage();
        var ws = package.Workbook.Worksheets.Add("TestExport");

        var exportFields = new List<string>();
        foreach (var selectedField in model.SelectedFields)
        {
            // Adds selected fields to [exportFields] List<string>
            exportFields.Add(model.ListOfExportFields.First(s => s.Key == selectedField).Value);
        }

        // Loops to insert column headings into Row 1 of Excel
        for (int i = 0; i < exportFields.Count(); i++)
        {
            ws.Cells[1, i + 1].Value = exportFields[i].ToString();
        }

        var membersToShow = typeof(INV_Assets).GetMembers().Where(p => exportFields.Contains(p.Name)).ToArray();

        ws.Cells["A2"].LoadFromCollection(_db.INV_Assets.ToList(), false, TableStyles.None, BindingFlags.Default, membersToShow);



        var membersToShow = typeof(INV_Assets).GetMembers().Where(p => exportFields.Contains(p.Name)).ToArray();

        var memoryStream = new MemoryStream();
        package.SaveAs(memoryStream);

        string fileName = "Exported-InventoryAssets-" + DateTime.Now + ".xlsx";
        string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        memoryStream.Position = 0;
        return File(memoryStream, contentType, fileName);
    }
[HttpPost]
公共行动结果ExportUsingApplus(ExportAssetViewModel模型)
{
ExcelPackage=新的ExcelPackage();
var ws=package.Workbook.Worksheets.Add(“TestExport”);
var exportFields=新列表();
foreach(模型中的变量selectedField.SelectedFields)
{
//将选定字段添加到[exportFields]列表中
Add(model.ListOfExportFields.First(s=>s.Key==selectedField.Value);
}
//循环将列标题插入Excel的第1行
对于(int i=0;iexportFields.Contains(p.Name)).ToArray();
ws.Cells[“A2”].LoadFromCollection(_db.INV_Assets.ToList(),false,TableStyles.None,BindingFlags.Default,membersToShow);
var membersToShow=typeof(INV_资产).GetMembers().Where(p=>exportFields.Contains(p.Name)).ToArray();
var memoryStream=新的memoryStream();
package.SaveAs(memoryStream);
string fileName=“导出的InventoryAssets-”+日期时间.Now+“.xlsx”;
string contentType=“application/vnd.openxmlformats officedocument.spreadsheetml.sheet”;
memoryStream.Position=0;
返回文件(memoryStream、contentType、文件名);
}
以及输出Excel文件:


谢谢@João!这取得了很大的进步。现在所有的字段都显示为expor
    [HttpPost]
    public ActionResult ExportUsingEPPlus(ExportAssetsViewModel model)
    {
        ExcelPackage package = new ExcelPackage();
        var ws = package.Workbook.Worksheets.Add("TestExport");

        var exportFields = new List<string>();
        foreach (var selectedField in model.SelectedFields)
        {
            // Adds selected fields to [exportFields] List<string>
            exportFields.Add(model.ListOfExportFields.First(s => s.Key == selectedField).Value);
        }

        // Loops to insert column headings into Row 1 of Excel
        for (int i = 0; i < exportFields.Count(); i++)
        {
            ws.Cells[1, i + 1].Value = exportFields[i].ToString();
        }

        var membersToShow = typeof(INV_Assets).GetMembers().Where(p => exportFields.Contains(p.Name)).ToArray();

        ws.Cells["A2"].LoadFromCollection(_db.INV_Assets.ToList(), false, TableStyles.None, BindingFlags.Default, membersToShow);



        var membersToShow = typeof(INV_Assets).GetMembers().Where(p => exportFields.Contains(p.Name)).ToArray();

        var memoryStream = new MemoryStream();
        package.SaveAs(memoryStream);

        string fileName = "Exported-InventoryAssets-" + DateTime.Now + ".xlsx";
        string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        memoryStream.Position = 0;
        return File(memoryStream, contentType, fileName);
    }