尝试通过 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.
我想做的是使用 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
}