【问题标题】:CSV to Named Sheets within existing WorkbookCSV 到现有工作簿中的命名工作表
【发布时间】: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


【解决方案1】:

使用 Excel COM 接口逐个填充目标单元格非常慢。使用 Range.Copy 和 Sheet.Paste 更快:

    step 1: "ExcelApp.Workbooks.OpenText" to open data.csv file 
    step 2: "ExcelApp.Windows("data").ActiveSheet" to target the data sheet just opened
    step 3: "ActiveSheet.Range" to target the data area
    step 4: "Range.Copy" to copy the source data to the clipboard 
    step 5: "Sheet.Paste" to move the data to the destination

C++ 版本示例代码(假设我们已经有了“pSheetCsvDest”,这是我们的 .csv 数据目标表):

//import Excel library
//....

//declaration
Excel::_ApplicationPtr pAppExcel;
Excel::_WorksheetPtr pSheetCsvSource;
Excel::RangePtr pRangeCsvSource;

//initialze excel app and open the source csv file
HRESULT hApp = pAppExcel.CreateInstance(__uuidof(Excel::Application));
pAppExcel->Workbooks->OpenText(_bstr_t("data.csv"), 936, 1, xlDelimited, xlTextQualifierDoubleQuote,    vtMissing, vtMissing, vtMissing, VARIANT_TRUE, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing);

//target the data range
pSheetCsvSource= pAppExcel->Windows->GetItem(_bstr_t("data"))->ActiveSheet;
pRangeCsvSource= pSheetCsvSource->GetRange(_variant_t("Cell1:Cell2"));

//copy the source data
pRangeCsvSource->Copy();

//paste to destination sheet
pSheetCsvDest->Paste();

//close csv source child window
pAppExcel->Windows->GetItem(_bstr_t("data"))->Close();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 2019-10-10
    • 1970-01-01
    相关资源
    最近更新 更多