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

多谢大侠, 稍后我多测试一下,
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

回复 19# 5i365


    16楼 已修改.
微信:flashercs
QQ:49908356

TOP

回复 14# idwma

不好意思, 我最前面总结的规律是错的, 实际情况是上面19楼的描述
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

回复 18# flashercs

不好意思, 刚看到, 是我又大意了, 虽然眼看着是成绩在科目的右边, 实际中间却还有单元格, 感觉我的算法不灵了, 确实有难度了
   
我把要取的科目颜色设为了红色, 原本是黑色的,

现在唯一的规律就是: 成绩左边或右边的文本是固定的, 例如, 语文成绩的右边的文本肯定是物理: 但中间有没有合并单元格不好判断

https://t.wss.ink/f/9borrlf6ksr 复制链接到浏览器打开
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

回复 17# 5i365


    有没有个样本.xlsx ?网盘?
微信:flashercs
QQ:49908356

TOP

本帖最后由 5i365 于 2022-9-18 17:28 编辑

回复 16# flashercs

感谢大侠支招, 输出为空,
姓名和科目字段的文本右边有个:  把这个:删了也没有输出
但有一点可以肯定, 这几个文本都是唯一的,


$fields = @('姓名:', '语文:', '数学:', '社会:', '历史:')
$keyField = '姓名:'
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

本帖最后由 flashercs 于 2022-9-19 19:54 编辑
  1. Add-Type -LiteralPath .\EPPlus.dll -ErrorAction Stop
  2. $fields = @('姓名:', '语文:', '数学:', '社会:', '历史:')
  3. $keyField = '姓名:'
  4. $groupPso = Get-ChildItem -Path .\*.xlsx -Filter *.xlsx | Where-Object { -not $_.PSIsContainer } | ForEach-Object {
  5.   try {
  6.     $pack = New-Object OfficeOpenXml.ExcelPackage -ArgumentList $_.FullName
  7.     $pso = New-Object psobject
  8.     $a2d = $pack.Workbook.Worksheets[1].Cells.Value
  9.     for ($x = $a2d.GetLowerBound(0); $x -le $a2d.GetUpperBound(0); $x++) {
  10.       $propName = $null
  11.       for ($y = $a2d.GetLowerBound(1); $y -le $a2d.GetUpperBound(1); $y++) {
  12.         if ($null -eq $propName) {
  13.           if ($fields -contains $a2d[$x, $y]) {
  14.             $propName = $a2d[$x, $y]
  15.           }
  16.         } else {
  17.           if ($null -ne $a2d[$x, $y]) {
  18.             $pso | Add-Member -MemberType NoteProperty -Name $propName -Value $a2d[$x, $y]
  19.             $propName = $null
  20.           }
  21.         }
  22.       }
  23.     }
  24.     $pso
  25.   } finally {
  26.     if ($pack) {
  27.       $pack.Dispose()
  28.       $pack = $null
  29.     }
  30.   }
  31.   trap {}
  32. } | Group-Object -Property $keyField
  33. function Get-StudentScore {
  34.   param (
  35.     [string[]]$UserName
  36.   )
  37.   $groupPso | Where-Object { $null -eq $UserName -or $UserName -contains '*' -or $UserName -contains $_.Name } | ForEach-Object {
  38.     $pso = New-Object psobject -Property @{$keyField = $_.Name }
  39.     $_.Group | Measure-Object -Property ($fields -ne $keyField) -Sum | ForEach-Object {
  40.       $pso | Add-Member -MemberType NoteProperty -Name $_.Property -Value ([int]$_.Sum)
  41.     }
  42.     $pso
  43.   }
  44. }
  45. # main
  46. # search 佟玉
  47. # Get-StudentScore -UserName 佟玉 | Format-Table -AutoSize
  48. # search 张三,李四
  49. # Get-StudentScore -UserName 张三, 李四 | Format-Table -AutoSize
  50. # search 所有学生
  51. # Get-StudentScore -UserName * | Format-Table -AutoSize
  52. # search 所有学生
  53. # Get-StudentScore | Format-Table -AutoSize
  54. # 左对齐
  55. Get-StudentScore | Out-GridView -Title 学生成绩汇总 -Wait
  56. # 筛选姓名
  57. Get-StudentScore | Out-GridView -Title 学生成绩汇总_多选 -OutputMode Multiple | Out-GridView -Title 学生成绩汇总_已选择 -Wait
