使用C#MVC中的Eppplus将数据表导出到XLSX
我正在尝试在MVC应用程序中使用epplus将数据表导出到excel。这是我的代码,但我的excel文件显示的不是从datatable导出数据 容量----计数使用C#MVC中的Eppplus将数据表导出到XLSX,c#,asp.net-mvc,epplus,C#,Asp.net Mvc,Epplus,我正在尝试在MVC应用程序中使用epplus将数据表导出到excel。这是我的代码,但我的excel文件显示的不是从datatable导出数据 容量----计数 256------206 这是我正在使用的代码: public IActionResult ToExcelWeGo() { string workbookName = null; var data = _context.testtable.FromSqlRaw("Select * from hiringInfo").ToList
256------206 这是我正在使用的代码:
public IActionResult ToExcelWeGo()
{
string workbookName = null;
var data = _context.testtable.FromSqlRaw("Select * from hiringInfo").ToList();
DataTable dt = new DataTable();
dt = ObjectToData(data);
using (ExcelPackage pack = new ExcelPackage())
{
ExcelWorksheet objWorksheet = pck.WOrkbook.WOrksheets.Add("Sheet1");
objWorksheet.Name = "Test";
workbookName = "Test Workbook.xlsx";
var contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
var fileStream = new MemoryStream();
pck.SaveAs(fileStream);
fileStream.Position = 0;
var fsr = new FileStreamResult(fileStream, contentType);
fsr.FileDownloadName = workbookName;
return fsr;
}
}
public static DataTable ObjectToData(object o)
{
DataTable dt = new DataTable("OutputData");
DataRow dr = dt.NewRow();
dt.Rows.Add(dr);
o.GetType().GetProperties().ToList().ForEach(f =>
{
try
{
f.GetValue(o, null);
dt.Columns.Add(f.Name, f.PropertyType);
dt.Rows[0][f.Name] = f.GetValue(o, null);
}
catch {}
});
return dt;
}
为什么我的DataTable没有按预期显示?创建DataExporter类:
public static class DataExporter
{
static DataTable dtExcel = new DataTable();
private static void ReadData(string query)
{
//Get Datatable here by query or you can use LINQtoDataTable
dtExcel = DBQuery.GetDataTableByQuery(query);
}
private static Byte[] PrepareByte(DataTable dt)
{
Byte[] bytes;
int colCount = dt.Columns.Count;
ExcelPackage excel = new ExcelPackage();
var workSheet = excel.Workbook.Worksheets.Add("Sheet1");
workSheet.DefaultRowHeight = 12;
workSheet.Row(1).Height = 20;
workSheet.Row(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
workSheet.Row(1).Style.Font.Bold = true;
for (int looper = 1; looper <= colCount; looper++)
workSheet.Cells[1, looper].Value = dt.Columns[looper - 1].ColumnName;
for (int looper = 1; looper <= colCount; looper++)
{
workSheet.Cells[1, looper].Style.Border.Top.Style = ExcelBorderStyle.Thin;
workSheet.Cells[1, looper].Style.Border.Left.Style = ExcelBorderStyle.Thin;
workSheet.Cells[1, looper].Style.Border.Right.Style = ExcelBorderStyle.Thin;
workSheet.Cells[1, looper].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
}
for (int rowNo = 0; rowNo < dt.Rows.Count; rowNo++)
{
for (int colNo = 0; colNo < colCount; colNo++)
workSheet.Cells[rowNo + 2, colNo + 1].Value = dt.Rows[rowNo][colNo];
for (int innerLooper = 1; innerLooper <= colCount; innerLooper++)
{
workSheet.Cells[rowNo + 2, innerLooper].Style.Border.Top.Style = ExcelBorderStyle.Thin;
workSheet.Cells[rowNo + 2, innerLooper].Style.Border.Left.Style = ExcelBorderStyle.Thin;
workSheet.Cells[rowNo + 2, innerLooper].Style.Border.Right.Style = ExcelBorderStyle.Thin;
workSheet.Cells[rowNo + 2, innerLooper].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
}
}
for (int looper = 1; looper <= colCount; looper++)
workSheet.Column(looper).AutoFit();
bytes = excel.GetAsByteArray();
return bytes;
}
public static Byte[] GetBytes(string query)
{
Byte[] bytes;
ReadData(query);
bytes = PrepareByte(dtExcel);
return bytes;
}
public static Byte[] GetBytes(DataTable dt)
{
Byte[] bytes;
bytes = PrepareByte(dt);
return bytes;
}
}
公共行动结果报告Excel() {
DataTable DataTable=new System.Data.DataTable();
//用一些数据填充数据表,我只使用空数据表
System.Text.StringBuilder htmlstr=新的System.Text.StringBuilder();
htmlstr.追加(“”);
htmlstr.追加(“”);
foreach(dataTable.Columns中的System.Data.DataColumn列)
{
追加($“{column.ColumnName}”);
}
htmlstr.Append($“”);
foreach(dataTable.Rows中的System.Data.DataRow dr)
{
htmlstr.追加(“”);
foreach(dataTable.Columns中的System.Data.DataColumn列)
{
htmlstr.Append($“{dr[column.ColumnName]}”);
}
htmlstr.Append($“”);
}
htmlstr.Append($“”);
AddHeader(“内容处置”、“附件;文件名=report.xls”);
返回内容(htmlstr.ToString(),“应用程序/ms excel”);
}Hi-我使用Response得到多个编译错误。例如,我得到的“HttpResponse”不包含“ClearHeaders”的定义,并且找不到接受“HttpResponse”类型的第一个参数的可访问扩展方法。我在ClearHeaders()、Buffer、AddHeader、OutputStream、Flush、HttpContext.Current.ApplicationInstance.CompleteRequest()上得到了这个结果;请检查此链接以了解您的问题:由于您正在将
数据
对象传递给方法,因此它在错误的级别执行GetType
,因此它只是获取它的属性-在这种情况下,它看起来像是容量
和计数
。由于您正在调用ToList()
,因此是否可以使用类似于LoadFromCollection
的方法?或LoadFromArray
。如果性能是一个问题,并且您想编写自己的,那么您应该一次循环一个集合。@ErnieS-那么在我上面的示例中,我应该如何编写它?var data的类型是什么?这是一个通用列表吗?如果是,什么类型的T
?请在代码中添加注释并解释您的答案
DataTable dt = new DataTable();
dt.Columns.Add("EMP_ID", typeof(string));
dt.Columns.Add("EMP_NAME", typeof(string));
dt.Columns.Add("DEPARTMENT_NAME", typeof(string));
dt.Columns.Add("DESIGNATION", typeof(string));
dt.Columns.Add("BRANCH", typeof(string));
dt.Columns.Add("AMOUNT", typeof(double));
Byte[] bytes = DataExporter.GetBytes(dt);
Response.ClearHeaders();
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-length", bytes.Length.ToString());
Response.AddHeader("content-disposition", "attachment; filename=AddDataUpload.xlsx");
Response.OutputStream.Write(bytes, 0, bytes.Length);
Response.Flush();
HttpContext.Current.ApplicationInstance.CompleteRequest();
DataTable dataTable = new System.Data.DataTable();
//fill datatable by some data i just use empty databale
System.Text.StringBuilder htmlstr = new System.Text.StringBuilder();
htmlstr.Append("<table border='1px'>");
htmlstr.Append("<tr>");
foreach (System.Data.DataColumn column in dataTable.Columns)
{
htmlstr.Append($"<th>{column.ColumnName}</th>");
}
htmlstr.Append($"</tr>");
foreach (System.Data.DataRow dr in dataTable.Rows)
{
htmlstr.Append("<tr>");
foreach (System.Data.DataColumn column in dataTable.Columns)
{
htmlstr.Append($"<td>{dr[column.ColumnName]}</td>");
}
htmlstr.Append($"</tr>");
}
htmlstr.Append($"</table>");
Response.AddHeader("content-disposition", "attachment;filename=report.xls");
return Content(htmlstr.ToString(), "application/ms-excel");