PDA

Показать полную графическую версию : [решено] Копирование диапазона ячеек из одной таблицы Excel в другую


avolkov2009
25-03-2024, 12:04
Здравствуйте.
Появилась необходимость автоматизировать 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
avolkov2009,
СкрипачExcel не нужен, родной :)
В том смысле, что есть модуль, который работает с документами Excel, без него...
Установите его:
install-module ImportExcel
попробуйте изучить... если не получится, задавайте вопросы - поможем.

Serguei Kouzmine
25-03-2024, 16:38
СкрипачExcel не нужен, родной »
кузнец ?

DJ Mogarych
25-03-2024, 16:48
Кстати, ImportExcel не работает с .xls, только с .xlsx.

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

avolkov2009
25-03-2024, 16:59
Отдельное спасибо за 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
кузнец ? »
это из другой оперы...

Кстати, ImportExcel не работает с .xls, только с .xlsx. »
http://forum.oszone.net/post-2961635.html#post2961635
;)

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

В данной задаче не поможет »
Почему?

Serguei Kouzmine
25-03-2024, 21:48
$range1 = "A7:CY1006",
$range2 = "A7",
$range3 = "CZ7:CZ1006",
$range4 = "DA7",
$range5 = "CZ7", »

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

DJ Mogarych
26-03-2024, 16:04
YuS_2, ну да, для меня-то проблемы нет, я давно уже переделал все старые форматы. Новый формат ещё и компактнее.
Вопрос, все ли готовы так делать и какие там подводные камни и обстоятельства у автора.




© OSzone.net 2001-2012