【问题标题】:How to export CSV file with more than 1,048,576 rows of data via powershell如何通过 powershell 导出包含超过 1,048,576 行数据的 CSV 文件
【发布时间】:2016-08-29 23:09:43
【问题描述】:

如您所知,Excel 有 1048574 行。如何在我的代码下方导出超过一百万行?如果达到最大行数,那么我该如何继续循环中的新工作表?如何适应它? 在我找到不错的powershell functions 之后,我正在谷歌上搜索一些。

[Reflection.Assembly]::LoadFrom("C:\DRIVERS\NPOI 2.2.1 binary package\Release\Net40\NPOI.dll")
[Reflection.Assembly]::LoadFrom("C:\DRIVERS\NPOI 2.2.1 binary package\Release\Net40\NPOI.OOXML.dll")
[Reflection.Assembly]::LoadFrom("C:\DRIVERS\NPOI 2.2.1 binary package\Release\Net40\NPOI.OpenXml4Net.dll")
[Reflection.Assembly]::LoadFrom("C:\DRIVERS\NPOI 2.2.1 binary package\Release\Net40\NPOI.OpenXml4Net.dll")
[Reflection.Assembly]::LoadFrom("C:\DRIVERS\NPOI 2.2.1 binary package\Release\Net40\NPOI.OpenXmlFormats.dll")
[Reflection.Assembly]::LoadFrom("C:\DRIVERS\NPOI 2.2.1 binary package\Release\Net40\ICSharpCode.SharpZipLib.dll")

$wb = New-Object NPOI.XSSF.UserModel.XSSFWorkbook;
$ws = $wb.CreateSheet("Company_NTFS_Permissions");
$wr = $ws.CreateRow(0);



$wr.createCell(0).setCellValue("Folder Path");
$wr.createCell(1).setCellValue("Users/Groups");
$wr.createCell(2).setCellValue("Permissions");
$wr.createCell(3).setCellValue("AccessControlType");
$wr.createCell(4).setCellValue("Permissions Inherited")



$dirToAudit = Get-ChildItem -Path "C:\inetpub" -recurse | Where { $_.psIsContainer -eq $true }

$intRow = 1

foreach ($dir in $dirToAudit)
{
    $colACL = Get-Acl -Path $dir.FullName

    foreach ($acl in $colACL)
    {
        $fileNameRow = $ws.CreateRow($intRow)
        $fileNameRow.CreateCell(0).SetCellValue($dir.FullName)
        $intRow++

        foreach ($accessRight in $acl.Access)
        {
            $values = $ws.CreateRow($intRow)
            $values.CreateCell(1).SetCellValue($($AccessRight.IdentityReference).ToString())
            $values.CreateCell(2).SetCellValue($($AccessRight.FileSystemRights).ToString())
            $values.CreateCell(3).SetCellValue($($AccessRight.AccessControlType).ToString())
            $values.CreateCell(4).SetCellValue($($acl.AreAccessRulesProtected).ToString())
            $intRow++

        }
    }

}
$fs = new-object System.IO.FileStream("C:\DRIVERS\test.xlsx",[System.IO.FileMode]'Create',[System.IO.FileAccess]'Write')
$wb.Write($fs);
$fs.Close()

【问题讨论】:

  • 您已经在跟踪 $intRow 中的行数,所以您不能只检查您是否刚刚达到行数限制,然后重新分配您的工作表变量,例如 $ws = $wb.CreateSheet("Next_Sheet"); ?
  • 我怎样才能适应像 $ws = $wb.CreateSheet("Next_Sheet") 这样的变量?请澄清一下
  • 您在代码顶部设置了工作表的变量,该变量决定了将数据添加到哪个工作表的所有内容。只需稍后在代码中将该变量重新设置为不同的工作表(我发布的确切行,但将变量名称从“Next_Sheet”更改),所有新数据都将添加到该不同的工作表中。
  • $wb = 新对象 NPOI.XSSF.UserModel.XSSFWorkbook; $ws = $wb.CreateSheet("Company_NTFS_Permissions"); $ws = $wb.CreateSheet("Company_NTFS_Permissions_2"); $wr = $ws.CreateRow(0);我说的对吗?

标签: excel windows powershell filesystems


【解决方案1】:

