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

Vb.net 是否将xls文件转换为csv,但添加了额外的行?,vb.net,excel,csv,Vb.net,Excel,Csv,所以,我正在尝试将一些xls文件转换为csv文件,除了一个部分外,其他一切都很好。Excel互操作中的SaveAs函数似乎可以导出所有行(包括空白行)。当我使用记事本查看文件时,可以看到这些行。(我期望的所有行,15行加上两个单引号,其余的都是空的)。然后,我有一个存储过程,它获取此csv并导入到所需的表中(这适用于已手动转换为csv的电子表格(例如打开、文件-->另存为等) 下面是我在代码中用于SavesAs的代码行。我尝试使用xlCSV、xlCSVWindows和xlCSVDOS作为我的文件

所以,我正在尝试将一些xls文件转换为csv文件,除了一个部分外,其他一切都很好。Excel互操作中的SaveAs函数似乎可以导出所有行(包括空白行)。当我使用记事本查看文件时,可以看到这些行。(我期望的所有行,15行加上两个单引号,其余的都是空的)。然后,我有一个存储过程,它获取此csv并导入到所需的表中(这适用于已手动转换为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”,我的过程会再次喜欢它。

从工作簿创建csv时,csv是根据您的UsedRange生成的。因为UsedRange可以通过对单元格应用格式(无任何内容)来扩展这就是为什么您会得到空行。(由于这个问题,您也可以得到空列。)

当您打开生成的CSV时,由于没有内容或格式(因为CSV中只保存值),所有这些无内容单元格不再对UsedRange作出贡献

您可以通过在保存之前更新已使用的范围来纠正此问题。下面是我用VBA编写的一个简短的sub,可以解决此问题。此代码会使您丢失所有格式,但我认为这并不重要,因为您仍要保存到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

当您从工作簿创建CSV时,CSV将根据您的UsedRange生成。由于UsedRange可以通过将格式应用于单元格(不包含任何内容)来扩展,因此您将获得空行。(由于此问题,您也可以获得空列。)

当您打开生成的CSV时,由于没有内容或格式(因为CSV中只保存值),所有这些无内容单元格不再对UsedRange作出贡献

您可以通过在保存之前更新已使用的范围来纠正此问题。下面是我用VBA编写的一个简短的sub,可以解决此问题。此代码会使您丢失所有格式,但我认为这并不重要,因为您仍要保存到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

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

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


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

使用VBA和Excel2007测试代码-效果良好

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


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

恐怕这还不够。似乎存在Excel错误,即使删除非数据单元格也不足以防止在保存为csv时将其作为空单元格写入


恐怕这还不够。似乎有一个Excel错误,使得即使删除非数据单元格也不足以防止它们在保存为csv时被写为空单元格


另一种方法,无需脚本。按Ctrl+End。如果在实际数据后的一行中结束,则从第一行中选择行,直到至少结束该行,单击鼠标右键,然后“清除内容”.

另一种方法,无需脚本。按Ctrl+End。如果在实际数据后的一行中结束,则从第一行中选择行,直到至少结束该行,单击鼠标右键,然后“清除内容”.

稍作修改,学习如何处理日期问题,效果非常好。谢谢!稍作修改,学习如何处理日期问题,效果非常好。谢谢!这就是为什么接受的答案有效。在您的链接中,您只需删除数据,然后重新保存,这就是我看到的问题。Howe无论如何,在保存为csv之前运行Daniel Cook建议的宏,那么问题就不会继续了。实际上,有更简单的方法来完成我从那以后发现的过程,比如只使用
ActiveSheet。UsedRange
我明白了这一点,我对解决方法表示感谢。但是bug是bug,不需要编写te VBA代码仅用于手动保存文件并获得预期结果。UsedRange应为“使用范围”,而不是“我可能使用过一次但不再包含任何内容的单元格范围,甚至格式”。这就是被接受的答案起作用的原因。在您的链接中,您只需删除数据,然后重新保存,这就是我看到的问题。但是,在保存为csv之前运行Daniel Cook建议的宏,则问题不会继续。实际上,有更简单的方法来完成我从那时起发现的过程,例如just使用
ActiveSheet.UsedRange
我明白了这一点,我很感谢您的解决方案。但是bug就是bug;不必编写VBA代码来手动保存文件并获得预期的结果。UsedRange应该是“使用范围”,而不是“我可能使用过一次但不再包含任何内容的单元格范围,甚至格式”.谢谢Jay。我没有投你反对票,但我猜这是因为这个问题是关于通过编程来实现这一点,而不是在Excel应用程序中使用键盘快捷键