【问题标题】:How to convert DataSet to StringBuilder如何将 DataSet 转换为 StringBuilder
【发布时间】: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


【解决方案1】:

循环遍历 DataSet 的 DataTable 属性。

StringBuilder sb = new StringBuilder();

foreach(var table in DataSet.DataTable)
{
    YourCode(sb);
}

void YourCode(StringBuilder stringBuilder)
{
    DataTable fileData = ***Some Data***

    if (fileData.Rows.Count == 0) 
        return (true, "No Records");

    IEnumerable<string> columnNames = fileData
        .Columns
        .Cast<DataColumn>()
        .Select(column => column.ColumnName);

    stringBuilder.AppendLine(string.Join("|", columnNames));

    foreach (DataRow row in fileData.Rows)
    {
        IEnumerable<string> fields = row.ItemArray
            .Select(field => RemoveSpecialCharacters(field?.ToString().Replace(",",";"))); 

        stringBuilder.AppendLine(string.Join("|", fields));
    }
}

【讨论】:

    【解决方案2】:

    这不是您问题的直接答案,因为转换为 StringBuilder 没有意义。但是,您是说您会这样做以生成 Excel。我建议您使用 nuget 的 EPPlus 库。

    假设您有一个名为 ds 的数据集:

    ExcelPackage pck = new ExcelPackage();
    foreach (DataTable table in ds.Tables)
    {
        var ws = pck.Workbook.Worksheets.Add(table.TableName);
        ws.Cells["A1"].LoadFromDataTable(table, true);
    }
    
    var fi = new FileInfo(@"c:\temp\MyExcelDataSet.xlsx");
    if (fi.Exists)
    {
        fi.Delete();
    }
    pck.SaveAs(fi);
    

    【讨论】:

      猜你喜欢
      • 2020-09-28
      • 2021-12-22
      • 1970-01-01
      • 2020-10-15
      • 2011-04-01
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多