Может ли открыть файл Excel, загруженный в контейнер BLOB-объектов? - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь загрузить содержимое таблицы данных в формате Excel в контейнер BLOB-объектов.Пока это мой кодзагрузить файл, я не могу открыть его.Ниже приведена ошибка

enter image description here

в чем ошибка?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Вы должны преобразовать данные в Excel (вы можете сохранить Excel в памяти) перед загрузкой в ​​хранилище BLOB-объектов, иначе это вызовет некоторые ошибки.

Я использовал пакет nuget DocumentFormat.OpenXml для преобразования.

Основной метод:

        static void Main(string[] args)
        {
            DataTable dt = new DataTable("table1");
            dt.Columns.Add("name",typeof(string));
            dt.Columns.Add("city",typeof(string));
            dt.Columns.Add("gender",typeof(string));

            dt.Rows.Add("jack", "bj", "male");
            dt.Rows.Add("jacky", "sh", "male");
            dt.Rows.Add("iva", "bj", "female");
            dt.Rows.Add("nancy", "wx", "female");
            dt.Rows.Add("ali", "sz", "male");
            dt.Rows.Add("andy", "sz", "male");

            System.IO.MemoryStream stream = new System.IO.MemoryStream();
            using (SpreadsheetDocument document = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook))
            {
                WriteExcelFile(document, dt);
            }

            CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials("account name", "account key"), true);
            CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
            var cloudBlobContainer = cloudBlobClient.GetContainerReference("test-1");

            var blockBlob = cloudBlobContainer.GetBlockBlobReference("data115.xlsx");
            stream.Position = 0;
            blockBlob.UploadFromStream(stream);

            Console.WriteLine("completed.");
            Console.ReadLine();
        }

Метод преобразования:

       private static void WriteExcelFile(SpreadsheetDocument document, DataTable table)
        {

                WorkbookPart workbookPart = document.AddWorkbookPart();
                workbookPart.Workbook = new Workbook();

                WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
                var sheetData = new SheetData();
                worksheetPart.Worksheet = new Worksheet(sheetData);

                Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets());
                Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" };

                sheets.Append(sheet);

                Row headerRow = new Row();

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

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

                sheetData.AppendChild(headerRow);

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

                    sheetData.AppendChild(newRow);
                }

                workbookPart.Workbook.Save();

        }

После теста загруженный файл Excel может быть корректно открыт:

enter image description here

0 голосов
/ 12 февраля 2019

Поскольку вы сериализовали в MemoryStream, позиция находится в конце потока.Верните его в начало, добавив:

stream.Seek(0, SeekOrigin.Begin);

сразу после завершения сериализации в поток.Итак (первые строки) вашего кода будут выглядеть так:

MemoryStream stream = new System.IO.MemoryStream();
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, dt);
stream.Seek(0, SeekOrigin.Begin);
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...