Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Копирование диапазона ячеек из одной таблицы Excel в другую

Ответить
Настройки темы
PowerShell - [решено] Копирование диапазона ячеек из одной таблицы Excel в другую

Пользователь


Сообщения: 144
Благодарности: 16

Профиль | Отправить PM | Цитировать


Здравствуйте.
Появилась необходимость автоматизировать 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"), всё равно ошибка.
Подскажите, что я сделал не правильно?

Отправлено: 12:04, 25-03-2024

 

Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


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

-------
scio me nihil scire. Ѫ


Отправлено: 16:20, 25-03-2024 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 247
Благодарности: 49

Профиль | Отправить PM | Цитировать


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

Отправлено: 16:38, 25-03-2024 | #3


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6494
Благодарности: 1465

Профиль | Отправить PM | Цитировать


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

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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 16:48, 25-03-2024 | #4


Пользователь


Сообщения: 144
Благодарности: 16

Профиль | Отправить PM | Цитировать


Отдельное спасибо за 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. Записываю только в первую ячейку, чтобы потом вручную заполнить весь столбец.
Понимаю, что решение - "костыль", но это гораздо лучше, чем вручную копипастить такое количество строк и столбцов.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:59, 25-03-2024 | #5


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата Serguei Kouzmine:
кузнец ? »
это из другой оперы...

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

-------
scio me nihil scire. Ѫ


Отправлено: 17:24, 25-03-2024 | #6


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


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

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

-------
scio me nihil scire. Ѫ


Отправлено: 19:03, 25-03-2024 | #7


Старожил


Сообщения: 247
Благодарности: 49

Профиль | Отправить PM | Цитировать


Цитата avolkov2009:
$range1 = "A7:CY1006",
$range2 = "A7",
$range3 = "CZ7:CZ1006",
$range4 = "DA7",
$range5 = "CZ7", »
переименуйте переменные как начало конец выделения верх низ право лево чтоб стало все ясно вообще всем

Отправлено: 21:48, 25-03-2024 | #8


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6494
Благодарности: 1465

Профиль | Отправить PM | Цитировать


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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 16:04, 26-03-2024 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Копирование диапазона ячеек из одной таблицы Excel в другую

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Копирование файла из одной папки в другую в определенные интервалы времени (bat) pinguindell Скриптовые языки администрирования Windows 16 11-08-2019 22:03
2010 - Экспорт данных из одной книги excel в другую Tyamich Microsoft Office (Word, Excel, Outlook и т.д.) 5 27-10-2016 16:31
Автоматическое копирование файлов из одной папки в другую. another_user Хочу все знать 4 25-09-2015 12:50
Любой язык - Копирование таблицы (2 столбца) из файла .htm в Excel Serg2010 Скриптовые языки администрирования Windows 2 05-08-2015 22:18
Разное - как на vba написать печать выделенного диапазона ячеек excel? Ingolder Microsoft Office (Word, Excel, Outlook и т.д.) 1 13-10-2010 00:51




 
Переход