当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何在 PowerShell 中导入 Excel

作者:精品下载站 日期:2024-12-14 03:45:44 浏览:15 分类:玩电脑

如何在 PowerShell 中导入 Excel


使用 PowerShell 时,我们可以使用 Excel 文件将数据导入系统或将其用作用户的参考列表,例如更新或获取设置。为此,我们将使用 ImportExcel 模块。

尽管我们可以使用 Import-CSV 导入 Excel 数据,但 ImportExcel 模块的优点是您不需要转换 Excel 文件,并且在选择所需数据时有更多选项。

在本文中,我们将了解如何使用 PowerShell 导入 Excel 文件。我们将研究模块的不同功能,并给您一些示例。

在 PowerShell 中导入 Excel

要将 Excel 文件导入 PowerShell,我们首先需要安装 ImportExcel 模块。该模块可在 PowerShell Gallery 中找到,因此我们只需使用 Install-Module cmdlet 即可安装它。

使用下面的命令来安装模块,请记住,您需要在提升模式(管理模式)下运行 PowerShell 来安装模块,或者您可以使用 scope 参数来安装当前模块仅限用户。

# Install the module for all users
Install-Module -Name ImportExcel

# Install the module for the current user only
Install-Module -Name ImportExcel -Scope CurrentUser

安装模块后,您可以使用 Import-Module cmdlet 加载该模块。如果您经常使用该模块,那么您还可以将该模块添加到您的 PowerShell 配置文件中,这样当您打开 PowerShell 时它将始终加载。

Import-Module ImportExcel

导入 Excel 文件

ImportExcel 模块附带了一些功能,可帮助您将 Excel 文件导入 PowerShell。对于下面的示例,我将使用以下 Excel 文件,该文件具有多个工作表和一个日期字段:

[玩转系统] 如何在 PowerShell 中导入 Excel

在了解如何使用 ImportExcel 模块之前,我们首先看一下可用于导入 Excel 文件的参数:

  • 路径 - 必填,Excel 文件的位置
  • ExcelPackage - 允许您提供 Excel 包对象而不是路径
  • WorksheetName - 要导入的 Excel 工作表的名称。
  • HeaderName - 指定自定义标题名称,而不是 Excel 文件中的名称
  • NoHeader - 导入 Excel 文件而不使用第一行作为标题。
  • ImportColumns - 指定要导入的列
  • StartRow - 定义开始导入的行,上面的所有行将被忽略
  • EndRow - 导入在指定行停止
  • StartColumn - 定义从哪一列开始导入
  • EndColumn - 从指定列开始导入
  • DataOnly - 仅导入包含数据的行和列。空的将被忽略
  • AsText - 将指定列导入为文本
  • AsDate - 将指定列转换为数据对象
  • 密码 - 打开受保护 Excel 文件的密码

将 Excel 文件导入 PowerShell 时,默认情况下仅导入第一个工作表。所有标题、行和列均已导入,但我们可以根据需要进行更改。因此,要简单地重要一个Excel文件,您只需要指定Excel文件的路径:

import-Excel -Path "C:\temp\employeeData.xlsx" | ft

# Results
EmployeeID Name          Department   Salary HireDate
---------- ----          ----------   ------ --------
    101,00 John Doe      HR         60000,00 42064,00
    102,00 Jane Smith    IT         75000,00 42931,00
    103,00 Emily Jones   Finance    72000,00 43636,00
    104,00 Michael Brown Marketing  68000,00 43416,00
    105,00 Jessica White IT         79000,00 43840,00

修复日期字段

正如您在上面的结果中看到的,我们的 HireDate 列存在问题。所有内容都以文本形式导入,这使得日期字段毫无用处。您可以通过使用 -AsDate 参数将日期列标记为日期字段来解决此问题:

Import-Excel -Path "C:\temp\employeeData.xlsx" -AsDate "HireDate" | ft

# Results
EmployeeID Name          Department   Salary HireDate
---------- ----          ----------   ------ --------
    101,00 John Doe      HR         60000,00 1-3-2015 00:00:00
    102,00 Jane Smith    IT         75000,00 15-7-2017 00:00:00
    103,00 Emily Jones   Finance    72000,00 20-6-2019 00:00:00
    104,00 Michael Brown Marketing  68000,00 12-11-2018 00:00:00
    105,00 Jessica White IT         79000,00 10-1-2020 00:00:00

