I'm trying to export a List<dynamic> or IEnumerable to an Excel file using the library Open XML of Microsoft.
List<dynamic>
IEnumerable
Library: I'm trying to export a List<dynamic> or IEnumerable to an Excel file using the library Open XML of Microsoft. Library:
Library:
首页 > 解决方案 > 如何从列表中导出 C# 中的数据 or IEnumerable to Excel (MS OpenXml)? I'm trying to export a List<dynamic> or IEnumerable to an Excel file using the library Open XML of Microsoft. Library: c# - 如何从列表中导出 C# 中的数据 or IEnumerable to Excel (MS OpenXml)? I'm trying to export a List<dynamic> or IEnumerable to an Excel file using the library Open XML of Microsoft. Library: 问题描述 I'm trying to export a List<dynamic> or IEnumerable to an Excel file using the library Open XML of Microsoft. Library: https://github.com/OfficeDev/Open-XML-SDK Example of similar request: https://www.codeproject.com/Articles/692121/Csharp-Export-data-to-Excel-using-OpenXML-librarie The example above works pretty fine but have a lot of code between (As far works neat, but I searching for an optimization) But the documentation of this library does not extend (or hasn't many examples), and the examples that I saw around about how to export data to Excel it's using a DataTable or Dataset; so, they make the conversation from the List to DataTable to export the DataTable. And that seems pretty complex way to something that other libraries resolve easier. So, if someone has a sort of example of how to make the export quickly and generic, it will be appreciated. How to find an empty cell in a row and return corresponding column header? Using this data, I'm looking to write a formula that will return the Phase a client is currently in - i.e. the next consecutive phase that does NOT have an "X" in its column: This is my desired outcome, where Phase will automatically update as phases are marked with an "X" in the above data sheet: INDEX-MATCH seems useful here, but I'm not sure how to look for the next empty cell in a row (i.e. current phase) and how to return the Phase in the first row. 标签: c#excelasp.net-coreopenxmlopenxml-sdk 解决方案 仅供参考,这是我的实现,使用@mikesknowledgebase 的代码(http://www.mikesknowledgebase.com - 网页不起作用......但至少要给予学分:D) 在此处发布所有信息 所以,我将它用于 .Net Core 2.2;目的是使用该方法将 a 导出List<dynamic>到Excel. 最终结果(在最简单的例子中): [HttpGet("[action]")] public FileResult exportExample() { List<dynamic> data = new List<dynamic>(); data.Add(new { a = 1, b = "HELLO WORLD", c = DateTime.Now }); data.Add(new { a = 2, b = "TEST", c = 34 }); // Implementation of Dictionary to limit the columns and the type of the List // Works with some standard, and flat files (Not with Dynamic Objects that have multiples levels - Indentation of a dynamic into a property) Dictionary<string, Type> columns = new Dictionary<string, Type>(); columns.Add("a", typeof(int)); columns.Add("b", typeof(string)); columns.Add("c", typeof(object)); // Accepts any (Numbers or DateTime) string excelContentType; var excelStream = CreateExcelFile.CreateExcelStream(data, columns, out excelContentType); return File(excelStream, excelContentType, "report.xlsx"); } 我在 Mike 的类中创建了一些其他方法...... 获取列的方法List...Dictionary<string, type>和另一个返回的参数ContentType: public static byte[] CreateExcelStream<T>(List<T> list, Dictionary<string, Type> columns, out string contentType ) { DataSet ds = new DataSet(); ds.Tables.Add(ListToDataTable(list, columns)); contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; // "application/vnd.ms-excel"; return CreateExcelStream(ds).fwToByteArray(); } 另一种将 转换List为 a 的方法DataTable: public static DataTable ListToDataTable<dynamic>(List<dynamic> list, Dictionary<string, Type> columns) { DataTable dt = new DataTable(); foreach (var column in columns) dt.Columns.Add(new DataColumn(column.Key, GetNullableType(column.Value))); foreach (var t in list) { DataRow row = dt.NewRow(); ((object)t) .GetType() .GetProperties() .ToList() .ForEach(p => { if (!IsNullableType(p.PropertyType)) row[p.Name] = p.GetValue(t, null); else row[p.Name] = (p.GetValue(t, null) ?? DBNull.Value); }); dt.Rows.Add(row); } return dt; } 我包括一个将 a 转换stream为 a的扩展byteArray: public static byte[] fwToByteArray(this Stream stream) { stream.Position = 0; byte[] buffer = new byte[stream.Length]; for (int totalBytesCopied = 0; totalBytesCopied < stream.Length;) totalBytesCopied += stream.Read(buffer, totalBytesCopied, Convert.ToInt32(stream.Length) - totalBytesCopied); return buffer; } 其余代码仍然相同......结果如下: 推荐阅读 javascript - 如何在后端创建快速的自动完成功能fullpage.js - 你如何从 fullpage.js 的检查元素中隐藏许可证密钥?cumulocity - 在 node.js 命令提示符中找不到插件错误reactjs - location.search 的更改不会触发重新渲染swift - 想在 NStableview 中打开一个 plistpython - 过滤掉熊猫数据框中的重复数据sql - 可以将 numpy 矩阵转换为数据库表吗?python - 访问行 [0] 时读取 CSV 文件会出现 IndexErrorjavascript - 使用 jquery 加载时 Highcharts “单击”范围,或加载时 addSeriesandroid - 安卓应用和服务器之间的安全验证过程
Library: c# - 如何从列表中导出 C# 中的数据 or IEnumerable to Excel (MS OpenXml)? I'm trying to export a List<dynamic> or IEnumerable to an Excel file using the library Open XML of Microsoft. Library: 问题描述 I'm trying to export a List<dynamic> or IEnumerable to an Excel file using the library Open XML of Microsoft. Library: https://github.com/OfficeDev/Open-XML-SDK Example of similar request: https://www.codeproject.com/Articles/692121/Csharp-Export-data-to-Excel-using-OpenXML-librarie The example above works pretty fine but have a lot of code between (As far works neat, but I searching for an optimization) But the documentation of this library does not extend (or hasn't many examples), and the examples that I saw around about how to export data to Excel it's using a DataTable or Dataset; so, they make the conversation from the List to DataTable to export the DataTable. And that seems pretty complex way to something that other libraries resolve easier. So, if someone has a sort of example of how to make the export quickly and generic, it will be appreciated. How to find an empty cell in a row and return corresponding column header? Using this data, I'm looking to write a formula that will return the Phase a client is currently in - i.e. the next consecutive phase that does NOT have an "X" in its column: This is my desired outcome, where Phase will automatically update as phases are marked with an "X" in the above data sheet: INDEX-MATCH seems useful here, but I'm not sure how to look for the next empty cell in a row (i.e. current phase) and how to return the Phase in the first row. 标签: c#excelasp.net-coreopenxmlopenxml-sdk 解决方案 仅供参考,这是我的实现,使用@mikesknowledgebase 的代码(http://www.mikesknowledgebase.com - 网页不起作用......但至少要给予学分:D) 在此处发布所有信息 所以,我将它用于 .Net Core 2.2;目的是使用该方法将 a 导出List<dynamic>到Excel. 最终结果(在最简单的例子中): [HttpGet("[action]")] public FileResult exportExample() { List<dynamic> data = new List<dynamic>(); data.Add(new { a = 1, b = "HELLO WORLD", c = DateTime.Now }); data.Add(new { a = 2, b = "TEST", c = 34 }); // Implementation of Dictionary to limit the columns and the type of the List // Works with some standard, and flat files (Not with Dynamic Objects that have multiples levels - Indentation of a dynamic into a property) Dictionary<string, Type> columns = new Dictionary<string, Type>(); columns.Add("a", typeof(int)); columns.Add("b", typeof(string)); columns.Add("c", typeof(object)); // Accepts any (Numbers or DateTime) string excelContentType; var excelStream = CreateExcelFile.CreateExcelStream(data, columns, out excelContentType); return File(excelStream, excelContentType, "report.xlsx"); } 我在 Mike 的类中创建了一些其他方法...... 获取列的方法List...Dictionary<string, type>和另一个返回的参数ContentType: public static byte[] CreateExcelStream<T>(List<T> list, Dictionary<string, Type> columns, out string contentType ) { DataSet ds = new DataSet(); ds.Tables.Add(ListToDataTable(list, columns)); contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; // "application/vnd.ms-excel"; return CreateExcelStream(ds).fwToByteArray(); } 另一种将 转换List为 a 的方法DataTable: public static DataTable ListToDataTable<dynamic>(List<dynamic> list, Dictionary<string, Type> columns) { DataTable dt = new DataTable(); foreach (var column in columns) dt.Columns.Add(new DataColumn(column.Key, GetNullableType(column.Value))); foreach (var t in list) { DataRow row = dt.NewRow(); ((object)t) .GetType() .GetProperties() .ToList() .ForEach(p => { if (!IsNullableType(p.PropertyType)) row[p.Name] = p.GetValue(t, null); else row[p.Name] = (p.GetValue(t, null) ?? DBNull.Value); }); dt.Rows.Add(row); } return dt; } 我包括一个将 a 转换stream为 a的扩展byteArray: public static byte[] fwToByteArray(this Stream stream) { stream.Position = 0; byte[] buffer = new byte[stream.Length]; for (int totalBytesCopied = 0; totalBytesCopied < stream.Length;) totalBytesCopied += stream.Read(buffer, totalBytesCopied, Convert.ToInt32(stream.Length) - totalBytesCopied); return buffer; } 其余代码仍然相同......结果如下: 推荐阅读 javascript - 如何在后端创建快速的自动完成功能fullpage.js - 你如何从 fullpage.js 的检查元素中隐藏许可证密钥?cumulocity - 在 node.js 命令提示符中找不到插件错误reactjs - location.search 的更改不会触发重新渲染swift - 想在 NStableview 中打开一个 plistpython - 过滤掉熊猫数据框中的重复数据sql - 可以将 numpy 矩阵转换为数据库表吗?python - 访问行 [0] 时读取 CSV 文件会出现 IndexErrorjavascript - 使用 jquery 加载时 Highcharts “单击”范围,或加载时 addSeriesandroid - 安卓应用和服务器之间的安全验证过程
Library: 问题描述 I'm trying to export a List<dynamic> or IEnumerable to an Excel file using the library Open XML of Microsoft. Library: https://github.com/OfficeDev/Open-XML-SDK Example of similar request: https://www.codeproject.com/Articles/692121/Csharp-Export-data-to-Excel-using-OpenXML-librarie The example above works pretty fine but have a lot of code between (As far works neat, but I searching for an optimization) But the documentation of this library does not extend (or hasn't many examples), and the examples that I saw around about how to export data to Excel it's using a DataTable or Dataset; so, they make the conversation from the List to DataTable to export the DataTable. And that seems pretty complex way to something that other libraries resolve easier. So, if someone has a sort of example of how to make the export quickly and generic, it will be appreciated.
Library: https://github.com/OfficeDev/Open-XML-SDK
Example of similar request: https://www.codeproject.com/Articles/692121/Csharp-Export-data-to-Excel-using-OpenXML-librarie
The example above works pretty fine but have a lot of code between (As far works neat, but I searching for an optimization)
But the documentation of this library does not extend (or hasn't many examples), and the examples that I saw around about how to export data to Excel it's using a DataTable or Dataset; so, they make the conversation from the List to DataTable to export the DataTable. And that seems pretty complex way to something that other libraries resolve easier.
DataTable
Dataset
List
So, if someone has a sort of example of how to make the export quickly and generic, it will be appreciated.
Using this data, I'm looking to write a formula that will return the Phase a client is currently in - i.e. the next consecutive phase that does NOT have an "X" in its column:
This is my desired outcome, where Phase will automatically update as phases are marked with an "X" in the above data sheet:
INDEX-MATCH seems useful here, but I'm not sure how to look for the next empty cell in a row (i.e. current phase) and how to return the Phase in the first row.
标签: c#excelasp.net-coreopenxmlopenxml-sdk
仅供参考,这是我的实现,使用@mikesknowledgebase 的代码(http://www.mikesknowledgebase.com - 网页不起作用......但至少要给予学分:D)
在此处发布所有信息
所以,我将它用于 .Net Core 2.2;目的是使用该方法将 a 导出List<dynamic>到Excel.
Excel
最终结果(在最简单的例子中):
[HttpGet("[action]")] public FileResult exportExample() { List<dynamic> data = new List<dynamic>(); data.Add(new { a = 1, b = "HELLO WORLD", c = DateTime.Now }); data.Add(new { a = 2, b = "TEST", c = 34 }); // Implementation of Dictionary to limit the columns and the type of the List // Works with some standard, and flat files (Not with Dynamic Objects that have multiples levels - Indentation of a dynamic into a property) Dictionary<string, Type> columns = new Dictionary<string, Type>(); columns.Add("a", typeof(int)); columns.Add("b", typeof(string)); columns.Add("c", typeof(object)); // Accepts any (Numbers or DateTime) string excelContentType; var excelStream = CreateExcelFile.CreateExcelStream(data, columns, out excelContentType); return File(excelStream, excelContentType, "report.xlsx"); }
我在 Mike 的类中创建了一些其他方法......
获取列的方法List...Dictionary<string, type>和另一个返回的参数ContentType:
Dictionary<string, type>
ContentType
public static byte[] CreateExcelStream<T>(List<T> list, Dictionary<string, Type> columns, out string contentType ) { DataSet ds = new DataSet(); ds.Tables.Add(ListToDataTable(list, columns)); contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; // "application/vnd.ms-excel"; return CreateExcelStream(ds).fwToByteArray(); }
另一种将 转换List为 a 的方法DataTable:
public static DataTable ListToDataTable<dynamic>(List<dynamic> list, Dictionary<string, Type> columns) { DataTable dt = new DataTable(); foreach (var column in columns) dt.Columns.Add(new DataColumn(column.Key, GetNullableType(column.Value))); foreach (var t in list) { DataRow row = dt.NewRow(); ((object)t) .GetType() .GetProperties() .ToList() .ForEach(p => { if (!IsNullableType(p.PropertyType)) row[p.Name] = p.GetValue(t, null); else row[p.Name] = (p.GetValue(t, null) ?? DBNull.Value); }); dt.Rows.Add(row); } return dt; }
我包括一个将 a 转换stream为 a的扩展byteArray:
stream
byteArray
public static byte[] fwToByteArray(this Stream stream) { stream.Position = 0; byte[] buffer = new byte[stream.Length]; for (int totalBytesCopied = 0; totalBytesCopied < stream.Length;) totalBytesCopied += stream.Read(buffer, totalBytesCopied, Convert.ToInt32(stream.Length) - totalBytesCopied); return buffer; }
其余代码仍然相同......结果如下: