Files
ImportExcel/GRADIENT_GUIDE.md
2025-09-22 11:31:26 +00:00

152 lines
5.0 KiB
Markdown

# Working with Gradient Fills in ImportExcel
## Overview
ImportExcel now provides enhanced support for working with Excel gradient fills through three new functions that address EPPlus 4.x limitations with gradient color reading.
## The Issue
In EPPlus 4.x (used by ImportExcel), while gradient colors can be set using `SetColor()`, they cannot be read back via properties like `Rgb`, `Top`, `Bottom`, `Left`, `Right`. This prevents copying gradients between cells.
## The Solution
Three new functions provide a complete gradient workflow:
### Set-ExcelGradientFill
Sets gradient fill properties for Excel ranges.
```powershell
# Basic linear gradient
Set-ExcelGradientFill -Range $ws.Cells["A1"] -Type Linear -Degree 90 -Color1 Blue -Color2 Green
# Path gradient
Set-ExcelGradientFill -Range $ws.Cells["B1"] -Type Path -Color1 Red -Color2 Yellow
# Advanced linear gradient with positioning
Set-ExcelGradientFill -Range $ws.Cells["C1"] -Type Linear -Degree 45 -Color1 Purple -Color2 Orange -Top 0.1 -Bottom 0.9
```
### Get-ExcelGradientFill
Reads gradient properties that can be reliably extracted from EPPlus.
```powershell
$gradient = Get-ExcelGradientFill -Range $ws.Cells["A1"]
# Returns: Type, Degree, Top, Bottom, Left, Right
# Note: Color1 and Color2 are null due to EPPlus limitations
```
### Copy-ExcelGradientFill
Copies gradient fills between ranges using two approaches:
#### Approach 1: Copy Geometric Properties Only
```powershell
# Copies Type, Degree, and positioning but warns about colors
Copy-ExcelGradientFill -SourceRange $ws.Cells["A1"] -TargetRange $ws.Cells["B1"]
```
#### Approach 2: Complete Gradient Definition
```powershell
# Create a complete gradient definition
$gradientDef = @{
Type = "Linear"
Degree = 45
Color1 = [System.Drawing.Color]::Blue
Color2 = [System.Drawing.Color]::Green
Top = 0.2
Bottom = 0.8
}
Copy-ExcelGradientFill -TargetRange $ws.Cells["C1:E3"] -GradientDefinition $gradientDef
```
## Complete Example
```powershell
Import-Module ImportExcel
$xl = Open-ExcelPackage -Path "gradients.xlsx" -Create
$ws = Add-WorkSheet -ExcelPackage $xl -WorksheetName "Gradients"
# Set original gradient
Set-ExcelGradientFill -Range $ws.Cells["A1"] -Type Linear -Degree 90 -Color1 Blue -Color2 Green
# Get gradient properties (geometric only)
$gradientInfo = Get-ExcelGradientFill -Range $ws.Cells["A1"]
# Create complete definition for copying
$completeDef = @{
Type = $gradientInfo.Type
Degree = $gradientInfo.Degree
Top = $gradientInfo.Top
Bottom = $gradientInfo.Bottom
Left = $gradientInfo.Left
Right = $gradientInfo.Right
Color1 = [System.Drawing.Color]::Blue # Must specify colors
Color2 = [System.Drawing.Color]::Green
}
# Copy to other cells
Copy-ExcelGradientFill -TargetRange $ws.Cells["B1:D3"] -GradientDefinition $completeDef
Close-ExcelPackage -ExcelPackage $xl -SaveAs "gradients.xlsx"
```
## Migration from Direct EPPlus Access
### Before (Limited by EPPlus 4.x):
```powershell
# Setting worked
$Sheet.Cells["A1"].Style.Fill.Gradient.Color1.SetColor("BLUE")
$Sheet.Cells["A1"].Style.Fill.Gradient.Color2.SetColor("GREEN")
# Reading failed - returned empty values
$rgb = $Sheet.Cells["A1"].Style.Fill.Gradient.Color1.Rgb # Empty!
```
### After (Using ImportExcel functions):
```powershell
# Setting is easier and more robust
Set-ExcelGradientFill -Range $Sheet.Cells["A1"] -Type Linear -Degree 90 -Color1 Blue -Color2 Green
# Reading works for geometric properties
$gradient = Get-ExcelGradientFill -Range $Sheet.Cells["A1"]
# $gradient.Type, $gradient.Degree work; colors need to be specified separately
# Copying now possible with complete definitions
$gradientDef = @{
Type = $gradient.Type
Degree = $gradient.Degree
Color1 = [System.Drawing.Color]::Blue
Color2 = [System.Drawing.Color]::Green
}
Copy-ExcelGradientFill -TargetRange $Sheet.Cells["B1"] -GradientDefinition $gradientDef
```
## Parameters Reference
### Set-ExcelGradientFill Parameters
- **Range**: Target Excel range (required)
- **Type**: "Linear" or "Path" (required)
- **Degree**: Angle for linear gradients (0-360, default 90)
- **Color1**: First color - Color object or string name (required)
- **Color2**: Second color - Color object or string name (required)
- **Top/Bottom/Left/Right**: Position values (0-1, optional)
### Copy-ExcelGradientFill Parameters
- **SourceRange**: Source range (for copying geometric properties)
- **TargetRange**: Target range (required)
- **GradientDefinition**: Hashtable with gradient properties (alternative to SourceRange)
## Limitations
- Color properties cannot be read from existing gradients due to EPPlus 4.x limitations
- When copying gradients, colors must be specified manually in the gradient definition
- Functions provide warnings when color limitations affect operations
## Benefits
- Clean, PowerShell-friendly interface for gradient operations
- Comprehensive parameter validation
- Clear error messages and warnings
- Supports both string color names and Color objects
- Enables gradient copying workflows that weren't possible before