Excel 为什么在使用自动热键附加到xls文件时出现格式/扩展名错误?

Excel 为什么在使用自动热键附加到xls文件时出现格式/扩展名错误?,excel,autohotkey,Excel,Autohotkey,我正在添加一个.csv文件,没有任何问题 相反,我想附加到一个.xlsx文件,因为我想制作一个漂亮的表 不幸的是,在打开xlsx文件时,我收到以下消息: “Excel无法打开文件‘printlog.xls’,因为文件格式或文件扩展名无效。请验证文件是否已损坏,以及文件扩展名是否与文件格式匹配。” 它不会对csv文件执行此操作 AHK网站上没有官方文档表明可以将文件附加到.xlsx格式,但网上有很多这样做的例子 这是我的密码: SetWorkingDir %A_ScriptDir% Contro

我正在添加一个.csv文件,没有任何问题

相反,我想附加到一个.xlsx文件,因为我想制作一个漂亮的表

不幸的是,在打开xlsx文件时,我收到以下消息:

“Excel无法打开文件‘printlog.xls’,因为文件格式或文件扩展名无效。请验证文件是否已损坏,以及文件扩展名是否与文件格式匹配。”

它不会对csv文件执行此操作

AHK网站上没有官方文档表明可以将文件附加到.xlsx格式,但网上有很多这样做的例子

这是我的密码:

SetWorkingDir %A_ScriptDir%

ControlGetText, test, Edit10, TeamViewer

filename = %A_ScriptDir%\printlog.xlsx

FileAppend,
(
%test%,%test%,%test%,%test%
%test%,%test%,%test%,%test%
), %filename%
更新:由于@user3419297的解决方案,这个问题的第一部分已经解决。下面列出了我的一个新问题

FilePath := A_ScriptDir "\printlog.xlsx"   ; get file path
SetWorkingDir %A_ScriptDir%                ; set working directory

ControlGetText, itemcode, Edit1, Print -   ; get item code from print menu
ControlGetText, quantity, Edit2, Print -   ; get quantity from print menu
ControlGetText, amount, Edit3, Print -     ; get amount from print menu
ControlGetText, initials, Edit4, Print -   ; get quantity from print menu
ControlGetText, info, Edit5, Print -       ; get quantity from print menu
ControlGetText, batch, Edit6, Print -      ; get quantity from print menu

Formattime,ts,,Shortdate                   ; generate short date variable

oExcel := ComObjCreate("Excel.Application")  ; create Excel COM object
oWorkbook := oExcel.Workbooks.Open(FilePath) ; open workbook in Excel object
oExcel.Visible := false                      ; work in background

                                               ; check for blank rows and append values
For Row in oExcel.Range["A1"]                  ; starting with the first row
{
        If (Row.Value = "")                        ; if first row is blank
        {
                oExcel.Range("A1").Value := %itemcode% ; set value of cell A-G
                oExcel.Range("B1").Value := %quantity%
                oExcel.Range("C1").Value := %amount%
                oExcel.Range("D1").Value := %initials%
                oExcel.Range("E1").Value := %info%
                oExcel.Range("F1").Value := %batch%
                oExcel.Range("G1").Value := %ts%
        }
        else ; else find the next blank row and set values of A-G
        For eachRow in oExcel.Range["A1:A" oExcel.Columns("A").Find[""].Row]
        {
        If (eachRow.Value = "")
            {
                        oExcel.Range("A" . A_Index).Value := %itemcode%
                        oExcel.Range("B" . A_Index).Value := %quantity%
                        oExcel.Range("C" . A_Index).Value := %amount%
                        oExcel.Range("D" . A_Index).Value := %initials%
                        oExcel.Range("E" . A_Index).Value := %info%
                        oExcel.Range("F" . A_Index).Value := %batch%
                        oExcel.Range("G" . A_Index).Value := %ts%
                        break
            }
        }
}
oWorkbook.Save() ; save workbook and close excel
oExcel.Quit()


