Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Копирование диапазона ячеек из одной таблицы Excel в другую (http://forum.oszone.net/showthread.php?t=355077)

avolkov2009 25-03-2024 12:04 3025732

Копирование диапазона ячеек из одной таблицы Excel в другую
 
Здравствуйте.
Появилась необходимость автоматизировать SUBJ.

Исходные данные:
Таблица-источник - "table1.xls"
Таблица-приёмник - "table2.xls"
Название листа (одинаково для обеих таблиц) - "Товарная база"
Диапазон для копирования - "A7:CY1006"
Место вставки - "A7"

Написал следующий скрипт:
Код:

Param(
        $path1 = "table1.xls",
        $path2 = "table2.xls",
        $worksheet1 = "Товарная база",
        $worksheet2 = "Товарная база",
        $range1 = "A7:CY1006",
        $range2 = "A7"
)

$Excel = New-Object -ComObject excel. Application
$Excel.visible = $false
$Workbook = $excel.Workbooks.open($path1)
$Worksheet = $Workbook.WorkSheets.item($worksheet1)
$worksheet.Activate()
$range = $WorkSheet.Range($range1).EntireColumn
$range.Copy() | Out-Null
$Workbook = $excel.Workbooks.open($path2)
$Worksheet = $Workbook.Worksheets.item($worksheet2)
$worksheet.Activate()
$Worksheet.Range($range2).Activate()
$Worksheet.Paste()
$workbook.Save()
$Excel.Quit()
Remove-Variable -Name excel
[gc]::collect()
[gc]::WaitForPendingFinalizers()

На строчке "$Worksheet.Paste()" появляется ошибка:
Цитата:

Не удается вставить данные, так как размер копируемой области копирования не соответствует размеру области вставки. Выберите только одну ячейку в области вставки или выделите в ней диапазон того же размера, что и вставляемая область, и повторите попытку.
Пробовал в таблице-приёмнике выбирать такой же диапазон ("A7:CY1006"), всё равно ошибка.
Подскажите, что я сделал не правильно?

YuS_2 25-03-2024 16:20 3025746

avolkov2009,
СкрипачExcel не нужен, родной :)
В том смысле, что есть модуль, который работает с документами Excel, без него...
Установите его:
Код:

install-module ImportExcel
попробуйте изучить... если не получится, задавайте вопросы - поможем.

Serguei Kouzmine 25-03-2024 16:38 3025748

Цитата:

Цитата YuS_2
СкрипачExcel не нужен, родной »

кузнец ?

DJ Mogarych 25-03-2024 16:48 3025750

Кстати, ImportExcel не работает с .xls, только с .xlsx.

Что касается задачи - неплохо бы иметь сам файл, хотя бы что-то похожее, т. к. требовать от советчиков рисовать ещё и файл - это немного чересчур.
Непонятно ведь, что там за диапазон такой и т. д.

avolkov2009 25-03-2024 16:59 3025754

Отдельное спасибо за ImportExcel. В данной задаче не поможет, но есть масса других сфер применения.
Задачу решил. Мало ли кому пригодится, поэтому выкладываю решение.
Код:

Param(
        $path1 = "Путь_к_файлу_из_которого_копируем.xls",
        $path2 = "Путь_к_шаблонному_файлу.xlsx",
        $path3 = "Путь_к_результирующему_файлу.xlsx",
        $worksheet1 =  "Товарная база",
        $worksheet2 =  "Товарная база",
        $range1 = "A7:CY1006",
        $range2 = "A7",
        $range3 = "CZ7:CZ1006",
        $range4 = "DA7",
        $range5 = "CZ7",
        $country = "Беларусь [112]"
)
Copy-Item $path2 $path3
$excel = New-Object -ComObject Excel.Application
$workbookSource = $excel.Workbooks.Open($path1)
$rangeToCopy = $workbookSource.Worksheets[$worksheet1].Range($range1)
$workbookTarget = $excel.Workbooks.Open($path3)
$targetSheet = $workbookTarget.Worksheets[$worksheet2]
$rangeToCopy.Copy($targetSheet.Range($range2))
$rangeToCopy = $workbookSource.Worksheets[$worksheet1].Range($range3)
$rangeToCopy.Copy($targetSheet.Range($range4))
$rangeToFill = $targetSheet.Range($range5)
$rangeToFill.Value = $country
$workbookTarget.Save()
$workbookSource.Close()
$workbookTarget.Close()
$excel.Quit()

Единственное, что не осилил, $range5 указывает на начало столбца, куда нужно записать значение $country. Записываю только в первую ячейку, чтобы потом вручную заполнить весь столбец.
Понимаю, что решение - "костыль", но это гораздо лучше, чем вручную копипастить такое количество строк и столбцов.

YuS_2 25-03-2024 17:24 3025756

Цитата:

Цитата Serguei Kouzmine
кузнец ? »

это из другой оперы...

Цитата:

Цитата DJ Mogarych
Кстати, ImportExcel не работает с .xls, только с .xlsx. »

http://forum.oszone.net/post-2961635.html#post2961635
;)

YuS_2 25-03-2024 19:03 3025760

и да, в составе ImportExcel есть командлет ConvertTo-ExcelXlsx, правда наличие Excel тогда необходимо, ибо он работает через -ComObject

Цитата:

Цитата avolkov2009
В данной задаче не поможет »

Почему?

Serguei Kouzmine 25-03-2024 21:48 3025764

Цитата:

Цитата avolkov2009
$range1 = "A7:CY1006",
$range2 = "A7",
$range3 = "CZ7:CZ1006",
$range4 = "DA7",
$range5 = "CZ7", »

переименуйте переменные как начало конец выделения верх низ право лево чтоб стало все ясно вообще всем

DJ Mogarych 26-03-2024 16:04 3025774

YuS_2, ну да, для меня-то проблемы нет, я давно уже переделал все старые форматы. Новый формат ещё и компактнее.
Вопрос, все ли готовы так делать и какие там подводные камни и обстоятельства у автора.


Время: 08:27.

Время: 08:27.
© OSzone.net 2001-