Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net EPPlus加载CSV并将所有单元格格式化为文本_.net_Excel_Epplus - Fatal编程技术网

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

.net EPPlus加载CSV并将所有单元格格式化为文本,.net,excel,epplus,.net,Excel,Epplus,我正在尝试导入CSV,并让所有单元格准确显示它们是如何通过CSV发送的。将csv转换成excel文件后,一切都非常顺利,我给附件发了电子邮件,结果发现某些列中的数据乱七八糟。例如,我在单元格中有一个日期,格式为mm/dd/yyyy,当我在excel中以整数形式加载文件时,它会显示出来。还有其他细胞也有同样的问题。我不能单独格式化每个单元格,因为我正在加载一堆不同类型的单元格,所以我希望我基本上可以告诉excel文件只接收发送进来的内容并准确显示出来 我的理解是,将格式更改为“@”应该符合我的要求

我正在尝试导入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只是一个大字符串。

我发现了一种方法,至少可以在我的代码中实现这一点。我基本上是计算列数,并且必须在for循环中创建数据类型数组。因此,如果我有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();
var format=newOfficeOpenXML.ExcelTextFormat();
format.Delimiter='|';
List allTypes=新列表();
对于(int i=0;i
如果您不想修改任何内容,只需将CSV作为文本导入,而不是作为常规导入即可。在你看来,这看起来是一样的,但事实并非如此。@DavidGarcíaBodego当你说要以文本形式而不是一般形式导入时,你会怎么做?我不知道根据上面的代码,我需要做什么不同的事情。您正在尝试将一个CSV导入Excel,不是吗?所以,只需将扩展名从CSV更改为TXT,或者只需将其作为TXT文件打开即可。一旦Excel助手开始,然后选择数据类型为文本,而不是常规,并完成。@DavidGarcíaBodego我想我从你所说的内容中看到了问题所在。问题是我使用的EPPlus扩展正在从csv生成excel文件并通过电子邮件发送出去。因此,我需要它生成的excel文件具有正确的格式,因为它并不总是属于我。我相信你只是想改变我在excel中直接打开csv文件的方式。如果你发布几行csv文件作为示例,可能会有所帮助。请记住,在Excel中,通常可以使用字符串或双精度值作为值。例如,日期是双精度的——整数部分是天,小数部分是时间。但如果您告诉epplus将所有内容都作为字符串处理,它将像那样将其存储在excel中。