无法编辑生成的Excel文件

时间:2019-03-07 08:58:49

标签: c# openxml openxml-sdk

问题
在已安装的 Office 2010计算机中,我的应用程序必须将一个空的excel文件(文件A)复制到新的excel文件(文件B),并使用OpenXML库(V2.5)执行某些操作,最后保存到硬盘。之后,我打开文件B,然后向其中添加一比特数据(例如:1),然后保存并关闭它。
当我重新打开文件B时,excel抛出错误: Excel在“文件B”中发现了不可读的内容,您是否要恢复此工作簿的内容... ,但我无法打开它。
下面是我的代码:

static void Main(string[] args)
{
    ExportDataSet(@"C:\A.xlsx",@"C:\");
}
public static void Copy(String oldPath, String newPath)
{
    FileStream input = null;
    FileStream output = null;
    try
    {
        input = new FileStream(oldPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        output = new FileStream(newPath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);

        var buffer = new byte[32768];
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            output.Write(buffer, 0, read);
        }
    }
    catch (Exception e)
    {
    }
    finally
    {
        if (input != null)
        {
            input.Close();
            input.Dispose();
        }
        if (output != null)
        {
            output.Close();
            output.Dispose();
        }
    }

}

public static string ExportDataSet(string filePath, string path, int startRow = 10)
{
    var pathToSave = path;

    if (!Directory.Exists(pathToSave))
        Directory.CreateDirectory(pathToSave);
    var filename = pathToSave + Guid.NewGuid() + Path.GetExtension(filePath);
    Copy(filePath, filename);
    var fs = File.Open(filename, FileMode.Open);
    {
        using (var myWorkbook = SpreadsheetDocument.Open(fs, true))
        {
            var workbookPart = myWorkbook.WorkbookPart;
            var Sheets = myWorkbook.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
            var relationshipId = Sheets.First().Id.Value;
            var worksheetPart = (WorksheetPart)myWorkbook.WorkbookPart.GetPartById(relationshipId);
            var sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();

            workbookPart.Workbook.Save();
            //workbookPart.Workbook.CalculationProperties = new CalculationProperties() { FullCalculationOnLoad = true };
        }
        fs.Close();
        fs.Dispose();
        return filename;
    }
}
我认为OpenXML库有问题。 你有什么想法?请分享给我,非常感谢。
备注:
1.在计算机上使用Office 2010打开Excel文件
2.文件格式为Excel工作簿(.xlsx)
3.如果计算机安装了具有更高版本(2013、2016)的Office,则不会出现此问题。

1 个答案:

答案 0 :(得分:0)

您的缓冲区读取和写入逻辑是错误的。 The second parameter is where it starts to read or write,并且您将其传递为零值,因此while的第二次迭代将覆盖第一次迭代中写入的内容,因此,如果文件大于缓冲区大小,则将损坏数据。

您的代码应与此类似:

var buffer = new byte[32768];
int totalRead = 0; // Variable to track where to write in the next while iteration
int read;
while ((read = input.Read(buffer, totalRead, buffer.Length)) > 0)
{
    output.Write(buffer, totalRead, read);
    totalRead += read; // Add to totalRead the amount written so next iteration does append the content at the end.
}