< Summary

Class:WinSolutions.Sveta.Common.CsvUtil
Assembly:WinSolutions.Sveta.Common
File(s):/opt/dev/sveta_api_build/WinSolutions.Sveta.Common/CsvUtil.cs
Covered lines:0
Uncovered lines:69
Coverable lines:69
Total lines:118
Line coverage:0% (0 of 69)
Covered branches:0
Total branches:36
Branch coverage:0% (0 of 36)

Metrics

MethodLine coverage Branch coverage
ToCsv(...)0%0%
ToCsv(...)0%0%
ToExcel(...)0%0%
ToExcelStream(...)0%100%

File(s)

/opt/dev/sveta_api_build/WinSolutions.Sveta.Common/CsvUtil.cs

#LineLine coverage
 1using System;
 2using System.Text;
 3using System.Collections.Generic;
 4using System.Linq;
 5using System.Threading.Tasks;
 6using ClosedXML.Excel;
 7using System.IO;
 8
 9namespace WinSolutions.Sveta.Common
 10{
 11    public static class CsvUtil
 12    {
 13        /// <summary>
 14        /// Экспортирует список массивов строк в csv-строку с разделителем ";"
 15        /// </summary>
 16        /// <param name="rows">список массивов строк</param>
 17        /// <returns>csv-строка</returns>
 18        public static string ToCsv(List<string[]> rows)
 019        {
 020            var result = new StringBuilder();
 021            if (rows.Count == 0 || rows[0] == null || rows[0].Length == 0) return result.ToString();
 22
 023            var fieldsCount = rows[0].Length;
 024            foreach(var row in rows)
 025            {
 026                for(int i = 0; i < fieldsCount; i++)
 027                {
 028                    var row2 = (row[i] ?? string.Empty).Replace("\"", "\"\"");
 029                    if(row2.Contains(";") || row2.Contains("\t") || row2.Contains(","))
 030                    {
 031                        row2 = $"\"{row2}\"";
 032                    }
 033                    result.Append(row2);
 34
 035                    if (i + 1 != fieldsCount)
 036                    {
 037                        result.Append(";");
 038                    }
 039                }
 040                result.AppendLine();
 041            }
 42
 043            return result.ToString();
 044        }
 45
 46        /// <summary>
 47        /// Экспортирует набор объектов в csv-строку с разделителем ";"
 48        /// В качестве имен колонок используются названия паблик свойств объекта. В данные кладутся значения паблик свой
 49        /// </summary>
 50        /// <typeparam name="T">тип объекта</typeparam>
 51        /// <param name="data">коллекция объектов</param>
 52        /// <returns>csv-строка</returns>
 53        public static string ToCsv<T>(IEnumerable<T> data)
 054        {
 055            if (!data.Any()) return string.Empty;
 56
 057            List<string[]> result = new List<string[]>();
 58
 059            var cols = new List<string>();
 060            var props = typeof(T).GetProperties();
 061            foreach (var field in props)
 062            {
 063                cols.Add(field.Name);
 064            }
 065            result.Add(cols.ToArray());
 66
 067            foreach(var row in data)
 068            {
 069                cols.Clear();
 070                foreach (var field in props)
 071                {
 072                    var val = field.GetValue(row)?.ToString();
 073                    cols.Add(val ?? "");
 074                }
 075                result.Add(cols.ToArray());
 076            }
 77
 078            return ToCsv(result);
 079        }
 80
 81        /// <summary>
 82        /// Экспортирует список массивов строк в excel
 83        /// </summary>
 84        /// <param name="rows">список массивов строк</param>
 85        /// <returns>XLWorkbook</returns>
 86        public static XLWorkbook ToExcel(List<string[]> rows)
 087        {
 088            var book = new XLWorkbook();
 89
 090            var worksheet = book.Worksheets.Add("data");
 091            var currentRow = 1;
 92
 093            foreach (var line in rows)
 094            {
 095                var currentCol = 1;
 096                foreach (var val in line)
 097                {
 098                    worksheet.Cell(currentRow, currentCol++).Value = val;
 099                }
 100
 0101                currentRow++;
 0102            }
 103
 0104            return book;
 0105        }
 106
 107        public static MemoryStream ToExcelStream(List<string[]> rows)
 0108        {
 0109            var stream = new MemoryStream();
 0110            using (var book = CsvUtil.ToExcel(rows))
 0111            {
 0112                book.SaveAs(stream);
 0113            }
 0114            stream.Position = 0;
 0115            return stream;
 0116        }
 117    }
 118}