【发布时间】:2019-09-19 15:18:35
【问题描述】:
我有一个DataSet,其中有 4 个唯一的表。我想将整个 DataSet 转换为StringBuilder。
我知道我们可以使用下面的代码将DataTable 转换为StringBuilder。
DataTable fileData = ***Some Data***
if (fileData.Rows.Count == 0)
return (true, "No Records");
StringBuilder builder = new StringBuilder();
IEnumerable<string> columnNames = fileData
.Columns
.Cast<DataColumn>()
.Select(column => column.ColumnName);
builder.AppendLine(string.Join("|", columnNames));
foreach (DataRow row in fileData.Rows)
{
IEnumerable<string> fields = row.ItemArray
.Select(field => RemoveSpecialCharacters(field
?.ToString()
.Replace(",",";")));
builder.AppendLine(string.Join("|", fields));
}
如何将上述代码用于DataSet 数据。
编辑:
var byteArray = ec.GetBytes(builder.ToString());
var fileDataStream = new MemoryStream(byteArray);
我使用fileDataStream 来生成excel。
以上代码将DataTable转换为Stream,现在我想将DataSet转换为Stream,这样我就可以使用新的stream(DataSet数据)来生成excel。
更新 2:
我在DataSet 中使用了下面的代码,但只有DataSet 的最后一个表数据存储在StringBuilder 中,而不是所有4 个表数据。
foreach (DataTable dt in dataSetFileDetails.Tables)
{
if (dt.Rows.Count == 0) return (true, "No Records");
builder = new StringBuilder();
IEnumerable<string> columnNames = dt.Columns.Cast<DataColumn>().
Select(column => column.ColumnName);
builder.AppendLine(string.Join("|", columnNames));
foreach (DataRow row in dt.Rows)
{
IEnumerable<string> fields = row.ItemArray.Select(field => RemoveSpecialCharacters(field?.ToString().Replace(",", ";")));
builder.AppendLine(string.Join("|", fields));
}
}
【问题讨论】:
-
您的意思是使用
StringBuilder将DataSet 转换为管道分隔字符串吗? -
您可以通过 DataSet.Tables 属性(参见:docs.microsoft.com/en-us/dotnet/api/…)访问您已经拥有代码的 DataTable 对象。
-
转换为 StringBuilder 是什么意思?您可以使用 WriteXML 获取整个数据集的字符串表示 (XML)。或者您可以使用 Linq To CSV 以 csv 格式输出(这看起来就像您正在尝试做的事情)。您只需要循环数据集中的表即可。
-
啊,您正在尝试从流中创建 excel。然后查看 Excel 的 Ado.Stream 和 CopyFromRecordSet。它们是现成的功能。您也可以直接使用 Linq To Excel 或 ADO.net 来创建 excel 文件。或者更简单,使用 Nuget 中的 EPPLus 并将您的集合(表格)放到工作表中。
标签: c# asp.net asp.net-core