将xls文件转换为csv,但是添加了额外的行?

时间:2012-10-24 15:10:17

标签: vb.net excel csv

所以,我试图将一些xls文件转换为csv,一切都很好,除了一部分。 Excel互操作中的SaveAs函数似乎导出所有行(包括空行)。当我使用记事本查看文件时,我可以看到这些行。 (我期望的所有行,15行有两个单引号,其余的只是空白)。然后我有一个存储过程,它接受这个csv并导入到所需的表(这适用于已手动转换为csv的电子表格(例如open,File - > Saving As等)

以下是我在代码中用于BanksAs的代码行。我尝试过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中显示extraneuos行?

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用VBA和Excel2007测试您的代码 - 效果很好。

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

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

答案 2 :(得分: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

答案 3 :(得分:-1)

另一种方式,没有脚本。按Ctrl +结束。如果它在真实数据之后排成一行,则选择第一行中的行,直到至少最后一行,右键单击和“清除内容”。