2012-10-24 22 views
1

所以,我试图将一些xls文件转换为csv,并且除了一部分以外,一切都很好。 Excel interop中的SaveAs函数似乎导出所有行(包括空白行)。使用记事本查看文件时,我可以看到这些行。 (我期望的所有行,15行和两个单引号,然后剩下的只是空白)。然后,我有一个存储过程,将此csv并导入到所需的表(这适用于已手动转换为csv的电子表格(例如打开,文件 - >另存为等)将xls文件转换为csv,但添加了额外的行吗?

这是行代码我使用了我在我的代码SavesAs。我已经试过xlCSV,xlCSVWindows和xlCSVDOS我的文件格式,但他们都做同样的事情。

wb.SaveAs(aFiles(i).Replace(".xls", "B.csv"), Excel.XlFileFormat.xlCSVMSDOS, , , , False) 'saves a copy of the spreadsheet as a csv 

那么,有没有一些额外的步骤/设置我需要做的不是让额外的行显示在csv中吗?

请注意,如果我打开这个新创建的csv,然后单击另存为,然后选择csv,m y程序再次喜欢它。

回答

4

当您从工作簿创建CSV时,将根据您的UsedRange生成CSV。由于UsedRange可以简单地通过将格式应用于单元格(没有任何内容)进行扩展,这就是为什么你会得到空行。 (由于此问题,您也可以获得空白列。)

当您打开生成的CSV时,由于没有内容或格式设置,所有这些无内容单元格不再有助于UsedRange(因为只有值保存在的CSV)。

您可以通过在保存之前更新您使用的范围来更正此问题。下面是我在VBA中写的一个简短的子代码,它可以做到这一点。这段代码会让你失去所有格式,但我认为这并不重要,因为无论如何你都要保存为CSV。我将离开转换到VB.Net由你决定。

Sub CorrectUsedRange() 
    Dim values 
    Dim usedRangeAddress As String 
    Dim r As Range 
    'Get UsedRange Address prior to deleting Range 
    usedRangeAddress = ActiveSheet.UsedRange.Address 
    'Store values of cells to array. 
    values = ActiveSheet.UsedRange 
    'Delete all cells in the sheet 
    ActiveSheet.Cells.Delete 
    'Restore values to their initial locations 
    Range(usedRangeAddress) = values 
End Sub 
+0

轻微的修改,并学习如何处理日期问题,这完美的工作。谢谢! – APrough

0

用VBA和Excel2007测试你的代码 - 效果不错。

但是,我可以通过格式化数据单元格下方的空单元格以粗体进行复制。然后我会在csv中得到空的单引号。但是,当我使用SaveAs时,情况也是如此。

所以,我的建议是清除所有非数据单元,然后保存您的文件。这样你至少可以排除这个错误点。

0

恐怕这可能还不够。看起来有一个Excel错误,甚至会删除非数据单元,以防止它们在保存为csv时被写为空单元格。

http://answers.microsoft.com/en-us/office/forum/office_2010-excel/excel-bug-save-as-csv-saves-previously-deleted/2da9a8b4-50c2-49fd-a998-6b342694681e

+0

这就是接受的答案有效的原因。在您的链接中,您只需删除数据然后重新保存,这是我所看到的问题。但是,在保存为csv之前,通过运行Daniel Cook建议的宏,问题不会继续。实际上有更简单的方法来完成我从那以后发现的过程,例如使用'ActiveSheet.UsedRange' – APrough

+0

我明白了,我很感谢解决方法。但是一个bug是一个bug;不必编写VBA代码来手动保存文件并获得预期的结果。 UsedRange应该是“已使用的范围”,而不是“我可能使用过的单元格范围,但不再包含*任何内容*,甚至格式化”。 – JHD