.net EPPlus加载CSV并将所有单元格格式化为文本
我正在尝试导入CSV,并让所有单元格准确显示它们是如何通过CSV发送的。将csv转换成excel文件后,一切都非常顺利,我给附件发了电子邮件,结果发现某些列中的数据乱七八糟。例如,我在单元格中有一个日期,格式为mm/dd/yyyy,当我在excel中以整数形式加载文件时,它会显示出来。还有其他细胞也有同样的问题。我不能单独格式化每个单元格,因为我正在加载一堆不同类型的单元格,所以我希望我基本上可以告诉excel文件只接收发送进来的内容并准确显示出来 我的理解是,将格式更改为“@”应该符合我的要求,但这不是我所看到的 当我使用一个我知道是日期的手机进行测试时,我尝试了以下步骤,但没有看到任何变化.net EPPlus加载CSV并将所有单元格格式化为文本,.net,excel,epplus,.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只是一个大字符串。我发现了一种方法,至少可以在我的代码中实现这一点。我基本上是计算列数,并且必须在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中。