导入特定工作表

如果您的 Excel 工作簿有多个工作表,并且您想要从另一个工作表而不是第一个工作表导入数据,那么我们可以使用 -WorksheetName 参数指定工作表名称。

要从示例工作表导入 SalesData,我们可以使用以下命令:

Import-Excel -Path "C:\temp\employeeData.xlsx" -WorksheetName "salesdata" | ft

在此示例中,我们知道要导入的工作表名称。但是,如何从命令行知道您的 Excel 文件是否有多个工作表呢?工作表的名称是什么?要找到这一点,我们可以使用 cmdlet Get-ExcelSheetInfo,它也是 ImportExcel 模块的一部分。

该 cmdlet 仅需要 Excel 文件的路径,并将输出所有工作表、其名称和索引号,以及工作表是否可见或隐藏:

Get-ExcelSheetInfo -Path C:\temp\employeeData.xlsx

# Result
Name         Index  Hidden Path
----         -----  ------ ----
EmployeeData     1 Visible C:\temp\employeeData.xlsx
SalesData        2 Visible C:\temp\employeeData.xlsx
Summary          3 Visible C:\temp\employeeData.xlsx

在此示例中,每个工作表都有不同的结构,因此我们无法轻松地将它们全部导入到一个对象中。但是,如果您想从 Excel 文件导入每个工作表,您可以简单地使用 ForEach 循环将它们全部导入:

$excelSheets = Get-ExcelSheetInfo -Path "C:\temp\employeeData.xlsx"

$excelSheets | ForEach {
    Import-Excel -Path "C:\temp\employeeData.xlsx" -WorksheetName $_.Name | ft
}

导入特定的行和列

有时您只需要 Excel 文件中的部分数据。使用 ImportExcel 模块,您可以指定要导入的内容和不导入的内容。

为此,我们可以使用 cmdlet StartRowEndRowStartColumnEndColumn。因此,如果我们只想从 Excel 文件中导入姓名和部门,以及前三个用户,我们可以执行以下操作:

Import-Excel -Path "C:\temp\employeeData.xlsx" -StartRow 1 -EndRow 4 -StartColumn 2 -EndColumn 3

# Results
Name        Department
----        ----------
John Doe    HR
Jane Smith  IT
Emily Jones Finance

对此有几点需要注意。编程时,我们通常从 0 开始计数,但在本例中,我们从第一行或第一列开始计数。您指定的结束行或列包含在结果中。

但正如您所看到的,我们已指定第 4 行作为结束行。这是因为我们的 Excel 文件有标题,我们也包含了标题。

如果您不想包含标头,那么我们还需要使用参数 -NoHeaders 并在此示例中从第 2 行开始。

当您只需要导入特定列时,可以使用 -ImportColumns 参数并指定索引号(从 1 开始)。例如,要仅导入前两列,您可以执行以下操作:

import-Excel -Path "C:\temp\employeeData.xlsx" -ImportColumns 1,2

高级导入选项

当您只需要从 Excel 文件中读取特定单元格时,可以使用 Open-ExcelPackage cmdlet,它也是 ImportExcel 模块的一部分。此 cmdlet 并不真正导入 Excel 文件,而是实际在后台打开它。

这不仅允许您读取文件中的特定单元格,还允许您进行修改。需要注意的是,完成后您需要关闭 Excel 文件。

因此,要读取特定单元格的值,我们可以首先打开Excel文件:

$excel = Open-ExcelPackage -Path "C:\temp\employeeData.xlsx"

要检索特定单元格的值,我们需要使用工作表和单元格名称。例如,要从示例文件中获取单元格 B4 的值:

$excel.EmployeeData.Cells["B4"].Value

# Returns
Emily Jones

完成后,请确保使用 Close-ExcelPackage cmdlet 关闭 Excel 文件。

总结

ImportExcel 模块确实是一个功能强大的模块。在本文中,我们只了解了它的导入功能,但真正的优势实际上在于导出到 Excel。我们将在另一篇完全不同的文章中对此进行探讨,因此请确保您订阅新闻通讯或在 Facebook 上关注我。

希望您喜欢这篇文章,如果您有任何疑问,请在下面发表评论!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