C#Excel文本到列问题

嗨,我已经在C#中调用文本列function,但它并没有变成我想要的方式。

我在工作表的第一个单元格中有这些数据。

Guest;0;12/10/2010 03:46:34 PM;66082 

如果我从Excel手动运行文本到列,我会得到。

 Guest 0 12/10/2010 15:46 66082 

但是,如果我跑过我的C#代码,我明白了。

 Guest 0 10/12/2010 15:46 66082 

date格式已经从“DD / MM / YYYY”切换到“MM / DD / YYYY”

这是我的C#代码

 ((Range)ws.Cells[1,1]).EntireColumn.TextToColumns( Type.Missing, Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierNone, Type.Missing, Type.Missing, true, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 

我甚至从Excel中logging了macros。

 Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _ TextQualifier:=xlNone, ConsecutiveDelimiter:=False, Tab:=False, _ Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _ :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)) 

我唯一不能尝试的就是FieldInfo。 不知道如何将其转换为C#。 Google也没有太多的帮助。 我有点怀疑它是xlGeneralFormat。

有任何想法吗? 谢谢。

 object fieldInfo = new int[4,2] {{1,1},{2,1},{3,1},{4,1}}; 

好吧,我意识到问题不在于FieldInfo,即使我忽略它也能正常运行。

问题在于这个。

 wb.Close(true, saveFileDialog1.FileName, Type.Missing); 

我把它保存到另一个文件。 并发现原始文件是我想要的正确格式。 但新保存的文件格式不正确。

我注释了closures的行,并手动保存它。 旧文件仍处于分隔forms,而新文件的格式仍然不正确。

显然,对象FileName只在“saveFileDialog1.FileName”时才起作用。 换句话说,只有它是相同的文件名才有效。 我试过Type.Missing和@“C:\ lalala.xls”,它没有文本到列。

我只是意识到文本格式的列甚至不工作 – 好吧,我放弃。 我将把DateTime转换为Excel Serial DateTime。 一个有趣的问题。

我所拥有的书(使用VBA和.NET编程,Webb和Saunders)简单地将FieldInfo描述为“描述文本中字段数据types的数组”。 所以它似乎确实应该在那里,但是macros不包含任何date格式。

MSDN参考文档更有用:

http://msdn.microsoft.com/en-us/library/04b02wh9%28v=VS.80%29.aspx

是的,它是一个数组:实际上是一个值对数组(因此是macros中数组的数组)。 第一个值是列号。 第二个值是XlColumnDataType常量。 定义在这里:

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.xlcolumndatatype.aspx

请注意date格式的列表。 看起来你需要第三列的xlDMYFormat或xlMDYFormat值?

如果您知道哪个列包含date(如上所述),那么您也可以在之后明确地设置格式。 尽pipe可以将它变成两个阶段的过程,但是可以节省数组的空间。

重新录制你的macros,并在向导的第3步设置问题列的格式给你正确的数组值。使用这些值,我认为这个调用应该是这样的:

 int[][] fieldInfoArray = { new int[] { 1, 1 }, new int[] { 2, 1 }, new int[] { 3, 3 }, new int[] { 4, 1 } }; ((Range)ws.Cells[1,1]).EntireColumn.TextToColumns( Type.Missing, Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierNone, Type.Missing, Type.Missing, true, Type.Missing, Type.Missing, Type.Missing, Type.Missing, (object)fieldInfoArray, Type.Missing, Type.Missing); 

它要求一个数组,你必须发送一个数组。

 Array fieldInfoArray = new int[,] { { 1, 1 }, { 2, 1 }, { 3, 3 }, { 4, 1 } }; ((Range)ws.Cells[1,1]).EntireColumn.TextToColumns( Type.Missing, Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierNone, Type.Missing, Type.Missing, true, Type.Missing, Type.Missing, Type.Missing, FieldInfoArray, Type.Missing, Type.Missing, Type.Missing); 

可选的,你可以只使用你想改变格式的列,其他的将保持在“一般”。 第一个是列号,第二个是格式。

 Array fieldInfoArray = new int[,] { { 3, 3 } };