尝试通过 TCL (tcom) 编辑 xsl 文件时出现未知错误 0x800A01A8

Unknown error 0x800A01A8 when trying to edit xsl file via TCL (tcom)

我想做的是使用 TCL 脚本向某些 excel 文件添加文本。 为了与 excel 一起工作,我正在使用 Tcom 。

set excelFilePath "C:/TCL.Marko.xlsx"

proc start_tcom {} {
    global excelFilePath excelApp workbook 
    set excelApp [::tcom::ref createobject Excel.Application]
    set workbooks [$excelApp Workbooks]
    set workbook [$workbooks Open [file nativename [file join [pwd] $excelFilePath] ] ]
    set worksheets [$workbook Worksheets]
    #
    set excel_sheet Marko.xlsx
    set worksheet [$worksheets Item [expr 1]]
    set cells [$worksheet Cells]
    return $cells
}

至此一切正常。

509 % start_tcom
::tcom::handle0x0284F9D8

那我是运行:

513 % foreach row {1 2 3} {
    foreach column {A B C} {
        $cells Item $row $column [incr i]
    }
}

并出现此错误:

0x800a01a8 {Unknown error 0x800A01A8}

如果我在做 save_and_close_tcom 我可以看到文件 Marko.xslx 更新了正确的时间和日期,因此 TCL 看到了正确的文件,但仍然收到此错误。

应该删除“set excel_sheet Marko.xlsx”。 此命令意味着使用选项卡名称 "Marko.xlsx" ,但此选项卡不存在。这就是错误出现的原因。 这是带有解释的正确代码:

proc start_tcom {} {

            global excelFilePath excelApp workbook 
              set excelApp [::tcom::ref createobject Excel.Application]
             # Connect to Excel COM object.

            set workbooks [$excelApp Workbooks]
            set workbook [$workbooks Open [file nativename [file join [pwd] $excelFilePath] ] ]
            set worksheets [$workbook Worksheets]
            # Create inital workbook.


           set worksheet [$worksheets Item [expr 1]]
         $worksheet Name "Booleans"
  # Rename the first tab.

            set cells [$worksheet Cells]
            return $cells
            #Making cells ready for input

}

现在我们准备好直接使用 XSL 文档

我将展示一个将简单的 txt 文件复制到我们刚刚创建的 XSL 中的示例。

假设我们有一个名为 WTX.txt 的 TXT 文档,其中包含一个值列表。

set fp [open "[pwd]/TEMP/WTX.txt" r] 设置 file_data [读取 $fp]

现在我们知道 XSL 中的每个单元格都由列和原始索引,因此为了填充 XSL,我们需要指定确切的索引。

            set Col A 
            set Row 1 

在下面的代码中,我们创建了一个简单的 while 循环来 运行 遍历 txt 文件值并用它们填充 XSL。

            set Row 1
            while {[lindex $file_data $i] != ""} {
            $cells Item $Row $Col $numeric_value_from_file
            incr Row

}

让我们讨论标记的行,这是用值填充单元格的实际命令。

该行的实际格式是:$cells(我们之前创建的)ITEM(它自己的单元格)Row Col

所以我们实际上说的是(backwords)取值并将其放入用一些行和列索引的单元格中。

EOF.