EPPlus加载CSV并将所有单元格格式化为文本

时间:2019-10-23 20:27:35

标签: .net excel epplus

我正在尝试导入CSV,并让所有单元格准确显示它们如何通过CSV发送。将csv转换为excel文件实际上一切正常,我通过电子邮件发送附件只是看到某些列中的数据被弄乱了。例如,我在单元格中有一个日期,其格式为mm / dd / yyyy,它显示了我在excel中将文件作为整数加载时的日期。整个其他单元格也有相同的问题。我无法单独格式化每个单元格,因为我正在加载一堆各种类型的单元格,所以我希望基本上可以告诉excel文件只接收发送的内容并准确显示该内容。

据我了解,将格式更改为“ @”应该可以满足我的要求,但这不是我所看到的。

使用我知道的单元格进行测试时,我尝试了以下操作,但未发现任何变化。

worksheet.Cells["B1"].Style.Numberformat.Format = "@";

但是,如果我指定这种格式,那么它将起作用。就像我上面说的那样,问题是我在整个其他单元格中都不知道它们是日期还是需要格式化的位置。

worksheet.Cells["B1"].Style.Numberformat.Format = "mm/dd/yyyy";

我也尝试了类似的方法,但没有成功:

worksheet.Cells["A:XFD"].Style.Numberformat.Format = "@";

这是我的全文示例:

    MemoryStream outputStream = new MemoryStream();
    using (var p = new ExcelPackage(outputStream))
    {
        var format = new OfficeOpenXml.ExcelTextFormat();
        format.Delimiter = '|';
        format.DataTypes = new[] { eDataTypes.String };

        foreach (var page in fileContent)
        {
            ExcelWorksheet worksheet = p.Workbook.Worksheets.Add(page.Key);

            worksheet.Cells.LoadFromText(page.Value, format);

            worksheet.Cells["A:XFD"].Style.Numberformat.Format = "@";
            worksheet.Cells[1, 2].Style.Numberformat.Format = "mm/dd/yyyy";
            worksheet.Cells["B1"].Style.Numberformat.Format = "mm/dd/yyyy"; //this works but not when I change it to "@"
            worksheet.Cells["MR11"].Style.Numberformat.Format = "@";
            worksheet.Cells["MS11"].Style.Numberformat.Format = "@";
            //worksheet.Cells["A:XFD"].Style.Numberformat.Format = "@";
            //worksheet.Column(1).Style.Numberformat.Format = "@";
            //worksheet.Column(2).Style.Numberformat.Format = "@";
        }
        p.Save();
    }

我对“ @”符号应如何工作的理解是否正确?我不认为数据类型应该成为问题,因为我使用的只是一个大字符串的CSV。

1 个答案:

答案 0 :(得分:0)

我发现了一个使代码至少可以正常运行的黑客。我基本上对列进行计数,并且必须在for循环中创建DataTypes数组。因此,如果我有600列,则需要将eDataTypes.String添加到格式化程序600次。它不是很漂亮,但是由于某种原因,“ @”对我来说无法将其设置为文本格式。

            var format = new OfficeOpenXml.ExcelTextFormat();
            format.Delimiter = '|';

            List<eDataTypes> allTypes = new List<eDataTypes>();
            for(int i = 0;i < columnCount; i++)
            {
                allTypes.Add(eDataTypes.String);
            }

            format.DataTypes = allTypes.ToArray();
相关问题