엑셀 이미지를 다른 이름으로 저장 2

11573 단어 ExcelPowerShell엑셀

Excel 이미지를 다른 이름으로 저장



  • "엑셀 이미지를 다른 이름으로 저장" 에서 VBA를 사용하여 이미지를 저장했습니다.
  • 일반적으로 사용하려면 애드인으로 하는 등, 어느 엑셀 파일로부터라도 사용할 수 있도록 할 필요가 있습니다.

  • PowerShell을 사용해 보았습니다.



    PowerShell에서 Excel Book에 액세스할 때 책을 닫아야 한다고 생각했지만 열어도 괜찮습니다.

    이미지 저장은 saggie의 PowerShell로 클립보드 이미지를 파일에 저장을 사용했습니다.

    사용법


  • 이미지 왼쪽 상단 바로 위의 셀에 파일 이름을 입력합니다.
  • 통합 문서는 파일 이름으로 저장합니다
  • 아래의 Powershell 코드를 실행합니다
  • 책 폴더에 이미지가 저장됩니다



  • 제한 사항, 결함


  • 파일 이름이 없으면 셀 주소를 파일 이름으로 PNG 형식의 파일을 저장합니다.
  • 덮어쓰기 확인은 하지 않습니다.
  • 파일 이름에 확장자가 없으면 PNG로 설정합니다.
  • 확장자가 이미지가 아닌 경우 파일 이름이 그대로 PNG로 저장됩니다.
  • 이미지가 겹치면 동일한 파일 이름으로 덮어 씁니다.
  • 파일에 사용할 수 없는 문자가 포함되어 있으면 제대로 작동하지 않습니다.
  • 변수를 파괴하지 않기 때문에 어쩌면 엑셀의 프로세스가 남아 있을지도 모릅니다.

  • ExcelToPictue.ps1
    
    Set-StrictMode -Version Latest
    Add-Type -AssemblyName System.Windows.Forms
    
    # attach to excel file
    $Excel = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Excel.Application')
    $bookPath = $Excel.ActiveWorkbook.Path
    if ($bookPath -eq "" ) {
      Write-Output ">>> save excel file first."
      exit
    }
    
    # save each file
    $shapes = $Excel.ActiveWorkBook.ActiveSheet.Shapes
    $shapes | ForEach-Object {
    
      # picture position check
      $address = $_.TopLeftCell.address()
      $isInRange = $False
      if ($_.TopLeftCell.row -gt 1) {
        $isInRange = $true
      }
      else {
        $address = $_.TopLeftCell.address
        Write-Output ">>> row of the picture at $address  must > 1."  
      }
    
      # file name check
      $fileName = ""
      $str_extension = ""
      if ($isInRange)
      {
        $fileName = $_.TopLeftCell.offset(-1, 0).text
        if ($fileName -ne "") {
          $str_extension = [System.IO.Path]::GetExtension($fileName)
          if ($str_extension -eq "") {
            $str_extension = ".png"
            Write-Output ">>> the picture at $address has no extension, so add .png."
            $fileName += $str_extension
          }
        }
        else { 
          $str_extension = ".png"
          $fileName = $address + $str_extension
          Write-Output ">>> the picture at $address has no file name. So name $fileName."
        }
      }
    
      # capture and save
      # https://qiita.com/saggie/items/44cb8b317fe0effa5891
      # picture save code is form above. 
    
      $_.CopyPicture(1, 2) # Appearance:=xlScreen, Format:=xlBitmap
      $clipboardImage = [Windows.Forms.Clipboard]::GetImage()
      if ([Windows.Forms.Clipboard]::ContainsImage() -and ($str_extension -ne ""))
      {
        $outputFilePath = Join-Path $bookPath $fileName
        $clipboardImage.Save($outputFilePath)
      }
      else {
        Write-Output ">>> the picture at $address has not captured." 
      }
    }
    
    

    좋은 웹페이지 즐겨찾기