Невозможно редактировать сгенерированный файл Excel - PullRequest
0 голосов
/ 07 марта 2019

Задача :В установленном компьютере 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, чтобы открыть файл Excel2. формат файла - книга Excel (.xlsx)3. если на компьютере установлен офис более поздней версии (2013, 2016), проблема не возникла.

1 Ответ

0 голосов
/ 07 марта 2019

Ваша логика чтения и записи в буфере неверна. Второй параметр - это место, где он начинает читать или записывать , и вы передаете ему нулевое значение, поэтому вторая итерация 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.
}
...