在C#导出数据到Excel时,数组下标超出范围了。

3

我有一个ASP.Net网站。以下是我将流写入Excel的方法。

public void JsonToExcel(string jsonData, HttpResponseBase response)
    {
        try
        {
            ExcelPackage excel = new ExcelPackage();
            var worksheet = excel.Workbook.Worksheets.Add("Sheet1");
            //below line is throwing the error
            worksheet.Cells[1, 1].LoadFromCollection(jsonData, true);
            using (MemoryStream swObj = new MemoryStream())
            {
                string fileName = DateTime.Now.ToLongDateString() + ".xlsx";
                response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                response.AddHeader("content-disposition", "attachment;  filename=" + fileName + "");
                excel.SaveAs(swObj);
                swObj.WriteTo(response.OutputStream);
                return;
            }

        }
        catch (Exception ex)
        {
            //handle exception
            return;
        }
        finally
        {
            response.Flush();
            response.End();
        }

在函数的这一行 - worksheet.Cells[1, 1].LoadFromCollection(jsonData, true);

我遇到了以下异常:

索引超出了数组界限。

我尝试将其设置为worksheet.Cells[0,0]

我正在使用EPPlus 4.1.0包。

JSON示例:-

        string jsonData = @"jsonData = [
                    {
                        ""DocumentName"": ""Test Document"",
                        ""ActionDate"": ""2015-09-25T16:06:25.083"",
                        ""ActionType"": ""View"",
                        ""ActionPerformedBy"": ""Sreeja SJ""
                    },
                    {
                        ""DocumentName"": ""Test Document"",
                        ""ActionDate"": ""2015-09-25T16:12:02.497"",
                        ""ActionType"": ""View"",
                        ""ActionPerformedBy"": ""Sreeja SJ""
                    },
                    {
                        ""DocumentName"": ""Test Document"",
                        ""ActionDate"": ""2015-09-25T16:13:48.013"",
                        ""ActionType"": ""View"",
                        ""ActionPerformedBy"": ""Sreeja SJ""
                    }]";

在使用Excel时遇到的一个问题是单元格不是以零为基础的索引,因此最好使用在这里找到的Closed XML https://closedxml.codeplex.com/。 - Simon Price
请问您能否提供一个JSON数据的示例以及期望的Excel转换结果? - Souvik Ghosh
@SouvikGhosh。我已经发布了示例JSON。 - Kgn-web
1
请问你能否添加异常的完整调用堆栈?目前不清楚错误究竟出现在哪里。 - Dirk Vollmar
@Kgn-web LoadFromCollection 只能处理 集合,而不是任意字符串。你是否忘记反序列化字符串了?这个问题应该被关闭,因为它只是一个打字错误吗? - Panagiotis Kanavos
显示剩余2条评论
1个回答

2

我认为这是JSON和EPPlus LoadFromCollection内部方法的问题 LoadFromCollection方法需要一个集合,而不是任意字符串或其他内容,因此当我使用Newtonsoft.Json将其反序列化为适当的类时,似乎没问题。

using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;
using OfficeOpenXml;

namespace TestC
{
    public class PostData
    {
        public string DocumentName { get; set; }
        public DateTime ActionDate { get; set; }
        public string ActionType { get; set; }
        public string ActionPerformedBy { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            using (ExcelPackage package = new ExcelPackage()) {
                var worksheet = package.Workbook.Worksheets.Add("Sheet1");
                string jsonData = @"[
                    {
                        ""DocumentName"": ""Test Document"",
                        ""ActionDate"": ""2015-09-25T16:06:25.083"",
                        ""ActionType"": ""View"",
                        ""ActionPerformedBy"": ""Sreeja SJ""
                    },
                    {
                        ""DocumentName"": ""Test Document"",
                        ""ActionDate"": ""2015-09-25T16:12:02.497"",
                        ""ActionType"": ""View"",
                        ""ActionPerformedBy"": ""Sreeja SJ""
                    },
                    {
                        ""DocumentName"": ""Test Document"",
                        ""ActionDate"": ""2015-09-25T16:13:48.013"",
                        ""ActionType"": ""View"",
                        ""ActionPerformedBy"": ""Sreeja SJ""
                    }]";

                List<PostData> dataForExcel = JsonConvert.DeserializeObject<List<PostData>>(jsonData);

                worksheet.Cells[1, 1].LoadFromCollection(dataForExcel, true);

                package.SaveAs(File.Create(@"C:\Users\User\Documents\sample.xlsx"));
            }
        }
    }
}

结果为:

Excel


为了在Excel中正确输出日期,您需要为第二列(ActionDate)从第二行到末尾的单元格应用正确的数字格式:

worksheet.Cells[2, 2, worksheet.Dimension.End.Row, 2].Style.Numberformat.Format = "yyyy-mm-ddThh:mm:ss.000";

这不是内部问题。LoadFromCollection需要一个集合。它不解析Json、XML或其他任意格式。 - Panagiotis Kanavos
@PanagiotisKanavos 没错,现在明白了。 - Vladislav Khapin
@VladislavKhapin 没错!它期望输入参数为IEnumerable集合。 - Souvik Ghosh
@VladislavKhapin,如果我这样做,下载的 Excel 文件中 ActionDate 的值将以 42272.67503 的格式呈现。 - Kgn-web
@VladislavKhapin。还有一件事要问。2015-09-25T16:06:25.083中的T是什么意思? - Kgn-web
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接