【问题标题】:How Export Kendo Grid data to Excel/CSV/ZipFile - alternative method如何将 Kendo Grid 数据导出到 Excel/CSV/ZipFile - 替代方法
【发布时间】:2017-02-09 11:40:25
【问题描述】:

假设您有一个剑道网格并且想要将数据导出到 Excel 或 CSV 文件格式。

使用通用剑道方法,您会发现它变得非常困难,因为它还会带来大量元数据。这将使大型 excel 变得无用。

使用下面的方法,您将能够导出到 Excel、CSV,同时考虑过滤器和其他。

【问题讨论】:

    标签: c# excel kendo-grid kendo-asp.net-mvc epplus


    【解决方案1】:

    首先你在cshtml文件中定义JS函数和剑道网格:

        @section scripts{
        <script>
            function DownloadExcelFile(e)
            {
                if(e != "undefined")
                    e.preventDefault();
                var grid = $("#mainGrid").data("kendoGrid");
                var parameterMap = grid.dataSource.transport.parameterMap;
                var data = parameterMap({ sort: grid.dataSource.sort(), filter: grid.dataSource.filter(), group: grid.dataSource.group() });
                window.location = "Report/GetSummaryExcelReport?" + "filter=" + data.filter + "&sort=" + data.sort + "&group=" + data.group;
    
                return false;
            }
        </script>
        }
    
    
    <div class="col-md-12 col-sm-12 col-xs-12 text-center padding-0 inner">
        <div class="grid-area">
            @(Html.Kendo().Grid<SummaryGridRowModel>().Name("mainGrid")
       </div>
    </div>
    

    之后,您在控制器中声明一个函数,该函数将生成已排序的数据并调用帮助程序以生成 EXCEL/CSV/ZIP 文件。

        public FileResult GetSummaryExcelReport([DataSourceRequest] DataSourceRequest request)
        {
            var query = DbContext.vwReportSummary.AsQueryable();
    
            var summaryGridRowModelList = query.Select(SummaryRequestsSelector);
    
            var dsResult = summaryGridRowModelList.ToDataSourceResult(request);    
            string fileName = string.Format("RequestDetailsExcelReport_{0}.xlsx", DateTime.Now.ToString("yyyyMMdd_HHmmss"));
    
            ExcelFileCreator fileCreator = new ExcelFileCreator();
    
            //var result = fileCreator.CreateExcelFileFileStreamResult<SummaryGridRowModel>(dsResult.Data as IEnumerable<SummaryGridRowModel>, fileName);        
            var result = fileCreator.CreateZipFileFileContentResult<SummaryGridRowModel>(dsResult.Data as IEnumerable<SummaryGridRowModel>, fileName);  
    
    
    
            return result;
        }
    

    最后但同样重要的是,定义将生成 EXCEL/CSV/ZipArchive 文件创建器的帮助程序。

    Excel 文件创建助手

    public class ExcelFileCreator
    {
        /// <summary>
        /// Generates a FileStreamResult containing a Excel file in it
        /// </summary>
        /// <typeparam name="T">Type of object in the object list parameter</typeparam>
        /// <param name="objectList">The object list enumerable. This contains the data for the Excel file</param>
        /// <param name="fileName">The file name of the Excel</param>
        /// <returns>FileStreamResult</returns>
        public FileStreamResult CreateExcelFileFileStreamResult<T>(IEnumerable<T> objectList, string fileName)
        {
            var ms = new MemoryStream();
    
            var contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    
            try
            {
    
                ExcelPackage excelPackage = new ExcelPackage(ms);
    
                excelPackage.Compression = OfficeOpenXml.CompressionLevel.BestCompression;
    
                var workSheet1 = excelPackage.Workbook.Worksheets.Add("Sheet1");
                workSheet1.Cells["A1"].LoadFromCollection<T>(objectList, true);
    
                var firstRow = workSheet1.Row(1);
                if(firstRow != null)
                    firstRow.Style.Font.Bold = true;
    
                excelPackage.SaveAs(ms);
    
                ms.Seek(0, SeekOrigin.Begin);
    
                var fsr = new FileStreamResult(ms, contentType);
                fsr.FileDownloadName = fileName;
                return fsr;
            }
            catch (Exception ex)
            {
                if (ms != null)
                {
                    ms.Dispose();
                }
    
                throw;
            }
    
        }
    
    
        /// <summary>
        /// Generates a FileStreamResult containing a zip file with the EXCEL file in it
        /// </summary>
        /// <typeparam name="T">Type of object in the object list parameter</typeparam>
        /// <param name="objectList">The object list enumerable. This contains the data for the EXCEL file</param>
        /// <param name="fileName">The file name of the EXCEL</param>
        /// <returns>FileStreamResult</returns>        
        public FileContentResult CreateZipFileFileContentResult<T>(IEnumerable<T> objectList, string fileName)
        {
            var contentType = System.Net.Mime.MediaTypeNames.Application.Zip;
    
            using (var memoryStream = new System.IO.MemoryStream())
            {
                using (Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile())
                {
                    using (var package = new OfficeOpenXml.ExcelPackage())
                    {
                        var workSheet1 = package.Workbook.Worksheets.Add("Sheet1");
                        workSheet1.Cells["A1"].LoadFromCollection<T>(objectList, true);
    
                        var firstRow = workSheet1.Row(1);
                        if (firstRow != null)
                            firstRow.Style.Font.Bold = true;
    
                        zip.AddEntry(fileName, package.GetAsByteArray());
                        zip.Save(memoryStream);
                        var fcr = new FileContentResult(memoryStream.ToArray(), contentType); //NOTE: Using a File Stream Result will not work.
                        fcr.FileDownloadName = fileName + ".zip";
                        return fcr;
                    }
                }
            }
        }
    
    
        /// <summary>
        /// Generates a HttpResponseMessage containing a Excel file in it
        /// </summary>
        /// <typeparam name="T">Type of object in the object list parameter</typeparam>
        /// <param name="objectList">The object list enumerable. This contains the data for the Excel file</param>
        /// <param name="fileName">The file name of the Excel</param>
        /// <returns>HttpResponseMessage</returns>
        public HttpResponseMessage CreateExcelFileHttpResponseMessage<T>(IEnumerable<T> objectList, string fileName)
        {
            using (var ms = new MemoryStream())
            {
                HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
    
                using (ExcelPackage excelPackage = new ExcelPackage(ms))
                {
                    var workSheet1 = excelPackage.Workbook.Worksheets.Add("Sheet1");
    
                    workSheet1.Cells["A1"].LoadFromCollection<T>(objectList, true);
                }
    
                result.Content = new ByteArrayContent(ms.GetBuffer());
    
                result.Content.Headers.ContentType =
                    new System.Net.Http.Headers.MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
                {
                    FileName = fileName
                };
    
                return result;
            }
        }
    
    
        /// <summary>
        /// Generates a HttpResponseMessage containing a zip file with the EXCEL file in it
        /// </summary>
        /// <typeparam name="T">Type of object in the object list parameter</typeparam>
        /// <param name="objectList">The object list enumerable. This contains the data for the EXCEL file</param>
        /// <param name="fileName">The file name of the EXCEL</param>
        /// <returns>HttpResponseMessage</returns>
        public HttpResponseMessage CreateZipFileHttpResponseMessage<T>(IEnumerable<T> objectList, string fileName)
        {
            HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
            using (var ms = new MemoryStream())
            {
                using (var archive = new System.IO.Compression.ZipArchive(ms, System.IO.Compression.ZipArchiveMode.Create, true))
                {
                    var newEntry = archive.CreateEntry(fileName, System.IO.Compression.CompressionLevel.Fastest);
    
                    using (var newEntryStream = newEntry.Open())
                    using (ExcelPackage excelPackage = new ExcelPackage(ms))
                    {
                        var workSheet1 = excelPackage.Workbook.Worksheets.Add("Sheet1");
    
                        workSheet1.Cells["A1"].LoadFromCollection<T>(objectList, true);
                    }
                }
                ms.Seek(0, SeekOrigin.Begin);
                result.Content = new ByteArrayContent(ms.ToArray());
    
                result.Content.Headers.ContentType =
                    new System.Net.Http.Headers.MediaTypeHeaderValue("application/zip");
                result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
                {
                    FileName = fileName + ".zip"
                };
    
                return result;
            }
        }
    
    
    }
    

    CsvFile Creator 助手

    /// <summary>
    /// Enumerator for the CSV file separator
    /// </summary>
    public enum CsvFileSeparatorType
    {
        /// <summary>
        /// Values will be separated by a comma: ", "
        /// </summary>
        Comma
        ,
        /// <summary>
        /// Values will be separated by a tab delimiter: "\t "
        /// </summary>
        Tab
        ,
        /// <summary>
        /// Values will be separated by a semicolon: "; "
        /// </summary>
        Semicolon
    }
    
    /// <summary>
    /// This class helps create a CSV file
    /// </summary>
    public class CsvFileCreator
    {
        public CsvFileSeparatorType CsvFileSeparatorType
        {
            get
            {
                CsvFileSeparatorType csvFileSeparatorType = CsvFileSeparatorType.Tab;
                switch (ConfigurationManager.AppSettings["CsvFileSeparatorType"])
                {
                    case "Comma":
                        csvFileSeparatorType = CsvFileSeparatorType.Comma;
                        break;
                    case "Tab":
                        csvFileSeparatorType = CsvFileSeparatorType.Tab;
                        break;
                    case "Semicolon":
                        csvFileSeparatorType = CsvFileSeparatorType.Semicolon;
                        break;
                    default:
                        csvFileSeparatorType = CsvFileSeparatorType.Tab;
                        break;
                }
                return csvFileSeparatorType;
            }
        }
    
    
        /// <summary>
        /// Generates a HttpResponseMessage containing a zip file with the CSV file in it
        /// </summary>
        /// <typeparam name="T">Type of object in the object list parameter</typeparam>
        /// <param name="objectList">The object list enumerable. This contains the data for the CSV file</param>
        /// <param name="fileName">The file name of the CSV</param>
        /// <returns>HttpResponseMessage</returns>
        public HttpResponseMessage CreateZipFileHttpResponseMessage<T>(IEnumerable<T> objectList, string fileName)
        {
            HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
            using (var ms = new MemoryStream())
            {
                using (var archive = new ZipArchive(ms, ZipArchiveMode.Create, true))
                {
                    var csvEnumerable = CreateCsvEnumerable<T>(objectList, CsvFileSeparatorType);
                    var newEntry = archive.CreateEntry(fileName, CompressionLevel.Fastest);
    
                    using (var newEntryStream = newEntry.Open())
                    using (var streamWriter = new StreamWriter(newEntryStream))
                    {
                        foreach (var csvLine in csvEnumerable)
                        {
                            streamWriter.WriteLine(csvLine);
                        }
                        streamWriter.Flush();
    
                    }
                }
                ms.Seek(0, SeekOrigin.Begin);
                result.Content = new ByteArrayContent(ms.ToArray());
    
                result.Content.Headers.ContentType =
                    new System.Net.Http.Headers.MediaTypeHeaderValue("application/zip");
                result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
                {
                    FileName = fileName + ".zip"
                };
    
                return result;
            }
        }
    
        /// <summary>
        /// Generates a HttpResponseMessage containing a CSV file in it
        /// </summary>
        /// <typeparam name="T">Type of object in the object list parameter</typeparam>
        /// <param name="objectList">The object list enumerable. This contains the data for the CSV file</param>
        /// <param name="fileName">The file name of the CSV</param>
        /// <returns>HttpResponseMessage</returns>
        public HttpResponseMessage CreateCsvFileHttpResponseMessage<T>(IEnumerable<T> objectList, string fileName)
        {
            using (var ms = new MemoryStream())
            {
                HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
    
                using (var streamWriter = new StreamWriter(ms))
                {
                    var csvEnumerable = CreateCsvEnumerable<T>(objectList, CsvFileSeparatorType);
    
                    foreach (var csvLine in csvEnumerable)
                    {
                        streamWriter.WriteLine(csvLine);
                    }
                    streamWriter.Flush();
                }
    
                result.Content = new ByteArrayContent(ms.GetBuffer());
    
                result.Content.Headers.ContentType =
                    new System.Net.Http.Headers.MediaTypeHeaderValue("text/csv");
                result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
                {
                    FileName = fileName
                };
    
                return result;
            }
        }
    
        /// <summary>
        /// Generates an Enumerable containing the CSV data in it. First row contains the headers
        /// </summary>
        /// <typeparam name="T">Type of object in the object list parameter</typeparam>
        /// <param name="objectList">The object list enumerable. This contains the data for the CSV file</param>
        /// <param name="separatorType">Enumerator for the CSV file separator</param>
        /// <returns>IEnumerable</returns>
        private IEnumerable<string> CreateCsvEnumerable<T>(IEnumerable<T> objectlist, CsvFileSeparatorType separatorType)
        {
    
            string separator = ", ";
            switch (separatorType)
            {
                case CsvFileSeparatorType.Comma:
                    separator = ", ";
                    break;
                case CsvFileSeparatorType.Semicolon:
                    separator = "; ";
                    break;
                case CsvFileSeparatorType.Tab:
                    separator = "\t ";
                    break;
            }
    
            PropertyInfo[] properties = typeof(T).GetProperties();
            yield return "\"" + String.Join(separator, properties.Select(f => f.Name).ToArray()) + "\"";
            foreach (var o in objectlist)
            {
                yield return "\"" + HttpUtility.HtmlDecode(string.Join(separator, properties.Select(f => (f.GetValue(o) ?? "").ToString()).ToArray())) + "\"";
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 2015-07-31
      • 2016-03-18
      • 2018-09-27
      • 1970-01-01
      • 2011-10-29
      • 2013-10-17
      相关资源
      最近更新 更多