【发布时间】:2016-07-28 21:33:36
【问题描述】:
所以我已经有一段时间了,我有各种方法(一些 VBA,另一些 PowerShell)按说可以半工作......
快速概述我要完成的工作是将两个 CSV 每周(删除旧数据,标题始终保持不变,但两张工作表之间不同)导入同一工作簿中的两个特定 Excel 工作表(例如 sheet1, sheet2,计算表),它有另一个表,然后计算数据。最后我想把它导出为PDF。
完整说明:
每周一都会以 .CSV 格式导出两个查询,例如 C:\Users\Me\Desktop\Data1.CSV & C:\Users\Me\Desktop\Data2.CSV
然后我希望将 CSV 的数据输入到工作簿 C:\Users\Me\Desktop\Calculation.xlsx 中各自的工作表(Data1、Data2)中
Data1 如下所示:
COUNT STATUS OPERATOR PRODUCT WEEK
1 CANCEL BOB Product 1 10
65 CLEAR JIM Product 2 10
20 SEND BOB Product 1 10
58 CC KRIS Product 4 10
3 CLEAR BOB Product 1 10
11 SEND SMIT Product 6 10
6 CANCEL JASON Product 7 10
Data2 如下所示:
OPERATOR CLEARS SENDS TOTAL CR WEEK
BOB 11 1 12 0.916667 10
JIM 17 2 19 0.894737 10
KRIS 9 1 10 0.9 10
SMITH 22 5 27 0.814815 10
JASON 25 7 32 0.78125 10
然后,计算表将识别数据并进行相应处理,然后导出为 PDF。下周一,Windows 计时器服务调用一个 .bat 文件,然后该文件运行此脚本(VBA 或 PowerShell),该脚本会删除此工作簿中前几周的数据并输入来自查询的新数据。
我非常开放,因为我对 PowerShell 和 VBA 有基本的了解和了解。我没有包含我目前拥有的代码,因为我已经将它屠宰了它以尝试让它在我的需求范围内工作,因为我已经混合了各种研究如何做到这一点的方法。
希望我已经提供了足够的信息,以便有人可以为我指明正确的方向……
谢谢
编辑
根据 Chris,这是我一直在尝试使用的一些代码,当我尝试根据自己的需要修改它而不是最初的用途时,它可能非常令人困惑:
Get-service bits | Select-Object COUNT, STATUS, OPERATOR, PRODUCT, WEEK | Export-Csv 'C:\Users\Me\Desktop\Data1.csv' -NoTypeInformation
Get-service bits | Select-Object COUNT, STATUS, OPERATOR, PRODUCT, WEEK | Export-Excel 'C:\Users\Me\Desktop\Calculations.xlsx'
$Results = @()
Import-Excel -Path 'C:\Users\Me\Desktop\Calculations.xlsx' | foreach {
$Properties = @{
COUNT = $PSItem.COUNT
STATUS = $PSItem.STATUS
OPERATOR = $PSItem.OPERATOR
PRODUCT = $PSItem.PRODUCT
WEEK = $PSItem.WEEK
}
$Results += New-Object -TypeName psobject -Property $Properties
}
Import-Csv -Path 'C:\Users\Me\Desktop\Data1.csv' | foreach {
$Properties = @{
COUNT = $PSItem.COUNT
STATUS = $PSItem.STATUS
OPERATOR = $PSItem.OPERATOR
PRODUCT = $PSItem.PRODUCT
WEEK = $PSItem.WEEK
}
$Results += New-Object -TypeName psobject -Property $Properties
}
$Results | Export-Excel -Path 'C:\Users\Me\Desktop\Calculations.xlsx'
我尝试的另一个例子:
$Excel = New-Object -ComObject Excel.Application
$XLSFile = 'C:\Users\me\Desktop\Calculations.xlxs'
$csvFile = 'C:\Users\me\Desktop\Data\Data1.csv'
$Excel.Visible = $true
$ExcelWorkBook = $Excel.Workbooks.Open($XLSFile)
$ExcelWorkSheet = $ExcelWorkBook.sheets.item('Data')
$ExcelWorkSheet.Activate()
# Go to the first empty row
$LastRow = $ExcelWorkSheet.UsedRange.rows.count + 1
Import-Csv -Path $csvFile | ForEach {
$ExcelWorkSheet.cells.Item($lastRow,1) = $psitem.COUNT
$ExcelWorkSheet.cells.Item($lastRow,2) = $psitem.STATUS
$ExcelWorkSheet.cells.Item($lastRow,3) = $psitem.OPERATOR
$ExcelWorkSheet.cells.Item($lastRow,4) = $psitem.PRODUCT
$ExcelWorkSheet.cells.Item($lastRow,5) = $psitem.WEEK
$LastRow = $LastRow + 1
}
$ExcelWorkBook.Save()
$ExcelWorkBook.Close()
$Excel.Quit()
$path = "C:\Users\me\Desktop\"
$xlFixedFormat = “Microsoft.Office.Interop.Excel.xlFixedFormatType” -as [type]
$excelFiles = Get-ChildItem -Path $path -include *.xls, *.xlsx -recurse
$objExcel = New-Object -ComObject excel.application
$objExcel.visible = $false
foreach($wb in $excelFiles)
{
$filepath = Join-Path -Path $path -ChildPath ($wb.BaseName + " Weekending " +(Get-Date).AddDays(-1).ToString('MMM-dd-yyyy') + “.pdf”)
$workbook = $objExcel.workbooks.open($wb.fullname, 3)
$workbook.Saved = $true
“saving $filepath”
$workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, $filepath, 1, 2)
$objExcel.Workbooks.close()
}
$objExcel.Quit()
最后一个例子
$Excel = New-Object -ComObject Excel.Application
$XLSFile = 'C:\Users\me\Desktop\Calculations.xlsx'
$csvFile = 'C:\Users\me\Desktop\Data1.csv'
$Excel.Visible = $true
$ExcelWorkBook = $Excel.Workbooks.Open($XLSFile)
$ExcelWorkBook.worksheets.item("Data1").Delete()
# Create a new worksheet
$ExcelWorkSheet = $ExcelWorkBook.Worksheets.Add()
# Set the name for the worksheet
$ExcelWorkSheet.Name = "Data1"
$ExcelWorkSheet = $ExcelWorkBook.sheets.item('Data1')
$ExcelWorkSheet.Activate()
# Go to the first empty row
Import-Csv -Path $csvFile | ForEach {
$ExcelWorkSheet.cells.Item($lastRow,1) = $psitem.COUNT
$ExcelWorkSheet.cells.Item($lastRow,2) = $psitem.STATUS
$ExcelWorkSheet.cells.Item($lastRow,3) = $psitem.OPERATOR
$ExcelWorkSheet.cells.Item($lastRow,4) = $psitem.PRODUCT
$ExcelWorkSheet.cells.Item($lastRow,5) = $psitem.WEEK
$LastRow = $LastRow + 1
}
$ExcelWorkBook.Save()
$ExcelWorkBook.Close()
$Excel.Quit()
【问题讨论】:
-
到目前为止你写了什么?例子?您需要帮助的代码?如果您要求某人为您编写整个脚本,那么这里不是问的地方。
-
嗨,克里斯,正如我所说,我没有包含它,因为它试图修改我找到的 sn-ps 并使其满足我的需要,我相信它会很混乱.但我会根据你的建议添加它。
-
好的,第一个脚本使用 Import/Export-Excel,它们不是本机 powershell cmdlet。这些是通过第三方模块导入的,您可能有也可能没有。我看到您的第二个脚本有一些不同的问题,似乎您为第三个脚本拼凑了大部分内容,除了您尝试操作 CSV 数据的方式之外,这似乎还可以。尝试将您的问题缩小到您当前正在处理的内容、遇到的错误,并指定您要修复或理解的内容。诸如“帮我解决它”“我如何使这项工作”之类的笼统问题同样没有帮助。
-
我发现的最大问题是我找不到任何关于将 .csv 中的数据粘贴到现有工作表中的信息,我一直在寻找的只是如何将数据粘贴到现有工作簿中的新工作表。
-
有一个解决方案涉及将 csv 数据反序列化为自定义对象哈希表,然后对您想要的每个单元格进行单独写入,但请相信我,ComObject 模型和这样做的使用非常非常缓慢。我强烈建议您查看同时为两个 CSV 创建/生成数据的过程,而不是写一个,复制过来。
标签: vba excel csv powershell