使用AutoHotkey附加到xls文件时,为什么会出现格式/扩展名错误?

时间:2018-08-15 15:56:16

标签: excel autohotkey

我可以毫无问题地附加到 .csv 文件。

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

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

“ Excel无法打开文件'printlog.xls',因为文件格式或文件扩展名无效。请验证文件未损坏,并且文件扩展名与文件格式匹配。”

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

AHK网站上没有官方文件说FileAppend可以使用 .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()

error image

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

3 个答案:

答案 0 :(得分:1)

要将文本追加到.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()

答案 1 :(得分:1)

这是MS Excel的常见错误。这些是解决方案:

打开并修复选项

  1. 打开MS Excel
  2. 打开->选择损坏的Excel文件
  3. 选择“打开并修复”选项
  4. 点击修复

删除COM加载项

  1. 打开Excel
  2. 文件->选项->加载项
  3. 在“管理”下,选择“ COM加载项”
  4. 点击开始
  5. 删除它们

您还可以阅读该话题的话题:https://social.technet.microsoft.com/Forums/office/en-US/63020ccc-51d7-46d9-b956-121c0e6efcc8/excel-file-error-the-file-format-and-extension-dont-match?forum=Office2016ITPro#595a5e5c-4a04-4e6d-b7d0-2302215eaeae

答案 2 :(得分:1)

对于屏幕截图的第二个问题,这很容易,因为我花了很多时间做这件事……

此:

oExcel.Range("A1").Value := %itemcode%

方法:取变量名称为变量itemcode内容的变量的值(“我猜是。)。

它不适用于您的情况。 示例:

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

所以:

Test := %itemcode%

与:

相同
Test = %A B%

未编译。 :-) 因此,除非您有动态变量(很少有这种情况),否则您需要删除%%,以便将其名称存储在另一个变量中(varception?)。

oExcel.Range("A1").Value := itemcode