[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 11# terse


    另外批次文件插入怎么修改呀!现单文件可以修改;如果EXCEL 里面俩Sheet的话,怎么插入到第二个Sheet
是不是这个代码对XLS 文件不适用啊 怎么修改能兼容XLS文件的;如果去掉“”4)填充后B列空白位置填充为上一行数据 这个功能“”怎么修改啊

TOP

你这个是直接从PS里拿来的吧 变量改一下 多个Sheet就改这里是多少就改多少  $wb.Sheets.Item(2),文件不在同一个的话 就少一个文件 复制上一行数据的话 参照
....
$val = $dsr.Cells.Item($i, 1).Offset(-1, 0) 这里是上一行的值
$dsr.Cells.Item($i, 1).Value2 = $val.Value2 这里是赋值
....

TOP

回复 17# terse


    1)同文件夹下数十个文件 怎么能批量插入啊,2)XLS文件怎么不能执行呢

TOP

回复 18# haichuan5121
循环调用函数试试,xls文件问题也许是版本问题, 不知你那边为什么不行,环境不清楚,不好说

TOP

回复 19# terse
大神 再看下;下面的代码能完美实现多个文件的整理;但是需要提前将文件路径写到Files1和Files2里面,每行一个文件路径;
  怎么修改可以实现当前文件夹下直接提取需要执行的文件路径生成Files1,需要插入的文件就是,插入内容.xsls


    <# :
