Skip to content

Commit

Permalink
出力ファイル列挙処理
Browse files Browse the repository at this point in the history
refs #10
  • Loading branch information
love2hina-net committed Dec 19, 2021
1 parent ba8ab1b commit 4ba2735
Show file tree
Hide file tree
Showing 8 changed files with 216 additions and 77 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.gradle/
gradle/
build/
test/
5 changes: 4 additions & 1 deletion .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 9 additions & 1 deletion .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,15 @@
"type": "PowerShell",
"request": "launch",
"script": "${workspaceFolder}/src/main/powershell/ganan.ps1",
"args": ["-Debug", "-Verbose", "-ErrorAction Break"],
"args": ["-Path test.xml", "-Template template/test.xlsm", "-OutputDirectory test", "-Debug", "-Verbose", "-ErrorAction Break"],
"cwd": "${workspaceFolder}"
},
{
"name": "PowerShell: Launch DocumentGenerator",
"type": "PowerShell",
"request": "launch",
"script": "${workspaceFolder}/src/main/powershell/DocumentGenerator.ps1",
"args": ["-FileTemplate ${workspaceFolder}\\template\\test.xlsm", "-FileXml ${workspaceFolder}\\test.xml", "-FileDocument ${workspaceFolder}\\test\\test.xlsx", "-Debug", "-Verbose", "-ErrorAction Break"],
"cwd": "${workspaceFolder}"
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,40 +7,79 @@ using namespace System.Text.RegularExpressions
using namespace System.Linq
using namespace System.Xml.XPath

[CmdletBinding()]
param(
[string] $FileTemplate,
[string] $FileXml,
[string] $FileDocument
)

$global:config = @{}
# 対象となる行数
$global:config.searchLines = 128
# 対象となる列数
$global:config.searchColumns = 64

$global:const = @{}
# xlWorksheet定数
$global:const.xlWorksheet = -4167
# xlShiftDown定数
$global:const.xlShiftDown = -4121
# xlToRight定数
$global:const.xlToRight = -4161

# メッセージ定義の読み込み
& (Join-Path -Path $PSScriptRoot -ChildPath '.\Messages.ps1' -Resolve)
Import-LocalizedData -BindingVariable 'messages' -FileName 'Messages'

# ドキュメント生成
class DocumentGenerator {
class DocumentGenerator: System.IDisposable {

# テンプレートフォーマット情報
$format = @{ entries = @() }
hidden $format = @{ entries = @() }
# Excel Application
$excel = (New-Object -ComObject 'Excel.Application')
hidden $excel = (New-Object -ComObject 'Excel.Application')
# テンプレートワークブック
$bookTemplate
hidden $bookTemplate
# 生成ドキュメントワークブック
$bookDocument
hidden $bookDocument

# XMLドキュメント
hidden [System.Xml.XmlDocument] $xml
# XPath
hidden [XPathNavigator] $xpath

[void] GenerateDocument([string]$fileXml, [string]$fileTemplate) {

# コード解析XMLファイルを開く
$this.xml = [System.Xml.XmlDocument](Get-Content $fileXml)
$this.xpath = $this.xml.CreateNavigator()
DocumentGenerator() {
$this.excel.Visible = $true

# テンプレートを開く
$this.bookTemplate = $this.excel.Workbooks.Open($fileTemplate, 0, $true)
$this.bookTemplate = $this.excel.Workbooks.Open($script:FileTemplate, 0, $true)
$this.ParseTemplate()
}

[void] Dispose() {

# テンプレートを閉じる
$this.bookTemplate.Close($false)

# Excelを閉じる
$this.excel.Quit()
$this.excel = $null
}

[void] GenerateDocument() {

# コード解析XMLファイルを開く
$this.xml = [System.Xml.XmlDocument](Get-Content $script:FileXml)
$this.xpath = $this.xml.CreateNavigator()

# ドキュメントを生成する
$this.bookDocument = $this.excel.Workbooks.Add($global:const.xlWorksheet)
$this.MakeDocument()

$this.bookTemplate.Close($false)
#$this.excel.Quit()
$this.excel = $null
# 保存する
$this.bookDocument.SaveAs($script:FileDocument)
$this.bookDocument.Close($false)
}

# 制御文解析
Expand Down Expand Up @@ -215,3 +254,9 @@ class DocumentGenerator {
}

}

Write-Debug "[DocumentGenerator] $FileTemplate, $FileXml, $FileDocument"

$generator = [DocumentGenerator]::new()
$generator.GenerateDocument()
$generator.Dispose()
43 changes: 23 additions & 20 deletions src/main/powershell/Messages.ps1
Original file line number Diff line number Diff line change
@@ -1,20 +1,23 @@
$global:messages = Data {
ConvertFrom-StringData -StringData @'
E001001 = The control statement is not closed correctly.
E002001 = This open was duplicated, cannot be performed on a control statement that has already been opened.
E002002 = Incorrect combination of control statements.
E002003 = Close is invalid for non-nested control statements.
E002004 = The number of header/footer lines exceeds the predefined total number of block lines.
E002005 = Output is invalid for non-nested control statements.
E002006 = The description control statement is not defined in the code control statement.
E002007 = The assignment control statement is not defined in the code control statement.
E002008 = The condition control statement is not defined in the code control statement.
W002001 = The extended parameter value is invalid and will be ignored.
E003001 = Invalid number of lines.
E003002 = Cannot start output for a specified line, because that has already been output.
E003003 = Output cannot be started for rows outbounds the transaction range that have already been started.
E003004 = Cannot operation for a specified line, because that has already been output.
E003005 = The number of lines specified for output is less than one.
E004001 = The search starting point is unknown.
'@
}
$global:messages = Data {
ConvertFrom-StringData -StringData @'
E001001 = The control statement is not closed correctly.
E002001 = This open was duplicated, cannot be performed on a control statement that has already been opened.
E002002 = Incorrect combination of control statements.
E002003 = Close is invalid for non-nested control statements.
E002004 = The number of header/footer lines exceeds the predefined total number of block lines.
E002005 = Output is invalid for non-nested control statements.
E002006 = The description control statement is not defined in the code control statement.
E002007 = The assignment control statement is not defined in the code control statement.
E002008 = The condition control statement is not defined in the code control statement.
W002001 = The extended parameter value is invalid and will be ignored.
E003001 = Invalid number of lines.
E003002 = Cannot start output for a specified line, because that has already been output.
E003003 = Output cannot be started for rows outbounds the transaction range that have already been started.
E003004 = Cannot operation for a specified line, because that has already been output.
E003005 = The number of lines specified for output is less than one.
E004001 = The search starting point is unknown.
E005001 = The specified a template file was not found.
E005002 = The specified output path is not a directory.
E005003 = The specified path is not a file or directory.
'@
}
110 changes: 88 additions & 22 deletions src/main/powershell/ganan.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -7,42 +7,108 @@
.NOTES
This project was released under the MIT Lincense.
#>
using module '.\DocumentGenerator.psm1'

[CmdletBinding()]
param()

$global:config = @{}
# 対象となる行数
$global:config.searchLines = 128
# 対象となる列数
$global:config.searchColumns = 64

$global:const = @{}
# xlWorksheet定数
$global:const.xlWorksheet = -4167
# xlShiftDown定数
$global:const.xlShiftDown = -4121
# xlToRight定数
$global:const.xlToRight = -4161
param(
# Sharonで出力したXMLファイルを指定します。
# ディレクトリを指定した場合、配下のXMLを対象とします。
[Parameter(Mandatory=$true)]
[string[]] $Path,

# Excelテンプレートファイルを指定します。
[Parameter(Mandatory=$true)]
[string] $Template,

# 出力先ディレクトリを指定します。
[Parameter(Mandatory=$true)]
[string] $OutputDirectory
)

# メッセージ定義の読み込み
& (Join-Path -Path $PSScriptRoot -ChildPath '.\Messages.ps1' -Resolve)
Import-LocalizedData -BindingVariable 'messages' -FileName 'Messages'

class GananApplication {

[void] Test() {
# テンプレートファイル名
[string] $template

# 出力先ディレクトリ
[string] $outputDir

# ファイルリスト
[string[]] $files = @()

GananApplication() {
Write-Debug "[GananApplication] begin..."

$this.template = [System.IO.Path]::GetFullPath($script:Template)
$this.outputDir = [System.IO.Path]::GetFullPath($script:OutputDirectory)

# テンプレートチェック
if (![System.IO.File]::Exists($this.template)) {
throw (New-Object -TypeName 'System.ArgumentException' `
-ArgumentList ("$($global:messages.E005001) Template:$($script:Template)"))
}

# 出力先ディレクトリチェック
if (![System.IO.Directory]::Exists($this.outputDir)) {
throw (New-Object -TypeName 'System.ArgumentException' `
-ArgumentList ("$($global:messages.E005002) OutputDirectory:$($script:OutputDirectory)"))
}

# 生成対象XMLファイル列挙
$list = [System.Collections.Generic.List[string]]::new()
foreach ($i in $script:Path) {
$fullpath = [System.IO.Path]::GetFullPath($i)

if ([System.IO.File]::Exists($fullpath)) {
[void]$list.Add($fullpath)
}
elseif ([System.IO.Directory]::Exists($fullpath)) {
# ディレクトリ内のXMLファイルを対象とする
[void]$list.AddRange([System.IO.Directory]::EnumerateFiles($fullpath, '*.xml'))
}
else {
throw (New-Object -TypeName 'System.ArgumentException' `
-ArgumentList ("$($global:messages.E005003) Path:$i"))
}
}

$this.files = $list.ToArray()

Write-Debug "[GananApplication] end."
}

[void] GenerateDocuments() {
Write-Debug "[GenerateDocuments] begin..."

$jobs = $this.files | ForEach-Object {
$fileTemplate = $this.template
$fileXml = $_
$fileDocument = [System.IO.Path]::Combine($this.outputDir, [System.IO.Path]::GetFileNameWithoutExtension($_) + ".xlsx")

Start-ThreadJob {
# 出力設定を引き継ぐ
$ConfirmPreference = $using:ConfirmPreference
$DebugPreference = $using:DebugPreference
$VerbosePreference = $using:VerbosePreference
$WarningPreference = $using:WarningPreference
$ErrorActionPreference = $using:ErrorActionPreference

$projectRoot = (Convert-Path "$PSScriptRoot\\..\\..\\..")
& (Join-Path -Path $using:PSScriptRoot -ChildPath '.\DocumentGenerator.ps1' -Resolve) -FileTemplate "$using:fileTemplate" -FileXml "$using:fileXml" -FileDocument "$using:fileDocument"
}
}

$generator = [DocumentGenerator]::new()
$generator.excel.Visible = $true
do {
Receive-Job -Job $jobs
} while ($null -eq (Wait-Job -Job $jobs -Timeout 1))
Receive-Job -Job $jobs

$generator.GenerateDocument("$projectRoot\\test.xml", "$projectRoot\\template\\test.xlsm")
Write-Debug "[GenerateDocuments] end."
}

}

$app = [GananApplication]::new()
$app.Test()
$app.GenerateDocuments()
41 changes: 22 additions & 19 deletions src/main/powershell/ja-JP/Messages.psd1
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
# culture="ja-JP"
ConvertFrom-StringData @'
E001001 = 制御文が正しく閉じられていません。
E002001 = 既にOpenされている制御文に重複したOpenは実行できません。
E002002 = 制御文の組み合わせが正しくありません。
E002003 = ネストしない制御文に対するCloseは無効です。
E002004 = ヘッダー/フッター行数が定義済みのブロック行数を超えています。
E002005 = ネストしない制御文に対する出力は無効です。
E002006 = コード制御文(codes)中に記述制御文(description)が未定義です。
E002007 = コード制御文(codes)中に代入式制御文(assignment)が未定義です。
E002008 = コード制御文(codes)中に条件制御文(condition)が未定義です。
W002001 = 拡張パラメーター値が不正なため、無視します。
E003001 = 行数が不正です。
E003002 = 既に出力が確定している行に対して、出力を開始できません。
E003003 = 既に開始されているトランザクション範囲外の行に対して、出力を開始できません。
E003004 = 既に出力が確定している行には操作できません。
E003005 = 出力指定行数が1未満です。
E004001 = 検索起点が不明です。
'@
# culture="ja-JP"
ConvertFrom-StringData @'
E001001 = 制御文が正しく閉じられていません。
E002001 = 既にOpenされている制御文に重複したOpenは実行できません。
E002002 = 制御文の組み合わせが正しくありません。
E002003 = ネストしない制御文に対するCloseは無効です。
E002004 = ヘッダー/フッター行数が定義済みのブロック行数を超えています。
E002005 = ネストしない制御文に対する出力は無効です。
E002006 = コード制御文(codes)中に記述制御文(description)が未定義です。
E002007 = コード制御文(codes)中に代入式制御文(assignment)が未定義です。
E002008 = コード制御文(codes)中に条件制御文(condition)が未定義です。
W002001 = 拡張パラメーター値が不正なため、無視します。
E003001 = 行数が不正です。
E003002 = 既に出力が確定している行に対して、出力を開始できません。
E003003 = 既に開始されているトランザクション範囲外の行に対して、出力を開始できません。
E003004 = 既に出力が確定している行には操作できません。
E003005 = 出力指定行数が1未満です。
E004001 = 検索起点が不明です。
E005001 = 指定されたテンプレートファイルがありません。
E005002 = 指定された出力先がディレクトリではありません。
E005003 = 指定されたパスはファイルやディレクトリではありません。
'@

0 comments on commit 4ba2735

Please sign in to comment.