C# 如何更改CSVHelper中字段和字段名称的顺序
我正在使用asp.net mvc 4 web应用程序+实体框架5.0,我使用以下方法调用名为C# 如何更改CSVHelper中字段和字段名称的顺序,c#,asp.net,asp.net-mvc,entity-framework,csvhelper,C#,Asp.net,Asp.net Mvc,Entity Framework,Csvhelper,我正在使用asp.net mvc 4 web应用程序+实体框架5.0,我使用以下方法调用名为AdvanceSearchStoredProcess的函数,该函数将调用存储过程:- public IQueryable<AdvanceSearchSP_Result> AdvanceSearch(NetworkAdvanceSearch na) { var r = entities.AdvanceSearchStoredProcedure("netwo
AdvanceSearchStoredProcess
的函数,该函数将调用存储过程:-
public IQueryable<AdvanceSearchSP_Result> AdvanceSearch(NetworkAdvanceSearch na)
{
var r = entities.AdvanceSearchStoredProcedure("network",na.AssetTypeID,
na.ip, na.ipselection, na.mac, na.macselection);
return r.AsQueryable();
}
现在,我在生成的.CSV
文件中面临以下问题:-
AdvanceSearchSP\u Result\u Validation
MetadataType类中的定义ismanaged
成为.csv文件中的第一列public sealed class SPMap : ClassMap<AdvanceSearchSP_Result>
{
public SPMap()
{
Map(m => m.Tag).Name("Resource Tag").Index(0);
Map(m => m.RESOURCENAME).Name("Asset Name").Index(1);
Map(m => m.cusotmername).Name("Customer Name").Index(2);
Map(m => m.sitename).Name("Site Name").Index(3);
Map(m => m.StateName).Name("Asset State").Index(4);
Map(m => m.ismanaged).Name("ismanaged").Index(5);
Map(m => m.TypeName).Name("Technology Type ").Index(6);
Map(m => m.SERVICETAG).Name("Service Tag").Index(7);
Map(m => m.SERIALNO).Name("Serial Number").Index(8);
}
}
公共密封类SPMap:ClassMap
{
公共SPMap()
{
Map(m=>m.Tag).Name(“资源标签”).Index(0);
Map(m=>m.RESOURCENAME).Name(“资产名称”).Index(1);
Map(m=>m.cusotmername).Name(“客户名称”).Index(2);
地图(m=>m.sitename).Name(“sitename”).Index(3);
Map(m=>m.StateName).Name(“资产状态”).Index(4);
Map(m=>m.ismanaged).Name(“ismanaged”).Index(5);
Map(m=>m.TypeName).Name(“技术类型”).Index(6);
Map(m=>m.SERVICETAG).Name(“SERVICETAG”).Index(7);
Map(m=>m.SERIALNO).名称(“序列号”).索引(8);
}
}
然后,我修改我的方法以包括以下配置:-
public ActionResult AdvanceSearchIndexExport(AdvanceSearchSP_Result2 ns)
{
var result = WriteCsvToMemory(repository.AdvanceSearch(ns.NetwotkAS).ToList());
var memoryStream = new MemoryStream(result);
return new FileStreamResult(memoryStream, "text/csv") { FileDownloadName = "export.csv" };
}
public byte[] WriteCsvToMemory(IEnumerable<AdvanceSearchSP_Result> records)
{
using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream))
using (var csvWriter = new CsvWriter(streamWriter))
{
csvWriter.WriteRecords(records);
streamWriter.Flush();
return memoryStream.ToArray();
}
}
public byte[] WriteCsvToMemory(IEnumerable<AdvanceSearchSP_Result> records)
{
using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream))
using (var csvWriter = new CsvWriter(streamWriter))
{
csvWriter.WriteRecords(records);
csvWriter.Configuration.RegisterClassMap<SPMap>();
streamWriter.Flush();
return memoryStream.ToArray();
}
}
public byte[]写入内存(IEnumerable记录)
{
使用(var memoryStream=new memoryStream())
使用(var streamWriter=新streamWriter(memoryStream))
使用(var csvWriter=新的csvWriter(streamWriter))
{
CSV编写者编写记录(记录);
csvWriter.Configuration.RegisterClassMap();
streamWriter.Flush();
返回memoryStream.ToArray();
}
}
但我还是得到了旧名字和旧秩序。。因此,
公共密封类SPMap:ClassMap
似乎没有任何效果…我认为您需要一个映射来指定列的名称和索引:
public sealed class SPMap : ClassMap<AdvanceSearchSP_Result>
{
public SPMap()
{
Map(m => m.SERVICETAG).Name("Service Tag").Index(0);
Map(m => m.sitename).Name("Site Name").Index(1);
/*repeat for other properties */
..
..
}
}
公共密封类SPMap:ClassMap公共字节[]WriteItem(列表集合),其中T:class
{
类型t=类型(t);
字符串换行符=Environment.newLine;
object obj=Activator.CreateInstance(t);
PropertyInfo[]props=obj.GetType().GetProperties();
byte[]carineReturnBytes=System.Text.Encoding.UTF8.GetBytes(“\r”);
字符串文本;
使用(MemoryStream ms=new MemoryStream())
使用(StreamReader sr=新StreamReader(ms))
{
foreach(道具中的属性信息pi)
{
byte[]data=System.Text.Encoding.UTF8.GetBytes(pi.Name.ToString()+“,”);
ms.Write(数据,0,数据长度);
}
ms.Write(carineReturnBytes,0,carineReturnBytes.Length);
foreach(集合中的T项)
{
foreach(道具中的属性信息pi)
{
字符串写入=
Convert.ToString(item.GetType().GetProperty(pi.Name).GetValue(item,null)).Replace(“,”,“)+”,”;
byte[]data=System.Text.Encoding.UTF8.GetBytes(write);
ms.Write(数据,0,数据长度);
}
byte[]writeNewLine=System.Text.Encoding.UTF8.GetBytes(Environment.NewLine);
ms.Write(writeNewLine,0,writeNewLine.Length);
}
ms.Position=0;
text=sr.ReadToEnd();
返回ToArray女士();
}
}
但是我需要在哪里注册这个csvWriter.Configuration.RegisterClassMap()代码>??在global.asax内部?当我需要注册这个csvWriter.Configuration.RegisterClassMap()时,你能给我一些建议吗代码>??在我的行动方法里?我试过你的方法。。但是它不起作用。。你能检查我的编辑吗?@johnG MovecsvWriter.Configuration.RegisterClassMap()代码>代码中的一行。@johnG如上所述,您需要在写入csv文件之前注册映射,因此将注册行向上移动到写入行之上,然后它就可以工作了。我没有尝试过这个方法,但是如果你按照我在答案中的链接进行操作,它会在那里详细说明。你能检查我对原始问题的编辑吗?你尝试过上述方法吗?通过更改属性的顺序,你应该能够更改csv顺序。如果您仍然面临问题,请告诉我
public sealed class SPMap : ClassMap<AdvanceSearchSP_Result>
{
public SPMap()
{
Map(m => m.SERVICETAG).Name("Service Tag").Index(0);
Map(m => m.sitename).Name("Site Name").Index(1);
/*repeat for other properties */
..
..
}
}
csvWriter.Configuration.RegisterClassMap<SPMap>();
public byte[] WriteItem<T>(List<T> collection) where T : class
{
Type t = typeof(T);
string newLine = Environment.NewLine;
object obj = Activator.CreateInstance(t);
PropertyInfo[] props = obj.GetType().GetProperties();
byte[] carriageReturnBytes = System.Text.Encoding.UTF8.GetBytes("\r");
string text;
using (MemoryStream ms = new MemoryStream())
using (StreamReader sr = new StreamReader(ms))
{
foreach (PropertyInfo pi in props)
{
byte[] data = System.Text.Encoding.UTF8.GetBytes(pi.Name.ToString() + ",");
ms.Write(data, 0, data.Length);
}
ms.Write(carriageReturnBytes, 0, carriageReturnBytes.Length);
foreach (T item in collection)
{
foreach (PropertyInfo pi in props)
{
string write =
Convert.ToString(item.GetType().GetProperty(pi.Name).GetValue(item, null)).Replace(",", " ") + ',';
byte[] data = System.Text.Encoding.UTF8.GetBytes(write);
ms.Write(data, 0, data.Length);
}
byte[] writeNewLine = System.Text.Encoding.UTF8.GetBytes(Environment.NewLine);
ms.Write(writeNewLine, 0, writeNewLine.Length);
}
ms.Position = 0;
text = sr.ReadToEnd();
return ms.ToArray();
}
}