Как добавить строку данных с EPPlus, когда внутри ячеек может быть разделитель? - PullRequest
0 голосов
/ 23 января 2019

У меня возникают проблемы, когда мои данные содержат значение delmiter, что ячейки будут заполнены не в том месте.

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

 public void Export()
        {
            using (ExcelPackage excel = new ExcelPackage())
            {
                excel.Workbook.Worksheets.Add("Worksheet1");
                var headerRow = new List<string[]>()
                {
                    new string[] { "Id", "FirstName", "LastName",  }
                };
                // Determine the header range (e.g. A1:D1)
                string headerRange = "A1:" + Char.ConvertFromUtf32(headerRow[0].Length + 64) + "1";
                var worksheet = excel.Workbook.Worksheets["Worksheet1"];
                worksheet.Cells[headerRange].LoadFromArrays(headerRow);
                worksheet.DefaultColWidth = 20.0;

                //TODO examine delimiter 
                var counter = 2;
                var format = new OfficeOpenXml.ExcelTextFormat();
                format.Delimiter = ';';
                //format.TextQualifier = '"';
                format.DataTypes = new[] { eDataTypes.String };

                foreach (Attendee item in context.Attendees.Include(attendee => attendee.Tags))
                {
                    worksheet.Cells[counter++, 1].LoadFromText($"{item.Id};{item.FirstName};{item.LastName}", format);
                }

                //Create the response
                Response.Clear();
                Response.ContentEncoding = Encoding.UTF8;
                Response.HeaderEncoding = Encoding.UTF8;
                Response.Charset = Encoding.UTF8.WebName;
                Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                Response.AddHeader("Content-Disposition", "attachment; filename=people.xlsx");
                Response.BinaryWrite(excel.GetAsByteArray()); 
                Response.Flush(); 
                Response.End();
               }
        }

Это работает, но если какое-либо из моих полей содержит ';' У меня будут проблемы. Есть ли какое-то архаичное значение разделителя, которое я могу использовать или, возможно, более безопасный способ загрузки моих данных? Я мог бы, вероятно, написать два вложенных цикла for и ячейку загрузки вызова на каждую ячейку, но это было бы довольно уродливо, так как в моем реальном коде есть около 15 столбцов / полей. Я также не могу загрузить из коллекции, так как есть некоторые поля, которые я не хочу показывать, и они оказываются в неправильном порядке.

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Существует символ ascii "VTAB" (chr (11), 0x0B), который, вероятно, безопасно использовать в качестве разделителя, так как вы, вероятно, никогда не встретите его вне этого:)

Сколько людей действительно знают, как удерживать клавишу ALT (в Windows) и набирать «0011» на клавиатуре, чтобы ввести этот управляющий символ?

0 голосов
/ 24 января 2019

Почему бы не использовать ячейку за ячейкой?

foreach (Attendee item in context.Attendees.Include(attendee => attendee.Tags))
{
    int column = 1;
    worksheet.Cells[counter, column++].Value = item.Id;
    worksheet.Cells[counter, column++].Value = item.FirstName;
    worksheet.Cells[counter++, column++].Value = item.LastName;
}

редактировать - полный код

public void Export()
    {
        using (ExcelPackage excel = new ExcelPackage())
        {
            excel.Workbook.Worksheets.Add("Worksheet1");
            var headerRow = new List<string[]>()
            {
                new string[] { "Id", "FirstName", "LastName",  }
            };
            // Determine the header range (e.g. A1:D1)
            string headerRange = "A1:" + Char.ConvertFromUtf32(headerRow[0].Length + 64) + "1";
            var worksheet = excel.Workbook.Worksheets["Worksheet1"];
            worksheet.Cells[headerRange].LoadFromArrays(headerRow);
            worksheet.DefaultColWidth = 20.0;

            var counter = 2;

            foreach (Attendee item in context.Attendees.Include(attendee => attendee.Tags))
            {
                int column = 1;
                worksheet.Cells[counter, column++].Value = item.Id;
                worksheet.Cells[counter, column++].Value = item.FirstName;
                worksheet.Cells[counter++, column++].Value = item.LastName;
            }

            //Create the response
            Response.Clear();
            Response.ContentEncoding = Encoding.UTF8;
            Response.HeaderEncoding = Encoding.UTF8;
            Response.Charset = Encoding.UTF8.WebName;
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            Response.AddHeader("Content-Disposition", "attachment; filename=people.xlsx");
            Response.BinaryWrite(excel.GetAsByteArray()); 
            Response.Flush(); 
            Response.End();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...