From b71e9a52e8e425ff71f6f9a37263f2bfda5ee2c5 Mon Sep 17 00:00:00 2001 From: love2hina Date: Sun, 22 Aug 2021 00:28:23 +0900 Subject: [PATCH] =?UTF-8?q?=E6=AE=B5=E8=90=BD=E3=82=B7=E3=83=95=E3=83=88?= =?UTF-8?q?=E3=81=AE=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit resolved #7 --- doc/excel/stmt_blocks.md | 15 +++--- src/main/powershell/ControlStatement.psm1 | 60 +++++++++++++++++++--- src/main/powershell/DocumentWriter.psm1 | 46 ++++++++++++++++- template/test.xlsm | Bin 14870 -> 16936 bytes 4 files changed, 105 insertions(+), 16 deletions(-) diff --git a/doc/excel/stmt_blocks.md b/doc/excel/stmt_blocks.md index 089698b..96381df 100644 --- a/doc/excel/stmt_blocks.md +++ b/doc/excel/stmt_blocks.md @@ -2,13 +2,13 @@ ### begin ステートメント 指定された要素の繰り返し処理を開始します。 -|パラメーター|概要|例|ヘッダー/フッター| -|:-----------|:---|:-|:---------------:| -|fields|フィールド定義を繰り返します。|`{#begin fields}`|〇| -|codes|コード記述を開始します。|`{#begin codes}`|×| -|description|処理記述を開始します。|`{#begin description}`|×| -|assignment|代入編集記述を開始します。|`{#begin assignment}`|〇| -|condition|条件分岐記述を開始します。|`{#begin condition}`|〇| +|パラメーター|概要|例|ヘッダー/フッター|シフト| +|:-----------|:---|:-|:---------------:|:-:| +|fields|フィールド定義を繰り返します。|`{#begin fields}`|〇|×| +|codes|コード記述を開始します。|`{#begin codes}`|×|×| +|description|処理記述を開始します。|`{#begin description}`|×|〇| +|assignment|代入編集記述を開始します。|`{#begin assignment}`|〇|〇| +|condition|条件分岐記述を開始します。|`{#begin condition}`|〇|〇| #### コード記述(codes) コード記述ブロック中(codes)に以下の記述を含める必要があります。 @@ -26,6 +26,7 @@ begin ステートメントでは追加パラメーターを指定できるも |:-----------|:---|:-| |header|ヘッダー行数を指定します。|`{#begin condition header:2}`| |footer|フッター行数を指定します。|`{#begin condition footer:1}`| +|shift|段落右シフトを指定します。|`{#begin description shift:1,5}`| 追加パラメーターは同時に複数指定も可能です。(例:`{#begin fields header:2 footer:1}`) diff --git a/src/main/powershell/ControlStatement.psm1 b/src/main/powershell/ControlStatement.psm1 index 4bed249..cbca70a 100644 --- a/src/main/powershell/ControlStatement.psm1 +++ b/src/main/powershell/ControlStatement.psm1 @@ -73,6 +73,14 @@ class ControlStatement : ControlHolder { [long] $headerLength = 0 # フッター行数 [long] $footerLength = 0 + # シフトステップ + [long] $shiftStep = 0 + # シフト上限 + [long] $shiftLimit = 0 + # シフト開始列 + [long] $shiftColumn = 0 + # シフト列幅 + [long] $shiftWidth = 0 ControlStatement([string[]] $params, $cell) { $this.command = $params[1] @@ -80,10 +88,16 @@ class ControlStatement : ControlHolder { # 拡張パラメーター for ($i = 2; $i -lt $params.Length; ++$i) { - if ($params[$i] -match '^(\w+):(\d+)$') { - switch ($Matches[1]) { - 'header' { $this.headerLength = [long]$Matches[2] } - 'footer' { $this.footerLength = [long]$Matches[2] } + switch -regex ($params[$i]) { + '^header:(\d+)$' { $this.headerLength = [long]$Matches[1] } + '^footer:(\d+)$' { $this.footerLength = [long]$Matches[1] } + '^shift:(\d+),(\d+)(?:,(\d+),(\d+))?$' { + $this.shiftStep = [long]$Matches[1] + $this.shiftLimit = [long]$Matches[2] + if ($Matches.Count -ge 5) { + $this.shiftColumn = [long]$Matches[3] + $this.shiftWidth = [long]$Matches[4] + } } } } @@ -93,6 +107,32 @@ class ControlStatement : ControlHolder { # 基底処理呼び出し ([ControlHolder]$this).Close($params, $cell) + # 定義値チェック + if ($this.headerLength -lt 0) { + Write-Warning "[Close] headerLength: $($this.headerLength)" + $this.headerLength = 0 + } + if ($this.footerLength -lt 0) { + Write-Warning "[Close] footerLength: $($this.footerLength)" + $this.footerLength = 0 + } + if ($this.shiftStep -lt 0) { + Write-Warning "[Close] shiftStep: $($this.shiftStep)" + $this.shiftStep = 0 + } + if ($this.shiftLimit -lt 0) { + Write-Warning "[Close] shiftLimit: $($this.shiftLimit)" + $this.shiftLimit = 0 + } + if ($this.shiftColumn -lt 0) { + Write-Warning "[Close] shiftColumn: $($this.shiftColumn)" + $this.shiftColumn = 0 + } + if ($this.shiftWidth -lt 0) { + Write-Warning "[Close] shiftWidth: $($this.shiftWidth)" + $this.shiftWidth = 0 + } + # 行数算出 $this.length = $cell.Row - $this.row + 1 if ($this.headerLength + $this.footerLength -gt $this.length) { @@ -120,7 +160,9 @@ class ControlStatement : ControlHolder { hidden [void] _AppendHeader([DocumentWriter] $docWriter, $target) { if ($this.headerLength -gt 0) { - $docWriter.Append($this.row + 1, $this.headerLength, $target) + $docWriter.Append($this.row + 1, $this.headerLength, + $this.shiftStep, $this.shiftLimit, $this.shiftColumn, $this.shiftWidth, + $target) } } @@ -130,7 +172,9 @@ class ControlStatement : ControlHolder { # 開始と終了を除く $appendLength = $this.length - $this.headerLength - $this.footerLength - 2 if ($appendLength -gt 0) { - $docWriter.Append($this.row + $this.headerLength + 1, $appendLength, $target) + $docWriter.Append($this.row + $this.headerLength + 1, $appendLength, + $this.shiftStep, $this.shiftLimit, $this.shiftColumn, $this.shiftWidth, + $target) } } else { @@ -142,8 +186,8 @@ class ControlStatement : ControlHolder { hidden [void] _AppendFooter([DocumentWriter] $docWriter, $target) { if ($this.footerLength -gt 0) { $docWriter.Append( - $this.row + $this.length - $this.footerLength - 1, - $this.footerLength, + $this.row + $this.length - $this.footerLength - 1, $this.footerLength, + $this.shiftStep, $this.shiftLimit, $this.shiftColumn, $this.shiftWidth, $target) } } diff --git a/src/main/powershell/DocumentWriter.psm1 b/src/main/powershell/DocumentWriter.psm1 index 9e54b3f..b3e22da 100644 --- a/src/main/powershell/DocumentWriter.psm1 +++ b/src/main/powershell/DocumentWriter.psm1 @@ -156,9 +156,19 @@ class DocumentWriter { # テンプレート側行位置 # .PARAM lineLength # 行数 + # .PARAM shiftStep + # シフトステップ + # .PARAM shiftLimit + # シフト上限 + # .PARAM shiftColumn + # シフト開始列 + # .PARAM shiftWidth + # シフト列幅 # .PARAM target # 出力置換対象 - [void] Append([long] $lineStart, [long] $lineLength, $target) { + [void] Append([long] $lineStart, [long] $lineLength, + [long] $shiftStep, [long] $shiftLimit, [long] $shiftColumn, [long] $shiftWidth, + $target) { if ($lineLength -le 0) { throw (New-Object -TypeName 'System.ArgumentException' ` @@ -171,6 +181,40 @@ class DocumentWriter { [void] $this.sheetDocument.Rows("$($lineDocumentStart):$($lineDocumentStart + $lineLength - 1)").Copy() [void] $this.sheetDocument.Rows("$($this.lineDocument + 1)").Insert($global:const.xlShiftDown) + # シフト処理 + if ($shiftStep -gt 0) { + [long] $offset = ($this.stackParagraph.Count - 1) * $shiftStep + if ($shiftLimit -gt 0) { + $offset = [System.Math]::Min($offset, $shiftLimit) + } + + if ($offset -gt 0) { + [object] $shiftSrcRange = $null + [object] $shiftDestRange = $null + + if (($shiftColumn -gt 0) -and ($shiftWidth -gt 0)) { + # 一部のシフト + $shiftSrcRange = $this.sheetDocument.Range( + $this.sheetDocument.Cells($this.lineDocument + 1, $shiftColumn), + $this.sheetDocument.Cells($this.lineDocument + $lineLength, $shiftColumn + $shiftWidth - 1)) + $shiftDestRange = $this.sheetDocument.Range( + $this.sheetDocument.Cells($this.lineDocument + 1, $shiftColumn + $offset), + $this.sheetDocument.Cells($this.lineDocument + $lineLength, $shiftColumn + $shiftWidth + $offset - 1)) + } + else { + # 行全体のシフト + $shiftSrcRange = $this.sheetDocument.Range( + $this.sheetDocument.Cells($this.lineDocument + 1, 1), + $this.sheetDocument.Cells($this.lineDocument + $lineLength, $global:config.searchColumns)) + $shiftDestRange = $this.sheetDocument.Range( + $this.sheetDocument.Cells($this.lineDocument + 1, $offset + 1), + $this.sheetDocument.Cells($this.lineDocument + $lineLength, $offset + $global:config.searchColumns)) + } + + $shiftSrcRange.Cut($shiftDestRange) + } + } + # 出力置換処理 $this._TranslateLines($lineLength, $target) } diff --git a/template/test.xlsm b/template/test.xlsm index d015dac21c29f31e06ea5620cbdd279371a32972..4944cade7ba9fb7c45e8656a347acc0e00148f50 100644 GIT binary patch delta 6347 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 O?3Nf4!GPr7KK>W1s;YMY delta 4130 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