【问题标题】:VBS Excel SaveAs csv FileFormat 62/xlCSVUTF8 doesn´t workVBS Excel SaveAs csv FileFormat 62/xlCSVUTF8 不起作用
【发布时间】:2021-07-15 14:52:40
【问题描述】:

我有一个 VBS 脚本,将 Excel 文件转换为 SQL 服务器调用的 csv 格式。它包含:

Set objExcel = CreateObject("Excel.Application
Set objBook = objExcel.Workbooks.Open(objFile.Path, , True)
objBook.Worksheets(i).Activate
objBook.SaveAs file_out_start & i & ".csv", 6, , , True, False, , , , , , True

这将返回一个以 ANSI 编码的 csv 文件。 为了进一步处理文件,我需要输出采用 UTF-8 编码。

按照 Microsoft 文档 herehere,我尝试将参数 6 更改为代表“UTF8 CSV”的 62。 通过此更改,脚本停止工作并退出并出现以下错误:

line: 36 (line of 'objBook.SaveAs')
error: The SaveAs method of the Workbooks object could not be executed. (translated)
Code: 800A03EC
source: Microsoft Excel

谁能帮忙解释为什么会这样? 如果无法直接使用 UFT-8 编码导出,是否有一种简单的方法可以在脚本中将文件转换为 UFT-8?

【问题讨论】:

  • 为什么是 SQL Server 标签?这与 SQL Server 有什么关系?无论如何,您使用的脚本控制本地安装的 Excel 实例。那个实例有这样的选择吗?该文件绝对使用 7 位 US-ASCII 代码页,它使用系统区域设置代码页,很可能是 Latin1。
  • 如果文件是 ASCII,那么它也将是 UTF8。 UTF8 对前 128 个字符使用与 ASCII 完全相同的字节值。除此之外,它每个字符使用 2 个或更多字节。除非文件包含高于 0x7F 的字节,否则无法判断文件是使用 ASCII 还是 UTF8 创建的
  • @Panagiotis Kanavos 感谢您的快速回复。我使用了该标签,因为主要目标是将 Excel 文件转换为 UTF-8 格式的 csv,以便将数据从远程源导入我的 SQL Server。 (我是 Stack Overflow 的新手,如果我出错了,抱歉。)我知道 ASCII 和 UTF8 之间的关系,但看不到与我的问题的关系:我的文件导出为 ANSI(ASCII 的另一个扩展名)。将导出的文件导入我的 sql 服务器会产生特殊字符(ü、ä、ö、ß)的问题。您对如何解决这个问题或实现项目的更好方法有什么建议。
  • don't see the relation to my question 相反,这是最重要的部分。您不使用 ANSI 或 ASCII。如果您的机器使用美国或西欧语言环境,您可能正在使用 Latin1。无论代码页如何,您都可以使用bcp 工具、BULK INSERT 命令或SSIS 将任何平面文件导入SQL Server。它不需要在特定的代码页中。您也可以使用 SSIS 直接从 Excel 导入。您还可以使用 ADO/OLEDB 从 Excel 中读取数据,就像它是一个表格一样。 Excel 在导入场景中既不需要也不使用
  • VBScript 基本上已经死了,几乎从未使用过。它从未真正成为一种脚本语言,并在 2006 年被 Powershell 取代,Powershell 建立在 .NET 之上,并且功能更强大。 Export-Csv 和 Import-CSV 等命令是内置的,而ImportExcel 等额外模块可以导入和导出 Excel 文件

标签: sql-server excel utf-8 vbscript ansi


【解决方案1】:

我遇到了类似的问题。我认为问题在于 Excel 只能将 WorkSheet 保存为 csv,而不是 WorkBook,因此需要使用 Worksheet.SaveAs 而不是 Workbook.SaveAs。我的代码如下。

Worksheet.SaveAs 链接:https://docs.microsoft.com/en-us/office/vba/api/excel.worksheet.saveas

Wscript.Echo "converting .xlsx to UTF8 .csv"
Set obj = CreateObject("Excel.Application")
p = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName)
Set book = obj.Workbooks.Open(p & "\filename.xlsx")
obj.Application.Visible = False
Set sheet = book.Worksheets("Sheet1")
book.RefreshAll
obj.DisplayAlerts = False
sheet.SaveAs p & "\filename.csv", 62
book.Close False
Wscript.Echo "closing Excel.Application"
obj.Quit 'Not sure if this does anything but the internet said to use it

Wscript.Echo "End of vbs reached"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多