Compare commits

..

3 Commits

Author SHA1 Message Date
Wyatt Wong
8fc8445fce Merge 5a606f4f29 into fa907da4a4 2024-05-18 09:44:58 -04:00
Wyatt Wong
5a606f4f29 Update ConditionalFormattingUnmatchColumns-Sol2.ps1 2024-02-06 10:49:52 +08:00
Wyatt Wong
b8872ef6b4 Create ConditionalFormattingUnmatchColumns-Sol2.ps1
Added Conditional Formatting Unmatch Columns Solution 2
2024-02-06 10:07:08 +08:00
8 changed files with 31 additions and 5733 deletions

View File

@@ -0,0 +1,27 @@
try { Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 } catch { throw ; return }
$data = ConvertFrom-Csv @"
Sequence1,StateName1,Abbreviation1,Sequence2,StateName2,Abbreviation2
A001,Alabama,AL,A001,Alabama,AL
A002,California,CA,B002,California,CA
A003,Colorado,CO,A003,Colorado,CO
A004,Florida,FL,A004,Maine,FL
A005,Missouri,MO,A005,Missouri,MI
A006,New Mexico,NM,A006,Tennessee,TN
A007,North Carolina,NC,C007,North Carolina,NC
A008,North Dakota,ND,A008,South Dakota,SD
A009,Rhode Island,RI,D009,Rhode Island,VA
A010,Texas,TX,A010,Texas,TX
"@
$xlfile = "$PSScriptRoot\test.xlsx"
Remove-Item $xlfile -ErrorAction SilentlyContinue
$file = $data | Export-Excel $xlfile -AutoSize -PassThru
Add-ConditionalFormatting -Worksheet $file.Sheet1 -Range '$1:$1' -ConditionValue '=True' -RuleType Expression -StopIfTrue
Add-ConditionalFormatting -Worksheet $file.Sheet1 -Range '$D:$D' -ConditionValue '=NOT(EXACT($A1,$D1))' -RuleType Expression -ForegroundColor Red
Add-ConditionalFormatting -Worksheet $file.Sheet1 -Range '$E:$E' -ConditionValue '=NOT(EXACT($B1,$E1))' -RuleType Expression -ForegroundColor Red
Add-ConditionalFormatting -Worksheet $file.Sheet1 -Range '$F:$F' -ConditionValue '=NOT(EXACT($C1,$F1))' -RuleType Expression -ForegroundColor Red
Close-ExcelPackage $file -Show

View File

@@ -6,7 +6,7 @@
RootModule = 'ImportExcel.psm1'
# Version number of this module.
ModuleVersion = '7.8.10'
ModuleVersion = '7.8.9'
# ID used to uniquely identify this module
GUID = '60dd4136-feff-401a-ba27-a84458c57ede'
@@ -150,7 +150,7 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
Tags = @("Excel", "EPPlus", "Export", "Import")
# The web address of an icon which can be used in galleries to represent this module
#IconUri =
#IconUri = "http://pesterbdd.com/images/Pester.png"
# The web address of this module's project or support homepage.
ProjectUri = "https://github.com/dfinke/ImportExcel"
@@ -215,4 +215,4 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix.
# DefaultCommandPrefix = ''
}
}

View File