使用您对当前行号的现有知识来确定何时达到最大行数,然后移至新工作表。

[Reflection.Assembly]::LoadFrom("C:\DRIVERS\NPOI 2.2.1 binary package\Release\Net40\NPOI.dll")
[Reflection.Assembly]::LoadFrom("C:\DRIVERS\NPOI 2.2.1 binary package\Release\Net40\NPOI.OOXML.dll")
[Reflection.Assembly]::LoadFrom("C:\DRIVERS\NPOI 2.2.1 binary package\Release\Net40\NPOI.OpenXml4Net.dll")
[Reflection.Assembly]::LoadFrom("C:\DRIVERS\NPOI 2.2.1 binary package\Release\Net40\NPOI.OpenXml4Net.dll")
[Reflection.Assembly]::LoadFrom("C:\DRIVERS\NPOI 2.2.1 binary package\Release\Net40\NPOI.OpenXmlFormats.dll")
[Reflection.Assembly]::LoadFrom("C:\DRIVERS\NPOI 2.2.1 binary package\Release\Net40\ICSharpCode.SharpZipLib.dll")

$wb = New-Object NPOI.XSSF.UserModel.XSSFWorkbook;
$ws = $wb.CreateSheet("Company_NTFS_Permissions");
$wr = $ws.CreateRow(0);



$wr.createCell(0).setCellValue("Folder Path");
$wr.createCell(1).setCellValue("Users/Groups");
$wr.createCell(2).setCellValue("Permissions");
$wr.createCell(3).setCellValue("AccessControlType");
$wr.createCell(4).setCellValue("Permissions Inherited")



$dirToAudit = Get-ChildItem -Path "C:\inetpub" -recurse | Where { $_.psIsContainer -eq $true }

$maxRow = 1048576
$intRow = 1
$intNextSheet = 2

foreach ($dir in $dirToAudit)
{
    $colACL = Get-Acl -Path $dir.FullName

    foreach ($acl in $colACL)
    {
        $fileNameRow = $ws.CreateRow($intRow)
        $fileNameRow.CreateCell(0).SetCellValue($dir.FullName)
        $intRow++

        if ($intRow -eq $maxRow)
        {
            $ws = $wb.CreateSheet("Company_NTFS_Permissions" + $intNextSheet);
            $intNextSheet++
            $intRow = 0
        }

        foreach ($accessRight in $acl.Access)
        {
            $values = $ws.CreateRow($intRow)
            $values.CreateCell(1).SetCellValue($($AccessRight.IdentityReference).ToString())
            $values.CreateCell(2).SetCellValue($($AccessRight.FileSystemRights).ToString())
            $values.CreateCell(3).SetCellValue($($AccessRight.AccessControlType).ToString())
            $values.CreateCell(4).SetCellValue($($acl.AreAccessRulesProtected).ToString())
            $intRow++

            if ($intRow -eq $maxRow)
            {
                $ws = $wb.CreateSheet("Company_NTFS_Permissions" + $intNextSheet);
                $intNextSheet++
                $intRow = 0
            }
        }
    }

}
$fs = new-object System.IO.FileStream("C:\DRIVERS\test.xlsx",[System.IO.FileMode]'Create',[System.IO.FileAccess]'Write')
$wb.Write($fs);
$fs.Close()

这里很重要:

if ($intRow -eq $maxRow)
{
    $ws = $wb.CreateSheet("Company_NTFS_Permissions" + $intNextSheet);
    $intNextSheet++
    $intRow = 0
}

这在每次 $intRow 递增后运行,检查是否已达到 $maxRow。如果是这样,它会移动到带有编号名称的新工作表并从第一行重新开始。

【讨论】:

  • 谢谢,但我假设存在逻辑错误,因为通常我此时使用 169 行获取 NTFS 权限,您的修改代码创建了 169 个工作表而不是这个所以它不起作用最大限制逻辑
  • 是的,犯了一个错误,忘记了我使用的是什么语言。比较在 Powershell 中使用-eq。我已经编辑了答案以反映变化。
猜你喜欢
  • 2013-06-01
  • 1970-01-01
  • 2017-01-05
  • 2020-07-26
  • 2020-07-30
  • 1970-01-01
  • 2016-01-04
  • 2014-07-14
  • 1970-01-01
相关资源
最近更新 更多