【问题标题】:How to stop OLEDB to create "(sheet name)1" sheet automatically如何停止 OLEDB 自动创建“(工作表名称)1”工作表
【发布时间】:2022-01-01 07:44:25
【问题描述】:

背景

我正在编写一个 PowerShell 脚本来将一些数据写入 Excel 文件 (.xlsx),其中 Microsoft.ACE.OLEDB 如下所示:

$fileName = "C:\tmp\createtest.xlsx"
$sheetName = "record"
$provider = "Provider=Microsoft.ACE.OLEDB.12.0"
$dataSource = "Data Source = $fileName"
$extend = "Extended Properties=Excel 12.0"
$ddlSQL = "CREATE TABLE [$sheetName] (ID CHAR(4), NAME VARCHAR(20))"

$conn = New-Object System.Data.OleDb.OleDbConnection("$provider;$dataSource;$extend")

$sqlCommand = New-Object System.Data.OleDb.OleDbCommand
$sqlCommand.Connection = $conn
$conn.open()

$sqlCommand.CommandText = $ddlSQL
$sqlCommand.ExecuteNonQuery()
...
$conn.close()

问题

当您使用名为 record 的空工作表手动创建 C:\tmp\createtest.xlsx 时,CREATE TABLE 语句会自动创建 record1 工作表。

我想停止这种行为,让CREATE TABLE语句像普通RDBMS一样抛出异常。

问题

当 Excel 文件有同名工作表时,有什么方法可以阻止 OLEDB 自动创建 (sheet name)1 工作表?

【问题讨论】:

  • 也许先做"DROP TABLE [$sheetName]" ?

标签: excel powershell oledb create-table


【解决方案1】:

我找到了解决方案。执行CREATE TABLE,表名后缀$

$ddlSQL = "CREATE TABLE [${sheetName}$] (ID CHAR(4), NAME VARCHAR(20))"

如果书籍和工作表record 已经存在,则此语句将正确完成。如果书籍或工作表record 不存在,则此语句抛出OleDbException。无论哪种方式,都不会创建新工作表,因此您可以安全地测试工作表的存在。

如果你想使用工作表record而不考虑现有工作表并避免自动创建record1工作表,你可以这样做:

$checkExistenceSQL = "CREATE TABLE [${sheetName}$] (ID CHAR(4), NAME VARCHAR(20))"
$ddlSQL = "CREATE TABLE [$sheetName] (ID CHAR(4), NAME VARCHAR(20))"

$conn.open()
try {
  try {
    # Check existing sheet and open if it exists
    $sqlCommand.CommandText = $checkExistenceSQL
    $sqlCommand.ExecuteNonQuery() > $null
  } catch {
    try {
      # Create new sheet if it doesn't exist
      $sqlCommand.CommandText = $ddlSQL
      $sqlCommand.ExecuteNonQuery() > $null
    } catch {
      throw $PSItem
    }
  }

  $insertSQL = "INSERT INTO [${sheetName}$] VALUES (...)"
  $sqlCommand.CommandText = $insertSQL
  $sqlCommand.ExecuteNonQuery() > $null
} finally {
  $conn.close()
}

请注意,即使工作表已经存在,您也必须先执行CREATE TABLE,因为它会影响数据类型约束的有效性。此外,您必须在INSERT 语句中为表名添加$ 后缀,因为如果工作表record 已经存在,则会失败。详情请参阅https://satob.hatenablog.com/entry/2021/11/24/003818https://satob.hatenablog.com/entry/2021/11/25/012835

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多