我正在读取CSV文件并获取列超出范围错误

时间:2016-02-18 20:12:30

标签: c# excel epplus

我目前正在使用EPPlus库,我正在尝试从目录中读取csv文件。我找到该文件并尝试将其保存为Excel但我在尝试保存时遇到异常Column out of range

    string csvPath = path;
        string expath = "C:\\Users\\er4505\\Desktop\\Test CSV File";

        string exWorksheet = "Test99999";
        bool firstRowIsHeader = false;

        var xformat = new ExcelTextFormat();
        xformat.Delimiter = ',';

        var excelInfo = new FileInfo(expath);
        var csvFileInfo = new FileInfo(csvPath);

        try {
            using (ExcelPackage csvToExcel = new ExcelPackage(excelInfo))
            {
                ExcelWorksheet worksheet = csvToExcel.Workbook.Worksheets.Add(exWorksheet);
                worksheet.Cells["A1"].LoadFromText(csvFileInfo,xformat,OfficeOpenXml.Table.TableStyles.Medium25, firstRowIsHeader);
                csvToExcel.Save();

            }
        }

3 个答案:

答案 0 :(得分:0)

我将代码复制到控制台应用程序中,将“Test CSV File”重命名为“Test CSV File.XLSX”,并使用NuGet下载EPPlus 4.0.5。然后我制作了一个包含三行两列的CSV文件:

    Column1,Column2
    1,2
    a,b

运行代码后,文件将被保存,您可以在Excel中打开输出文件。删除输入文件中的“XLSX”扩展名或“2”不会产生您提到的错误。您可以找到EPPlus代码here,因此可以下载并调试您的问题。您提到的错误消息在ExcelRange.cs第144行中使用。您能否提供有关输入文件的更多信息,以便人们可以重现您的步骤?

答案 1 :(得分:0)

好的家伙昨晚花了这个库的所有文档。此库能够接收列表,但不能使用逗号分隔格式化它。我只是传入了我的查询结果列表,其余的文库就完成了。

List<Engagement> QueryResult = PMService.GetRequestedEngagments(test);

var filename = yourfilename;
var path = @"C:\Users\er4505\Downloads" + filename;
var excelFileInfo = new FileInfo(path);         

try
{
    using (ExcelPackage csvToExcel = new ExcelPackage())
    {
        ExcelWorksheet worksheet = csvToExcel.Workbook.Worksheets.Add(filename);
        worksheet.Cells["A1"].LoadFromCollection(QueryResult, true, OfficeOpenXml.Table.TableStyles.Medium25);
        csvToExcel.SaveAs(excelFileInfo);
    }
}

答案 2 :(得分:0)

我发现,问题出在我的.csv文件中。

EPPlus库读取文件并将其拆分为字符串数组。分隔符模式为“ \ r \ n”。 但是我的.csv文件每行的末尾只有'\ n'符号。

这就是为什么EPPlus认为我的.csv中没有行,但是它的列太多(官方列限制为16384)。

解决方案:

        var text = File.ReadAllText(@"D:\example.csv");

        ExcelTextFormat format = new ExcelTextFormat();
        format.Delimiter = ';';
        format.Culture = new CultureInfo(Thread.CurrentThread.CurrentCulture.ToString());
        format.Culture.DateTimeFormat.ShortDatePattern = "dd.mm.yyyy";
        format.Encoding = new UTF8Encoding();

        //Replacing current "\n" NewLine symbol to "\r\n"
        text = text.Replace("\n", "\r\n");

        using (ExcelPackage excelPackage = new ExcelPackage())
        {
            ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets.Add("Sheet 1");
            worksheet.Cells[1, 1].LoadFromText(text, format);
        }