【问题标题】:Read an Excel file into memory, and then write it back to disk将 Excel 文件读入内存,然后将其写回磁盘
【发布时间】:2017-09-08 10:18:27
【问题描述】:

我最终尝试读取文件,将其存储在 Cassandra 数据库中的 blob 中,然后再将其写回磁盘。遇到问题,并简化为以下演示问题的代码。相同的代码适用于 .txt 和 .csv 文件,但不适用于 Excel 电子表格。我不确定这是否是编码问题,以及如何解决。我尝试了 Encoding.Unicode,但这也没有用。

static void testFileReadWrite()
{
    string filenameIn = @"c:\demo\Timesheet.xls";
    string filenameOut1 = @"c:\demo\Timesheet_Test1.xls";
    string filenameOut2 = @"c:\demo\Timesheet_Test2.xls";

    string fileContents1 = File.ReadAllText(filenameIn);
    File.WriteAllText(filenameOut1, fileContents1);

    string fileContents2 = File.ReadAllText(filenameIn, Encoding.Unicode);
    File.WriteAllText(filenameOut2, fileContents2, Encoding.Unicode);
}

原始文件大小为 536,576。 Test1 为 1,282,808,Test2 为 536,578。显然,我希望输出与读入相同大小的文件,然后我将对其进行文件比较以验证它。我还希望该程序可以处理任何文件类型,只是 Excel 是第一个证明该问题的程序。

【问题讨论】:

  • Excel 文件不是文本文件,因此无法读取。
  • 你想做什么? Excel 文件是二进制文件(实际上是压缩的 XML)。你为什么要把它当作text
  • 顺便说一句,文本文件的代码也是错误的。您正在更改文件而没有意识到。 ReadAllText 将 ASCII 文本转换为 Unicode。 WriteAllText 写出 UTF8。如果要读取和写入完全相同的字节,请使用。 ReadAllBytes
  • 我的错,以为所有字节都是“文本”并且可以用字符串表示。然后需要重新阅读文本的定义。我知道一个字符串不完全是一个字节数组,但几乎不一样?
  • 另外,程序是否必须知道文件是否为 unicode?还是会使用 Read/write AllBytes 处理任何类型的文件?

标签: c# encoding utf


【解决方案1】:

应该使用File.ReadAllBytesFile.WriteAllBytes 来读写二进制文件。希望对您有所帮助!

这个 StackOverflow 有助于解释 ReadAllBytes 和 ReadAllText 之间的区别:Why is File.ReadAllBytes result different than when using File.ReadAllText?

【讨论】:

  • 好像我用 Cassandra 尝试过,但会先在上面的简单示例中重试。
  • byte[] fileContents3 = File.ReadAllBytes(filenameIn); File.WriteAllBytes(filenameOut3, fileContents3);工作正常。
  • 检查是否可以使用 MemoryStream 然后调用 WriteTo 方法将其转储到磁盘。
  • 如前所述,下一步是在 Cassandra 的 blob 中编写故事。我让它处理文本文件,但必须更改我的逻辑以使用参数而不是内联 CQL。
【解决方案2】:

我会使用 Microsoft 的“OfficeOpenXml”库并根据需要读取 excel 文件。

//
using OfficeOpenXml;

//
read the file using file stream
using (var stream= new StreamReader("filePath"))
{
     // then use the stream to extract the excel specific data
     using (var excelPackage = new ExcelPackage(stream))
    {
        var sheet = excelPackage.Workbook.Worksheets[1];
        var cell1= sheet.Cells[1, 1].GetValue<string>();
    }
}

然后你可以建立你的字符串并存储到任何你喜欢的地方。

【讨论】:

  • 阅读问题,它说:“还希望程序可以处理任何文件类型,只是 Excel 是第一个证明该问题的程序。”:
  • 我的错,只要你喜欢,无论文件类型如何,只要 streamReader 和 StreamWriter 都会做得很好。
猜你喜欢
  • 2018-10-16
  • 2012-04-13
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 2012-11-01
相关资源
最近更新 更多