файл поврежден и не может быть открыт при сохранении документа Excel с использованием openXML 2.0 - PullRequest
1 голос
/ 18 августа 2011

Я пытаюсь сохранить строки, проходящие через этот метод, из другой электронной таблицы и сохранить эту электронную таблицу в виде вложения в электронное письмо.Письмо отправляется нормально, но вложение не открывается с ошибкой «файл поврежден и не может быть открыт».Я попытался сохранить файл в filstream на c:, но получил ту же ошибку.Что не так с этим кодом?

 public static void CreateErrorMailWithExcelAttachment(List<Row> rows)
        {
            if (rows.Count > 0)
            {
                using (MemoryStream stream = new MemoryStream())
                {
                    //Create a spreadsheet document by supplying the file name.
                    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook))
                    {

                        // Add a WorkbookPart to the document.
                        spreadsheetDocument.AddWorkbookPart();
                        spreadsheetDocument.WorkbookPart.Workbook = new Workbook();

                        spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();
                        spreadsheetDocument.WorkbookPart.WorksheetParts.First().Worksheet = new Worksheet();

                        // create sheet data
                        spreadsheetDocument.WorkbookPart.WorksheetParts.First().Worksheet.AppendChild(new SheetData());

                        // Add Rows to the Sheet.
                        foreach (Row row in rows)
                        {
                            spreadsheetDocument.WorkbookPart.WorksheetParts.First().Worksheet.First().AppendChild(new Row(row.OuterXml));
                        }

                        spreadsheetDocument.WorkbookPart.Workbook.Save();
                    }

                    Dictionary<string, byte[]> attachments = new Dictionary<string, byte[]>();
                    attachments.Add("Book1.xlsx", stream.ToArray());

                    SendEmail
                        (
                            acsis.Common.AppContext.Configuration.GetValue(Constants.ApplicationName, "SMTPServer"),
                            acsis.Common.AppContext.Configuration.GetValue(Constants.ApplicationName, "SMTPUser"),
                            acsis.Common.AppContext.Configuration.GetValue(Constants.ApplicationName, "SMTPPass"),
                            "shaun.bosch@acsis.co.za",
                            acsis.Common.AppContext.Configuration.GetValue(Constants.ApplicationName, "InstitutionalDatabaseAdminEmail"),
                            "Failed rows from bulk investor spreadsheet upload",
                            "Test",
                            false,
                            attachments
                        );
                }
            }
        }

1 Ответ

3 голосов
/ 19 августа 2011

Внутри WorkbookPart вам нужно добавить элемент, определяющий каждый лист в рабочей книге.Сложно написать именно то, что вам нужно, в вашем коде, потому что у вас есть много неназначенных создателей, но в основном вам нужно:

workbook1.AddNamespaceDeclaration("r","http://schemas.openxmlformats.org/officeDocument/2006/relationships");
Sheets sheets1 = new Sheets();
Sheet sheet1 = new Sheet(){ Name = "Sheet1", SheetId = (UInt32Value)1U, Id = "R71b609d3bfb541ee" };
sheets1.Append(sheet1);
workbook1.Append(sheets1);
workbookPart1.Workbook = workbook1;

Вам нужно получить идентификатор relId и поместить этотам, но тогда вы должны быть хорошо идти.

Надеюсь, что помогает!

...