Получить поврежденный файл при создании файла xlsx - PullRequest
0 голосов
/ 11 июня 2019

Я хочу создать новый Excel с несколькими листами, которые создаются автоматически. Вот метод шаблона, который я создал. Метод Generate, который я вызываю из моего ExportNormTableController.cs. Я хочу исправить это повреждение файла и открыть Excel напрямую, потому что после генерации файла я хочу взять Excel и открыть его, и мне нужно создать новый лист, где я читаю несколько файлов .fdf и помещаю содержимое в новый созданный лист.

namespace ExportNormtables
{
public class ExportNormTablesTemplate : IDisposable
{

    SpreadsheetDocument document;
    private MemoryStream stream = new MemoryStream();
    public ExportNormTablesTemplate(string filepath)
    {
        document = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook);
    }
    public byte[] Generate(DataSet ds)
    {
        using (document)
        {
            if (ds != null)
            {
                // Add a WorkbookPart to the document.
                WorkbookPart workBookPart = document.AddWorkbookPart();
                workBookPart.Workbook = new Workbook();
                Sheets sheets = document.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());
                foreach (System.Data.DataTable table in ds.Tables)
                {
                    // Add a WorksheetPart to the WorkbookPart.
                    WorksheetPart sheetPart = workBookPart.AddNewPart<WorksheetPart>();
                    sheetPart.Worksheet = new Worksheet(new SheetData());

                    uint sheetId = 1;
                    if (sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Count() > 0)
                    {
                        sheetId = sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Select(s => s.SheetId.Value).Max() + 1;
                    }
                    Sheet sheet = new Sheet() { Id = document.WorkbookPart.GetIdOfPart(sheetPart), SheetId = sheetId, Name = table.TableName };
                    sheets.Append(sheet);

                    // Get the sheetData cell table.
                    SheetData sheetData = sheetPart.Worksheet.GetFirstChild<SheetData>();

                    DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row();

                    List<String> columns = new List<string>();
                    foreach (System.Data.DataColumn column in table.Columns)
                    {
                        columns.Add(column.ColumnName);

                        DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
                        cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
                        cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName);
                        headerRow.AppendChild(cell);
                    }

                    sheetData.AppendChild(headerRow);

                    foreach (System.Data.DataRow dsrow in table.Rows)
                    {
                        DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
                        foreach (String col in columns)
                        {
                            DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
                            cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
                            cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString());
                            newRow.AppendChild(cell);

                        }

                        sheetData.AppendChild(newRow);
                    }

                }
                document.Save();
            }
            // This is a workaround because of 
            // https://github.com/OfficeDev/Open-XML-SDK/issues/294
            var newStream = new MemoryStream();
            document.Clone(newStream);
            return newStream.ToArray();
        }
    }

    #region IDisposable Support

    private bool disposedValue = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!disposedValue)
        {
            if (disposing)
            {

                if (document != null)
                {
                    document.Dispose();
                    document = null;
                }
                if (stream != null)
                {
                    stream.Dispose();
                    stream = null;
                }
            }


            disposedValue = true;
        }
    }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1816:CallGCSuppressFinalizeCorrectly")]
    public void Dispose()
    {

        Dispose(true);

    }
    #endregion
}
}

Я думаю, что проблема заключается в создании SheetData, но я не уверен. Пожалуйста, помогите мне кто-нибудь :) Я также открыл файл из: щелкните правой кнопкой мыши на файле> 7Zip> openArchive и сравнил файлы (восстановил один и исходный), и здесь отсутствует папка: DocProps

Мой метод, который выполняется вызовом шаблона, выглядит так:

 string filepath = "C:\\Development\\Shared\\KBE_Bearinx\\Export.xlsx";
        Byte[] data = null;
        using (var s = new ExportNormTablesTemplate(filepath))
        {

            data = s.Generate(ds);

            Console.WriteLine(ds);
        }

        File.WriteAllBytes(@"C:\\Development\\Shared\\KBE_Bearinx\\Export.xlsx", data);

        return data;
    }
enter code here
...