Kibor |
Отправлено: 14 Февраля, 2021 - 14:34:14
|


Эксперт

Покинул форум
Сообщений всего: 8268
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357

|
Скрипт для PowerShell создает и записывает в .xlsx файл.
Необходим установленный на компьютере Excel
CODE:$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $false
$WorkBook = $Excel.Workbooks.Add()
$LogiclDisk =$WorkBook.Worksheets.Item(1)
$LogiclDisk.Name = 'Логические диски'
$LogiclDisk.Cells.Item(1,1) = 'Буква диска'
$WorkBook.SaveAs('C:\Bot\1\Report.xlsx')
$Excel.Quit()
[Runtime.Interopservices.Marshal]::ReleaseComObject($Excel) | Out-Null;
Remove-Variable WorkBook, LogiclDisk, Excel;
[GC]::Collect();
echo 1
Скрипт для Кибор запуска PowerShell в фоновом режиме и выполнение данного скрипта. PowerShell запускается с Кибор через createpipeprocess
Первый пример:
При наличие русских символов в команде, необходимо строку обработать функцией w1251tod866 для конвертирования их в dos 866
CODE:_sendpipe(w1251tod866("$LogiclDisk.Cells.Item(1,1) = ^'Название^'"));//Надо
_sendpipe("$LogiclDisk.Cells.Item(1,1) = ^'Name^'");//Не надо
CODE:if (createpipeprocess("powershell.exe -NoLogo")))
{
_sendpipe("Set-ExecutionPolicy Unrestricted -Force");
_sendpipe("$Excel = New-Object -ComObject Excel.Application");
_sendpipe("$Excel.Visible = $True"); // если false окно не будет отображаться
_sendpipe("$WorkBook = $Excel.Workbooks.Add()");
_sendpipe("$LogiclDisk = $WorkBook.Worksheets.Item(1)");
_sendpipe("$LogiclDisk.Name = ^'Local Disk^'");
_sendpipe("$LogiclDisk.Cells.Item(1,1) = ^'Text^'");
_sendpipe("$Excel.DisplayAlerts=$False");
_sendpipe("$WorkBook.SaveAs(^'D:\MyExcel.xlsx^')");
_sendpipe("$WorkBook.Close()");
_sendpipe("$Excel.Quit()");
closepipeprocess();
}
function _sendpipe(string command)
{
string S;
sendpipe(command+"^n");
waitpipe();
getpipe(#S);
}
Второй пример (если не работает первый):
w1251tod866 использовать не надо.
CODE:string A="$Excel = New-Object -ComObject Excel.Application;$Excel.Visible = $false;$WorkBook = $Excel.Workbooks.Add();$LogiclDisk =$WorkBook.Worksheets.Item(1);$LogiclDisk.Name = ^'Логические диски^';$LogiclDisk.Cells.Item(1,1) = ^'Буква диска^';$WorkBook.SaveAs(^'C:\Bot\1\Report.xlsx^');$Excel.Quit();[Runtime.Interopservices.Marshal]::ReleaseComObject($Excel) | Out-Null;Remove-Variable WorkBook, LogiclDisk, Excel;[GC]::Collect();echo 1;";
if (createpipeprocess("powershell.exe -Command ^""+A+"^""))
{
waitpipe();
closepipeprocess();
} |
|
|
konctantin777 |
Отправлено: 05 Января, 2025 - 15:28:24
|


Эксперт

Покинул форум
Сообщений всего: 1220
Дата рег-ции: Окт. 2017
Откуда: Архангельск
Репутация: 7

|
Kibor пишет: function _sendpipe(string command)
{
string S;
sendpipe(command+"^n");
waitpipe();
getpipe(#S);
}
Подскажите разделение,чтобы писать в разные клетки? И можно ли считать именно с .xlsx...
(Убрана галка разрешать смайлики- в предварительном просмотре, всё равно их показывает)(Отредактировано автором: 05 Января, 2025 - 15:29:04) |
|
|
Zireael |
Отправлено: 05 Января, 2025 - 18:22:20
|


Эксперт

Покинул форум
Сообщений всего: 4552
Дата рег-ции: Нояб. 2017
Репутация: 590

|
Цитата: Подскажите разделение,чтобы писать в разные клетки?
Файл "D:\Report.xlsx" должен существовать.
Для корректной работы нужен powershell 5.1 или выше (не актуально для Win10, Win11, в них уже всё установлено).
Если нужно записывать данные во большое количество ячеек, то можно подправить скрипт чтобы не открывать Excel при каждой записи.
CODE:WriteToExcel("D:\Report.xlsx", "Текст 123", "A", 1); // записать строку в ячейку A1
WriteToExcel("D:\Report.xlsx", "Text 456", "D", 3); // записать строку в ячейку D3
WriteToExcel("D:\Report.xlsx", "Qverty йцукен", "F", 2); // записать строку в ячейку F2
int x = 1234567;
WriteToExcel("D:\Report.xlsx", format(x), "A", 2); // записать строку в ячейку A2
function WriteToExcel(string PathToExcel, string Text, string Column, int Row)
{
string S, RN = "^n";
string Command = "$Excel = New-Object -ComObject Excel.Application"+RN+
"$Excel.Visible = $false"+RN+
"$Excel.DisplayAlerts=$False"+RN+
"$WorkBook = $Excel.Workbooks.Open(^"" + PathToExcel + "^")"+RN+
"$Worksheets = $WorkBook.Worksheets.Item(1)"+RN+
"$Worksheets.Cells.Item(" + format(Row) +",^'"+ Column + "^') = ^"" + w1251tod866(Text) +"^""+RN+
"$WorkBook.Save()"+RN+
"$Excel.Quit()"+RN+
"[Runtime.Interopservices.Marshal]::ReleaseComObject($Excel)|Out-Null"+RN+
"Remove-Variable Worksheets, WorkBook, Excel"+RN+
"[GC]::Collect()"+RN+
"EndScript";
// messagebox(Command);
if (createpipeprocess("powershell.exe -NoLogo -NoExit")))
{
sendpipe(Command);
waitpipe();
looptime(5000)
{
if(getpipe(#S) > 0)
{
if(regexsearch(1, #S, S, "EndScript")) return 1;
}
sleep(100);
}
closepipeprocess();
}
return 0;
} |
|
|
Zireael |
Отправлено: 05 Января, 2025 - 20:33:58
|


Эксперт

Покинул форум
Сообщений всего: 4552
Дата рег-ции: Нояб. 2017
Репутация: 590

|
Записать массив в таблицу Excel:
CODE:// данные и формат ячейки разделяются ;
// 123;A1 - означает записать 123 в ячейку A1
string Array[99]; // массив с данными
// заполнить массив
Array[0] = "Текст123;A1"; // эта строка запишется в ячейку A1
Array[1] = "Text 456;D3"; // эта строка запишется в ячейку D3
string s = "Qwerty йцукен";
Array[2] = s + ";F2"; // эта строка запишется в ячейку F2
int x = 1234567;
Array[3] = format(x) + ";A2"; // эта строка запишется в ячейку A2
// файл D:\Report.xlsx должен существовать
WriteToExcel("D:\Report.xlsx", #Array[0], 4); // записать в таблицу массив, 4 элемента
function WriteToExcel(string PathToExcel, string #Data, int Count)
{
string S, Text, Column, Row, Cells, RN = "^n";
for(int i=0; i < Count; i++)
{
if(regexsearch(1, #Text, Data[i], ".+(?=;)")==0) continue;
if(regexsearch(1, #Column, Data[i], "(?<=;)[A-Z]+")==0) continue;
if(regexsearch(1, #Row, Data[i], "\d+", RIGHTTOLEFT)==0) continue;
Cells = Cells + "$Worksheets.Cells.Item(" + Row +",^'"+ Column + "^') = ^"" + w1251tod866(Text) +"^""+RN;
}
string Command = "$Excel = New-Object -ComObject Excel.Application"+RN+
"$Excel.Visible = $false"+RN+
"$Excel.DisplayAlerts=$False"+RN+
"$WorkBook = $Excel.Workbooks.Open(^"" + PathToExcel + "^")"+RN+
"$Worksheets = $WorkBook.Worksheets.Item(1)"+RN+
Cells+
"$WorkBook.Save()"+RN+
"$Excel.Quit()"+RN+
"[Runtime.Interopservices.Marshal]::ReleaseComObject($Excel)|Out-Null"+RN+
"Remove-Variable Worksheets, WorkBook, Excel"+RN+
"[GC]::Collect()"+RN+
"EndScript";
// messagebox(Command);
if (createpipeprocess("powershell.exe -NoLogo -NoExit")))
{
sendpipe(Command);
waitpipe();
looptime(5000)
{
if(getpipe(#S) > 0)
{
if(regexsearch(1, #S, S, "EndScript")) return 1;
}
sleep(100);
}
closepipeprocess();
}
return 0;
} |
|
|
Zireael |
Отправлено: 05 Января, 2025 - 22:06:31
|


Эксперт

Покинул форум
Сообщений всего: 4552
Дата рег-ции: Нояб. 2017
Репутация: 590

|
Цитата: А можно ли считать именно с .xlsx ?
Можно, код Powershell:
CODE:cls
$Excel = New-Object -ComObject Excel.Application
$WorkBook = $Excel.workbooks.Open('D:\Report.xlsx')
$Sheet = $workbook.Sheets.Item(1)
$CellValue = $sheet.Cells.Item(2, 'A').Value2 # получить значение ячейки A2
$Excel.Quit()
[Runtime.Interopservices.Marshal]::ReleaseComObject($Excel)|Out-Null
Remove-Variable Sheet, WorkBook , Excel
[GC]::Collect()
$CellValue # вывести значение в консоль |
|
|
Zireael |
Отправлено: 06 Января, 2025 - 11:53:16
|


Эксперт

Покинул форум
Сообщений всего: 4552
Дата рег-ции: Нояб. 2017
Репутация: 590

|
Чтение таблицы Excel.
Файл с таблицей должен существовать.
Ячейки для чтения разделяются ;
Результат возвращается в виде json.
CODE:string range = "A1;A2;D4"; // ячейки для чтения
string Result = ReadExcel("D:\Report.xlsx", range); // прочитать таблицу
messagebox(Result); // результат в виде json
if(Result != "")
{
parserjson(Rez_Json, Result);
messagebox(Rez_Json.A1); // значение ячейки A1
messagebox(Rez_Json.A2); // значение ячейки A2
}
function ReadExcel(string PathToExcel, string Range)
{
string S, Cell[9999], Column, Row, Cells, Result, Tmp, RN = "^n";
int Count = regexsearch(9999, #Cell[0], Range, "[A-Z\d]+");
if (Count > 0)
{
for(int i = 0; i < Count; i++)
{
if(regexsearch(1, #Column, Cell[i], "[A-Z]+")==0) continue;
if(regexsearch(1, #Row, Cell[i], "\d+", RIGHTTOLEFT)==0) continue;
Cells = Cells + "$CellValue.Add(^'" + Cell[i] + "^', $sheet.Cells.Item(" + Row + ", ^'" + Column + "^').Value2)" + RN;
}
string Command = "$Excel = New-Object -ComObject Excel.Application"+RN+
"$WorkBook = $Excel.Workbooks.Open(^"" + PathToExcel + "^")"+RN+
"$Sheet = $WorkBook.Sheets.Item(1)"+RN+
"$CellValue = @{}"+RN+
Cells+
"$Excel.Quit()"+RN+
"[Runtime.Interopservices.Marshal]::ReleaseComObject($Excel)|Out-Null"+RN+
"Remove-Variable Sheet, WorkBook, Excel"+RN+
"[GC]::Collect()"+RN+
"$CellValue|ConvertTo-Json"+RN+
"write EndScript";
//messagebox(Command);
if (createpipeprocess("powershell.exe -NoLogo -NoExit")))
{
sendpipe(Command);
waitpipe();
looptime(5000)
{
if(getpipe(#S) > 0)
{
Result = Result + S;
if(regexsearch(1, #Tmp, Result, "EndScript"))
{
if(regexsearch(1, #Tmp, d866tow1251(Result), "^\{.+\}", MULTILINE | SINGLELINE)) return Tmp;
}
}
sleep(100);
}
closepipeprocess();
}
}
return "";
} |
|
|
|