Я чувствую себя грязно, спрашивая об этом, потому что это такой хакерский обходной путь, но у меня есть проект, в котором результат должен быть одним файлом .xlsm.Тем не менее, у нас нет никаких ограничений на то, какие файлы этот результат может записывать или выполнять.VBA и редактор макросов Excel имеют ограничения, которые не работают с проектом.
Поэтому я пытаюсь сохранить двоичные значения интерпретатора Python в листе, а затем записать этот .exe на компьютер клиента, когдамакрос запускается(Я знаю, что это в значительной степени вирус и плохая идея, но требования строги и неизменны.)
У меня есть макрос для чтения python.exe на листе:
Function ReadFromFile(path)
Dim bytes() As Byte
Dim fileInt As Integer: fileInt = FreeFile
Open path For Binary Access Read As #fileInt
ReDim bytes(0 To LOF(fileInt) - 1)
Get #fileInt, , bytes
Close #fileInt
Set ReadFromFile = bytes
End Function
Sub ReadCompiler_Click()
Dim path As String: path = ActiveWorkbook.path & "\python.exe.original"
Dim bytes() As Byte
bytes = ReadFromFile(path)
Dim cell As Range
Set cell = Worksheets("PythonEXE").Range("A1")
For Each chunk In bytes
cell.Value = chunk
Set cell = cell.Offset(1, 0)
Next chunk
End Sub
Я подтвердил, что это копирует побайтный файл двоичного файла в столбец A моего PythonEXE
листа.
Моя проблема заключается в том, что при записи байтов обратно в файл записанный файл значительно отличается оторигинал.Я использую следующие функции для записи из рабочей таблицы в выходной файл:
Function WriteToFile(path, data)
Dim fileNo As Integer
fileNo = FreeFile
Open path For Binary Access Write As #fileNo
Put #fileNo, 1, data
Close #fileNo
End Function
Sub WriteCompiler_Click()
Dim TotalRows As Long
Dim bytes() As Byte
TotalRows = Worksheets("PythonEXE").Rows(Worksheets("PythonEXE").Rows.Count).End(xlUp).Row
ReDim bytes(TotalRows)
For i = 1 To TotalRows
bytes(i) = CByte(Worksheets("PythonEXE").Cells(i, 1).Value)
Next i
Dim path As String: path = ActiveWorkbook.path & "\python.exe.written"
WriteToFile path, bytes
End Sub
Почему мой выходной двоичный файл отличается от входного двоичного файла?Он не читается человеком, но их контрольные суммы различаются, и когда я открываю их обе в IDE, выходной файл выглядит так, как будто в начале он имеет кучу прямоугольных глифов, а входной файл - нет.