正如您所看到的,我得到的错误是一个非法字符。我不明白,因为变量的内容是字符串。这是否与变量本身的格式有关,还是与将变量附加到excel文件的格式有关?

要将文本附加到.xlsx文件,必须使用COM:

test := "my text"

FilePath := A_ScriptDir "\printlog.xlsx"
oExcel := ComObjCreate("Excel.Application")
oWorkbook := oExcel.Workbooks.Open(FilePath)
oExcel.Visible := false
oExcel.Range("A1").Value := test
oWorkbook.Save()
oExcel.Quit()
另一个例子:

将复制文本的前3个单词附加到各自列a、b、c中的下一个空行:

FilePath := A_ScriptDir "\printlog.xlsx"

Array:=[]
Array := StrSplit(clipboard, " ")

oExcel := ComObjCreate("Excel.Application")
oWorkbook := oExcel.Workbooks.Open(FilePath)
oExcel.Visible := false
For Row in oExcel.Range["A1"]
{
    If (Row.Value = "")
     {
        oExcel.Range("A1").Value := Array[1]
        oExcel.Range("B1").Value := Array[2]
        oExcel.Range("C1").Value := Array[3]
    }
    else
    For eachRow in oExcel.Range["A1:A" oExcel.Columns("A").Find[""].Row]
    {
     If (eachRow.Value = "")
       {
            oExcel.Range("A" . A_Index).Value := Array[1]
            oExcel.Range("B" . A_Index).Value := Array[2]
            oExcel.Range("C" . A_Index).Value := Array[3]
                break
        }
    }
}
oWorkbook.Save()
oExcel.Quit()

对于你的第二个屏幕截图问题很简单,因为我做了很多次这个

这:

oExcel.Range("A1").Value := %itemcode%
意思是:取变量的值,该变量的名称是变量itemcode的内容(“this.is.a.test.”我猜?)

这在你的情况下是行不通的。 例如:

itemcode := "A B"
msgbox %itemcode% ; display will be : A B
因此:

Test := %itemcode%
同:

Test = %A B%
未编译。:-) 因此,您需要删除%%,除非您有动态变量(很少是这种情况),以便将它们的名称存储在其他变量中(varception?)


更改文件名不会更改其格式。您需要打开csv并将其重新保存为xlsx。我理解这一点,但为了澄清,我不打算使用AHK将我的csv转换为xlsx文件。我试图做的是将数据附加到excel文件,而不是csv文件。我希望这有道理。@NikkiLuzader不,这没有道理。与
CSV
类型文件相关的
append
方法并不意味着它与使用
xlsx
格式附加到文件的方法相同,因为它是XML ish格式。如果您想在不使用wikipedia的情况下检查该文件,请检查文件格式/结构。。试试这个。。。用记事本打开一个小的csv文件。。请看内容。它很容易添加。尝试打开xlsx。。您无法读取数据。。因此,它不是可以直接附加的。Xlsx格式类似于zip格式。。您可以使用winrar/winzip/7z打开xlsx文件进行查看。。它是xml文件的集合这就是为什么在向xml中添加数据行/列之前必须先“提取”xml。。与csv不同。。您只需在文件末尾添加一些“逗号分隔值”,就可以添加数据的行/列。@p.(phidot)用.xls代替.xlsx怎么样?使用此格式是否可行?这非常适合更改范围A1的内容,但我想做的是将值附加到下一个空单元格。实际上,我想特别地将变量x,y,z附加到它们各自列a,b,c中的下一行。这可能吗?试试我编辑的答案中的第二个例子。这很有效!非常感谢你!我可以将变量插入数组,而不是使用剪贴板上的内容,对吗?我找到了一种更好的方法来获取下一个空行。试试我编辑过的答案,更好!我喜欢这一个不需要ini文件的方式,但我对ini文件的工作原理以及它们的用途有了更多的了解,这要感谢您的原始示例(我保存了该示例)。我要更新这个问题,因为我使用它是为了打印日志,我得到一个错误,说我的变量包含非法字符
oExcel.Range("A1").Value := itemcode