在Excel和记事本中打开时,将数字格式化为CSV格式的文本

时间:2015-08-15 06:31:32

标签: c# excel csv notepad++

我收到了将数据保存在CSV文件中并将其发送给客户的要求。 客户使用Excel和记事本来查看此文件。 数据看起来像:

  

975567EB,973456CE,971343C8

我的数据有一些数字以#34; E3"喜欢:

  

98765E3

因此在Excel中打开时,它将更改为:

  

9.8765E + 7

我编写了一个程序,通过添加=" 98765E3"将此格式更改为文本。在C#

while(!sr.EndOfStream) {
     var line = sr.ReadLine();
     var values = line.Split(',');

     values[0] = "=" + "\"" + values[0] + "\""; //Change number format to string

     listA.Add(new string[] {values[0], values[1], values[2], values[3]});
}

但是对于使用记事本打开CSV文件的客户,它会显示如下:

  

=" 98765E3"

如何将数字保存为CSV文本,以便在Excel和记事本中打开,结果相同?非常感谢任何建议!

1 个答案:

答案 0 :(得分:3)

  

不要拍摄信使。

您的问题不是您在C#中导出(创建......?)数据的方式。您可以在Excel中打开CSV文件。

Excel有许多用于导入文本文件的选项,允许使用 FieldInfo 参数,该参数为引入的每个字段(也称为列)指定TextFileColumnDataTypes property

如果您选择从资源管理器文件夹窗口中双击CSV文件,那么您将不得不忍受Excel“最佳猜测”是每列的预期字段类型。它不会在导入过程中途停止询问您的意见。一些常见错误包括:

  • 带有E的字母数字值通常会被解释为科学记数法。
  • DMY日期的一半将被误解为错误的MDY日期(或反之亦然)。另一半将成为文本,因为Excel无法像2015年8月14日那样处理MDY。
  • 任何以+开头的值都会产生#NAME!错误,因为Excel认为您正在尝试引入具有命名质量的公式。

这是常见错误的简短列表。还有其他人。以下是一些常见的解决方案。

  • 使用数据►获取外部数据►来自文本。明确指定任何不明确的列数据类型;例如98765E3为文本,日期为DMY,MDY,YMD等视具体情况而定。甚至可以选择丢弃一列无用的数据。
  • 使用文件►打开►文本文件,它将引导您完成与上述选项相同的导入向导。可以使用任一命令记录这些操作以便重复使用。
  • 使用VBA的Workbooks.OpenText method并指定每个列的 FieldInfo 位置和数据类型(后者的XlColumnDataType常量)。
  • 将导入文件读入内存并在将其转储到目标工作表之前将其处理到内存数组中。

还有一些不太精确的解决方案仍然需要Excel的解释。

  • 使用Range.PrefixCharacter强制带有前导零或字母数字值的数字,这些数字可能会被误解为工作表中的科学记数法文本。
  • 使用文本限定符字符;通常是ASCII字符034(例如")来包装您想要解释为文本的值。
  • 将整个文本文件复制并粘贴到目标工作表的A列中,然后使用Range.TextToColumns method(再次使用每列可用的FieldInfo选项)。

后两种方法会在记事本中产生一些奇怪的值,但记事本不是Excel,不能在几秒钟内处理50万次计算和其他操作。如果你必须混搭这两个程序,那么会有一些妥协。

我的建议是在记事本中尽可能保留最佳值,并使用Excel中现有的工具和流程正确导入数据。