【问题标题】:Excel 2007 file writer in C# results in a corrupt fileC# 中的 Excel 2007 文件编写器导致文件损坏
【发布时间】:2010-04-06 20:59:22
【问题描述】:

我正在使用 BinaryReader 从使用 OWA 的 Exchange 邮箱读取 Excel 2007 文件,然后使用 BinaryWriter 将文件写入磁盘。我的问题是当作者完成时这两个文件不匹配。更糟糕的是 Excel 2007 不会打开已写入的文件。

以前 Excel 2003 对下面的解决方案没有任何问题。如果文件是 Excel 2003 格式的文件,Excel 2007 没有问题,只要文件格式是 Excel 2007 (*.xlsx)。

二进制读取器:

using(System.IO.Stream stream = resource.GetInputStream(attachedFiles[k].Address))
{
    using(System.IO.BinaryReader br = new System.IO.BinaryReader(stream))
    {
        attachment.Data = new byte[attachedFiles[k].Size];
        int bufPosn=0, len=0;
        while ((len = br.Read( attachment.Data, bufPosn, attachment.Data.Length-bufPosn )) > 0)
        {
            bufPosn += len;
        }
        br.Close();
    }
}

BinaryWriter:

FileStream fs = new FileStream(fileName, FileMode.Create);
BinaryWriter binWriter = new BinaryWriter(fs);
binWriter.Write( content, 0, content.Length );
binWriter.Close();
fs.Close();

很高兴收到建议。

【问题讨论】:

  • content 变量是什么? xlsx 的格式不同,所以如何创建content 很重要。
  • 只是猜测,也许你的 .xlsx 是 Unicode,你需要用 BinaryWriter(Stream, Encoding) 构造函数来构造你的 BinaryWriter。
  • xlsx 本质上是一个压缩的 xml 文件。

标签: c# excel-2007 binary-data binaryreader binarywriter


【解决方案1】:

这个问题是由于 attachFiles[k].Size 返回的值远小于实际文件大小造成的。 Excel 2003 文件似乎不受此影响,但 Excel 2007 文件由于其压缩性质而易受攻击(解压缩例程显然对文件有不同的看法)。

一旦我更正了缓冲区的大小,文件就很好了。

感谢您的建议

【讨论】:

  • 很高兴感谢您分享提示。顺便说一句,您使用什么公式来获得正确的缓冲区大小?既然不能直接使用附件大小属性?
【解决方案2】:

IE8 和 OWA 存在问题,但我不确定它是否适用于您的情况。

结帐this site,其中还包含指向this site 的链接。他们基本上解释了如何解决使用 OWA 下载 xmlx 和 docx 文件的问题。

【讨论】:

  • 我尝试调整用于写出文件的编码,尝试使用 Unicode、UTF8、UTF7、ANSI、ASCII 以及在提供给模糊相似问题的其他答案中引用的几个建议代码页。内容是由大量用户生成的,因此完全不可预测。 Asher 引用的 OWA Office 2007 问题确实会影响我正在使用的系统,但该问题不会影响文件的内容(即一旦保存到磁盘 Excel 将毫无问题地打开它)。
猜你喜欢
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多