【问题标题】:How to convert a stream of Excel file to CSV?如何将 Excel 文件流转换为 CSV?
【发布时间】:2021-02-18 11:18:45
【问题描述】:

我有一个场景,我有一个存储 Blob,其中包含 Excel 文件,因此在代码级别我没有物理文件路径,所以它的文件流我将获得代码。我需要将其转换为 CSV 并将其推回存储。

尝试如下:-

  1. 尝试使用Microsoft.Office.Interop.Excel

    Excel.Application app = new Excel.Application();
    app.DisplayAlerts = false;
    // Open Excel Workbook for conversion.
    Excel.Workbook excelWorkbook = app.Workbooks.Open(sourceFile);
    // Save file as CSV file.
    excelWorkbook.SaveAs(destinationFile, Excel.XlFileFormat.xlCSV);
    

问题:- 在 SourcePath 中,我没有物理位置,而且似乎没有过载占用字节或文件流。

  1. 试过https://github.com/youngcm2/CsvHelper.Excel,Demo代码如下。

    using var reader = new CsvReader(new ExcelParser(FileContent, "JOB STATUSES", new CsvConfiguration(CultureInfo.CurrentCulture)));
    

甚至尝试过下面的代码:-

using var parser = new ExcelParser(FileContent,CultureInfo.InvariantCulture); using var reader = new CsvReader(parser);

但是这里 ExcelParser 失败了 Corrupterdfile with a valid CSV :(

问题:- 虽然这里有一个 OverLoad 来传递 Stream,但在我的情况下很重要。因为我没有特定的文件格式。它可以是任何随机 EXCEL 文件。没有我可以定义的特定类。

我错过了一些东西,任何人都可以帮助解决这个问题。

我的情况:-

  • 没有文件位置的物理路径。它在存储帐户中,所以是 Stream/Byte 。
  • EXCEL 文件可以是任意数量的行或列,没有固定模型,我只能拥有一张纸。

【问题讨论】:

  • Office interop 只能在本地计算机上运行,​​因为您需要安装 office 等。这只是行不通。它不是为在网络服务器上使用而设计的
  • 如果您只是将文件流式传输到应将其发送到客户端的输出流,则不需要 office 流式传输文件
  • 是的,没错。你的意思是,文件流&转换内容类型&用.csv推回?
  • 不,在我的情况下,它是从一种格式转换为另一种格式,然后进行流式转换然后发送。

标签: c# excel asp.net-core .net-core csvhelper


【解决方案1】:

使用 ExcelDataReader。它在 NuGet 中可用。

        using (var reader = ExcelReaderFactory.CreateReader(memoryStream, excelConfig))
        {
            var spreadsheet = reader.AsDataSet();
            var table = spreadsheet.Tables[0];
            var csv = table.ToCSV();
            var bytes = Encoding.UTF8.GetBytes(csv);

            return new StreamDataSource(bytes, table.TableName);
        }


public static class TableExtension
{
    public static string ToCSV(this DataTable dtDataTable)
    {
        var builder = new StringBuilder();
        foreach (DataRow dr in dtDataTable.Rows)
        {
            for (int i = 0; i < dtDataTable.Columns.Count; i++)
            {
                if (!Convert.IsDBNull(dr[i]))
                {
                    string value = dr[i].ToString();
                    if (value.Contains(","))
                    {
                        value = string.Format("\"{0}\"", value);
                        builder.Append(value);
                    }
                    else
                    {
                        builder.Append(dr[i].ToString());
                    }
                }
                if (i < dtDataTable.Columns.Count - 1)
                {
                    builder.Append(",");
                }
            }
            builder.Append(Environment.NewLine);
        }

        var csv = builder.ToString();
        return csv;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-21
    • 2012-04-24
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    相关资源
    最近更新 更多