echo on
powershell -noprofile -NoLogo "iex (${%~f0} | out-string)"
pause
#>
function get-data([int]$startrow, [int]$startcol, [int]$endrow, [int]$endcol, [string]$pat, [string[]]$files1, [string[]]$files2) {
        foreach ($file2 in $files2) {
                $excel = New-Object -ComObject Excel.Application
                $excel.Visible = $false
                $wb = $excel.Workbooks.Open($file2)
                $ws = $wb.Sheets.Item(1)
                $sr = $ws.Range($ws.Cells.Item($startrow, $startcol), $ws.Cells.Item($endrow, $endcol))
                $sd = $sr.Value2
                foreach ($file1 in $files1) {
                        $dwb = $excel.Workbooks.Open($file1)
                        $dws = $dwb.Sheets.Item(2)
                        $fc = $dws.UsedRange.Find($pat)
                        if ($fc -ne $null) {
                                $rown = $fc.Row
                                for ($i = 0; $i -le $endrow-$startrow; $i++) {
                                        $dws.Rows.Item($rown + 1).EntireRow.Insert()
                                }
                                $dsr = $dws.Range($dws.Cells.Item($rown + 1, $startcol), $dws.Cells.Item($rown + 1 + ($endrow - $startrow), $endcol))
                                $dsr = $dsr.Resize($sr.Rows.Count, $sr.Columns.Count)
                                $dsr.Value2 = $sd
                                $sr.Copy()
                                $dsr.PasteSpecial(-4122)
                                for ($i = 1; $i -le $dsr.Rows.Count; $i++) {
                                        # $val = $dsr.Cells.Item($i, 1).Offset(-1, 0)
                                        # $dsr.Cells.Item($i, 1).Value2 = $val.Value2
                                }
for ($i = 1; $i -le $dsr.Rows.Count; $i++) {
                        $val = $dsr.Cells.Item($i, 4).Offset(-5, 0)
                        $dsr.Cells.Item($i, 4).Value2 = $val.Value2
                        }
                        $dwb.Close($true)
                }
}
                $excel.DisplayAlerts = $false
                $wb.Close($false)
                $excel.Quit()
                [Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
        }
}

$files1 = Get-Content "files1.txt"

$files2 = Get-Content "files2.txt"

get-data -startrow 1 -startcol 2 -endrow 4 -endcol 9 -pat 1004 -files1 $files1 -files2 $files2
get-data -startrow 6 -startcol 2 -endrow 8 -endcol 9 -pat 1011 -files1 $files1 -files2 $files2
get-data -startrow 10 -startcol 2 -endrow 11 -endcol 9 -pat 1013 -files1 $files1 -files2 $files2

TOP

本帖最后由 terse 于 2023-5-22 15:07 编辑

这样?
$file1 = @(file1,file2,file3)
$file2 = '.\插入内容.xlsx'

TOP

回复 21# terse

就是原先那个代码 多文件执行前需要把每个文件路径写到Files1文本内,插入的内容写到Files2里;

怎么实现,我不需要提前写Files1 他就可以自动读取列表执行,
    C:\Users\10000\Desktop\测试p1\元数据.xlsx
    C:\Users\10000\Desktop\测试p1\元数据-副本.xlsx
    C:\Users\10000\Desktop\测试p1\元数据-副本2.xlsx

TOP

回复 22# haichuan5121
不把文件路径写入文本,就把文件路径写入数组,然后传函数,这样吗,要不你就用Get-Content提取文件

TOP

本帖最后由 haichuan5121 于 2023-5-22 17:50 编辑

回复 21# terse
大哥 给看下 这个为啥执行了三遍插入啊 怎么修改啊?
<# :

echo on & setlocal EnableDelayedExpansion

for /f "delims=" %%i in ('"dir /a/s/b/on 元数据*.*"') do (

set file=%%~fi

set file=!file:/=/!

echo !file! >> files1.txt

)
powershell -noprofile -NoLogo "iex (${%~f0} | out-string)"
pause
#>
function get-data([int]$startrow, [int]$startcol, [int]$endrow, [int]$endcol, [string]$pat, [string[]]$files1, [string[]]$files2) {
        foreach ($file2 in $files2) {
                $excel = New-Object -ComObject Excel.Application
                $excel.Visible = $false
                $wb = $excel.Workbooks.Open($file2)
                $ws = $wb.Sheets.Item(1)
                $sr = $ws.Range($ws.Cells.Item($startrow, $startcol), $ws.Cells.Item($endrow, $endcol))
                $sd = $sr.Value2
                foreach ($file1 in $files1) {
                        $dwb = $excel.Workbooks.Open($file1)
                        $dws = $dwb.Sheets.Item(2)
                        $fc = $dws.UsedRange.Find($pat)
                        if ($fc -ne $null) {
                                $rown = $fc.Row
                                for ($i = 0; $i -le $endrow-$startrow; $i++) {
                                        $dws.Rows.Item($rown + 1).EntireRow.Insert()
                                }
                                $dsr = $dws.Range($dws.Cells.Item($rown + 1, $startcol), $dws.Cells.Item($rown + 1 + ($endrow - $startrow), $endcol))
                                $dsr = $dsr.Resize($sr.Rows.Count, $sr.Columns.Count)
                                $dsr.Value2 = $sd
                                $sr.Copy()
                                $dsr.PasteSpecial(-4122)
                                for ($i = 1; $i -le $dsr.Rows.Count; $i++) {
                                        # $val = $dsr.Cells.Item($i, 1).Offset(-1, 0)
                                        # $dsr.Cells.Item($i, 1).Value2 = $val.Value2
                                }
for ($i = 1; $i -le $dsr.Rows.Count; $i++) {
                        $val = $dsr.Cells.Item($i, 4).Offset(-5, 0)
                        $dsr.Cells.Item($i, 4).Value2 = $val.Value2
                        }
                        $dwb.Close($true)
                }
}
                $excel.DisplayAlerts = $false
                $wb.Close($false)
                $excel.Quit()
                [Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
        }
}

$files1 = Get-Content "files1.txt"

$files2 = Get-Content "files2.txt"

get-data -startrow 1 -startcol 2 -endrow 4 -endcol 9 -pat 1004 -files1 $files1 -files2 $files2
get-data -startrow 6 -startcol 2 -endrow 8 -endcol 9 -pat 1011 -files1 $files1 -files2 $files2
get-data -startrow 10 -startcol 2 -endrow 11 -endcol 9 -pat 1013 -files1 $files1 -files2 $files2

TOP

回复 23# terse
添加判断语句后,只执行一个文件其余的就不执行了,怎么修改。。。。


    <# :

echo on & setlocal EnableDelayedExpansion

for /f "delims=" %%i in ('"dir /a/s/b/on 元数据*.*"') do (

set file=%%~fi

set file=!file:/=/!

echo !file! >> files1.txt

)
powershell -noprofile -NoLogo "iex (${%~f0} | out-string)"
pause
#>
function get-data([int]$startrow, [int]$startcol, [int]$endrow, [int]$endcol, [string]$pat, [string[]]$files1, [string[]]$files2) {
        foreach ($file2 in $files2) {
    $excel = New-Object -ComObject Excel.Application
    $excel.Visible = $false
    $wb = $excel.Workbooks.Open($file2)
    $ws = $wb.Sheets.Item(1)
    $sr = $ws.Range($ws.Cells.Item($startrow, $startcol), $ws.Cells.Item($endrow, $endcol))
    $sd = $sr.Value2
    $found = $false
    foreach ($file1 in $files1) {
        $dwb = $excel.Workbooks.Open($file1)
        $dws = $dwb.Sheets.Item(2)
        $fc = $dws.UsedRange.Find($pat)
        if ($fc -ne $null) {
            $found = $true
            $rown = $fc.Row
            for ($i = 0; $i -le $endrow-$startrow; $i++) {
                $dws.Rows.Item($rown + 1).EntireRow.Insert()
            }
            $dsr = $dws.Range($dws.Cells.Item($rown + 1, $startcol), $dws.Cells.Item($rown + 1 + ($endrow - $startrow), $endcol))
            $dsr = $dsr.Resize($sr.Rows.Count, $sr.Columns.Count)
            $dsr.Value2 = $sd
            $sr.Copy()
            $dsr.PasteSpecial(-4122)
            for ($i = 1; $i -le $dsr.Rows.Count; $i++) {
                # $val = $dsr.Cells.Item($i, 1).Offset(-1, 0)
                # $dsr.Cells.Item($i, 1).Value2 = $val.Value2
            }
            for ($i = 1; $i -le $dsr.Rows.Count; $i++) {
                $val = $dsr.Cells.Item($i, 4).Offset(-5, 0)
                $dsr.Cells.Item($i, 4).Value2 = $val.Value2
            }
            $dwb.Close($true)
            break
        }
    }
    if (!$found) {
        Write-Host "Pattern $pat not found in any file."
    }
    $excel.DisplayAlerts = $false
    $wb.Close($false)
    $excel.Quit()
    [Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null

        }
}

$files1 = Get-Content "files1.txt"

$files2 = Get-Content "files2.txt"

get-data -startrow 1 -startcol 2 -endrow 4 -endcol 9 -pat 1004 -files1 $files1 -files2 $files2
get-data -startrow 6 -startcol 2 -endrow 8 -endcol 9 -pat 1011 -files1 $files1 -files2 $files2
get-data -startrow 10 -startcol 2 -endrow 11 -endcol 9 -pat 1013 -files1 $files1 -files2 $files2

TOP

回复 25# haichuan5121
这样行不
  1.     if (!$found) {
  2.         Write-Host "Pattern $pat not found in any file."
  3.         $excel.DisplayAlerts = $false
  4.         $wb.Close($false)
  5.         $excel.Quit()
  6.         [Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
  7.         return
  8.     }
复制代码

TOP

本帖最后由 haichuan5121 于 2023-5-22 19:11 编辑

回复 26# terse


    效果一样的呢;还是只插入一个excel后面的就不执行了;三遍插入的原因是在 PowerShell 脚本中使用了两个嵌套的 foreach 循环,这样会导致对每个文件都进行一次插入操作。如果需要对每个文件进行一次插入操作,可以将 foreach 循环改为 if 判断这个怎么修改

TOP

回复 27# haichuan5121

晕了,以为你就只要操作一次文件插入,先说说加的$found意图是什么

TOP

没有搜索到关键词 就不执行下面的
  1. if (!$found) {
  2.     Write-Host "Pattern $pat not found in any file."
  3. } else {
  4.     $excel.DisplayAlerts = $false
  5.     $wb.Close($false)
  6.     $excel.Quit()
  7.     [Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
  8. }
复制代码

TOP

回复 29# terse


    不好意思 24楼执行是对的;插入三遍是因为Files1文件没有清空,里面有三遍路径导致的;

TOP

返回列表