@@ -19,9 +19,6 @@ function Close-ExcelPackage {
try { [OfficeOpenXml.CalculationExtension]::Calculate($ExcelPackage.Workbook) }
catch { Write-Warning "One or more errors occured while calculating, save will continue, but there may be errors in the workbook." }
}
# Set FullCalcOnLoad to false to prevent Excel from corrupting formulas during recalculation
# This fixes issues with table-structured references like [[#This Row],[ColumnName]]
$ExcelPackage.Workbook.FullCalcOnLoad = $false
if ($SaveAs) {
$SaveAs = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($SaveAs)
if ($Password) { $ExcelPackage.SaveAs( $SaveAs, $Password ) }

View File

@@ -682,9 +682,6 @@
else {
if ($ReturnRange) { $dataRange }
# Set FullCalcOnLoad to false to prevent Excel from corrupting formulas during recalculation
# This fixes issues with table-structured references like [[#This Row],[ColumnName]]
$pkg.Workbook.FullCalcOnLoad = $false
if ($Password) { $pkg.Save($Password) }
else { $pkg.Save() }
Write-Verbose -Message "Saved workbook $($pkg.File)"

View File

@@ -50,9 +50,7 @@ function Get-HtmlTable {
else {
$h = ConvertFrom-Html -Content $r.Content
if ($TableIndex -is [valuetype]) { $TableIndex += 1}
$rows = try {
$h.SelectSingleNode("//table[$TableIndex]").SelectNodes(".//tr")
} catch {}
$rows = $h.SelectNodes("//table[$TableIndex]//tr")
if (-not $rows) {Write-Warning "Could not find rows for `"//table[$TableIndex]`" in $Url ."}
if ( -not $propertyNames) {
if ( $tableHeaders = $rows[$FirstDataRow].SelectNodes("th")) {

View File

@@ -1,125 +0,0 @@
#Requires -Modules @{ ModuleName="Pester"; ModuleVersion="4.0.0" }
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification = 'False Positives')]
param()
Describe "Table Formula Bug Fix" -Tag "TableFormula" {
BeforeAll {
$WarningAction = "SilentlyContinue"
}
Context "FullCalcOnLoad is set to false to prevent formula corruption" {
BeforeAll {
$path = "TestDrive:\table_formula.xlsx"
Remove-Item -Path $path -ErrorAction SilentlyContinue
# Create a table with a blank record
$BlankRecordForFile = [PsCustomObject]@{
'Action Add' = ''
UserName = ''
Address = ''
Name = ''
NewName = ''
}
# Export as a table
$ExcelFile = $BlankRecordForFile | Export-Excel -Path $path -WorksheetName 'Data' `
-TableName 'DataTable' -TableStyle 'Light1' -AutoSize:$false -AutoFilter `
-BoldTopRow -FreezeTopRow -StartRow 1 -PassThru
$Worksheet = $ExcelFile.Workbook.Worksheets['Data']
# Insert a row and add a complex formula with table-structured references
$Worksheet.InsertRow(2, 1)
# This formula uses old-style table references [[#This Row],[ColumnName]]
# which Excel converts to [@ColumnName] when opening
$Formula = '=IFS( [[#This Row],[UserName]]="","", [[#This Row],[Action Add]]=TRUE, CONCAT([[#This Row],[Address]],"-",[[#This Row],[UserName]]), CONCAT([[#This Row],[Address]],"-",[[#This Row],[UserName]]) <> [[#This Row],[Name]], CONCAT([[#This Row],[Address]],"-",[[#This Row],[UserName]]), TRUE, "")'
$Cell = $Worksheet.Cells['e2']
$Cell.Formula = $Formula
Close-ExcelPackage $ExcelFile
# Reopen to verify
$ExcelFile2 = Open-ExcelPackage -Path $path
$Worksheet2 = $ExcelFile2.Workbook.Worksheets['Data']
}
It "Sets fullCalcOnLoad to false in the workbook XML" {
# Extract and check the XML directly
$TempExtractPath = Join-Path -Path $TestDrive -ChildPath "extracted_$(Get-Random)"
Expand-Archive -Path $path -DestinationPath $TempExtractPath -Force
$WorkbookXml = Get-Content (Join-Path -Path $TempExtractPath -ChildPath "xl/workbook.xml") -Raw
$WorkbookXml | Should -Match 'fullCalcOnLoad="0"'
Remove-Item -Path $TempExtractPath -Recurse -Force
}
It "Preserves the formula correctly after save and reopen" {
$Cell2 = $Worksheet2.Cells['e2']
$Cell2.Formula | Should -Not -BeNullOrEmpty
$Cell2.Formula | Should -Match 'IFS\('
$Cell2.Formula | Should -Match 'CONCAT\('
}
It "Does not corrupt the formula with extra @ symbols" {
$Cell2 = $Worksheet2.Cells['e2']
# The formula should not have extra @ symbols added by Excel during recalculation
# The specific bug was an @ being inserted before CONCAT in the middle of the formula
# We can't test this directly without opening in Excel, but we can verify the formula is unchanged
$Cell2.Formula.Length | Should -BeGreaterThan 100
}
AfterAll {
if ($ExcelFile2) {
Close-ExcelPackage -ExcelPackage $ExcelFile2 -NoSave
}
}
}
Context "FullCalcOnLoad setting works with different save methods" {
It "Sets fullCalcOnLoad to false when using SaveAs" {
$path = "TestDrive:\saveas_test.xlsx"
$path2 = "TestDrive:\saveas_test2.xlsx"
Remove-Item -Path $path, $path2 -ErrorAction SilentlyContinue
$data = [PSCustomObject]@{ Name = 'Test' }
$excel = $data | Export-Excel -Path $path -PassThru
Close-ExcelPackage $excel -SaveAs $path2
# Extract and check the XML
$TempExtractPath = Join-Path -Path $TestDrive -ChildPath "extracted_saveas_$(Get-Random)"
Expand-Archive -Path $path2 -DestinationPath $TempExtractPath -Force
$WorkbookXml = Get-Content (Join-Path -Path $TempExtractPath -ChildPath "xl/workbook.xml") -Raw
$WorkbookXml | Should -Match 'fullCalcOnLoad="0"'
Remove-Item -Path $TempExtractPath -Recurse -Force
}
It "Sets fullCalcOnLoad to false when using Calculate flag" {
$path = "TestDrive:\calculate_test.xlsx"
Remove-Item -Path $path -ErrorAction SilentlyContinue
$data = [PSCustomObject]@{ Name = 'Test'; Value = 100 }
$excel = $data | Export-Excel -Path $path -PassThru
# Set a formula
$ws = $excel.Workbook.Worksheets[1]
$ws.Cells['C2'].Formula = 'B2*2'
Close-ExcelPackage $excel -Calculate
# Extract and check the XML
$TempExtractPath = Join-Path -Path $TestDrive -ChildPath "extracted_calc_$(Get-Random)"
Expand-Archive -Path $path -DestinationPath $TempExtractPath -Force
$WorkbookXml = Get-Content (Join-Path -Path $TempExtractPath -ChildPath "xl/workbook.xml") -Raw
$WorkbookXml | Should -Match 'fullCalcOnLoad="0"'
Remove-Item -Path $TempExtractPath -Recurse -Force
}
}
}

View File

@@ -1,7 +1,3 @@
# 7.8.10
- Thank you https://github.com/evenmartinsen for the PR to fix the AV
# 7.8.9
- Thanks to (Edward Miller)[https://github.com/edwardmiller-mesirow] for improving `ConvertTo-ExcelXlsx`and making it more robust

File diff suppressed because it is too large Load Diff