1

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

这是我在代码中用于 SaveAs 的代码行。我尝试过 xlCSV、xlCSVWindows 和 xlCSVDOS 作为我的文件格式,但它们都做同样的事情。

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

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

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

4

4 回答 4

5

当您从工作簿创建 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
于 2012-10-24T15:29:20.257 回答
0

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

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

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

于 2012-10-24T15:29:29.290 回答
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

于 2016-04-25T01:11:10.723 回答
-1

另一种方式,没有脚本。点击 Ctrl+End 。如果这在您的真实数据之后出现在一行中,则从第一个行中选择行,直到至少该行结束,右键单击并“清除内容”。

于 2018-04-24T15:23:42.413 回答