复制代码
微信:flashercs
QQ:49908356

TOP

回复 14# idwma

随机! 但都是名在左, 值在右
我用下面的代码, 找到了姓名的坐标, 看来有戏了! 其它逻辑的代码, 我还写不出来
________________________________________________________

Add-Type -Path ".\EPPlus.dll"

$ex = New-Object OfficeOpenXml.ExcelPackage(".\a.xlsx")

$ex.Workbook.Worksheets[1].Cells.where({ $_.value -like "姓名" }).Address
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

那找到张三的位置他的成绩相对位置是横坚斜还是随机的?

TOP

本帖最后由 5i365 于 2022-9-18 16:08 编辑

回复 10# idwma

在模块论坛找到了点查找替换的代码
大图链接:  i.ibb.co/MpSdHtC/err.png
网址: https://github.com/dfinke/ImportExcel/issues/565

   
  1. $xl = Open-ExcelPackage <<path>>
  2. $xl.<<sheet>>.Cells.where({$_.value -like "*find*"}).foreach({$_.value = $value -replace "find","Replace"})
  3. close-excelPackage $xl
复制代码


  1. #我必须使用以下格式来更改匹配单元格中的值:
  2. $xl.<<sheet>>.Cells.where({$_.value -like "*find*"}).foreach({$_.Value = "Replace"})
复制代码
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

本帖最后由 5i365 于 2022-9-18 15:50 编辑

回复 10# idwma
输入:
$in = "张三"
___________________________________________________

输出 上面指定的姓名的, 各科目的和, 就行了, 例如下面这样:
张三是在两个xlsx文件中, 其语文,在A文件中得分35 , 在B文件中得分45, 那就直接显示其和 80 就行了, 其它科目也一样


姓名, 语文, 数学, 社会, 历史
张三, 80, 70, 160, 160
___________________________________________________

此题最大的难点: 查找姓名和科目文本
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

本帖最后由 5i365 于 2022-9-18 15:38 编辑

回复 10# idwma

真遇到难题了,
__________________________________________________________________________________________________
难点1:

分数的所在的单元格不是固定的, 但是有个规律:
名字和分数都在 姓名和科目名的右边, 例如下面这样: 看来要先找到姓名和科目的文本, 取到它所在的单元格坐标, 然后再取到其右边一个单元格的值

姓名 | 张三

语文 | 86

数学 | 96

__________________________________________________________________________________________________

难点2:

学校的电脑里装的是WPS, 没有装excel , 不过, 我试了一下, 给wps装上VBA组件,  也可以用 com对象, 但是要给别的电脑上全装东西, 有点麻烦
所以目前看来用那个 epplus.dll 是最好了, 我试了一下, 取单元格的值, 就是用我上面的代码,
但是要查找文本, 不知道这个模块有没有查找文本函数, 这有点难度了, 不过那个模块里有很多示例文件
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

本帖最后由 idwma 于 2022-9-18 14:30 编辑

那要的结果是取值还是整理还是全都要
  1. #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
  2. $a=new-object -com excel.application
  3. $n='张三'
  4. $arr=('姓名','d5',''),('语文','g19',''),('数学','w20',''),('社会','p21',''),('历史','ag21','')
  5. dir *.xlsx|%{
  6.     $b=$a.workbooks.open($_.fullname)
  7.     $c=$b.sheets.item(1)
  8.     if($c.range($arr[0][1]).value() -eq $n){
  9.         $arr[1..$arr.count]|%{
  10.             [int]$_[2]+=$c.range($_[1]).value()
  11.         }
  12.     }
  13.     $b.close()
  14. }
  15. $a.quit()
  16. $arr|%{$_ -join ':'}
复制代码

TOP

本帖最后由 5i365 于 2022-9-18 12:34 编辑

回复 8# idwma


   没有规律的就是要按单元格坐标来取值+
把下面的值先整理规律后再处理也行
姓名的值 如果在 D5
语文的值 如果在 G19
数学的值 如果在 W20
社会的值 如果在 P21
历史的值 如果在 AG21
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

姓名和成绩在表格里斜着排是吗
还是说没有规律的就是要按单元格坐标来取值

TOP

返回列表