PowerShellとLibreOffice Drawで請求書作成
17536 ワード
LibreOffice AdventCalendar 2018 25日目
請求書を作ります。
請求書は業務システムでは最も一般的な帳票です。
一番の難関はページングです。
以下の条件で作ります。
- 6行明細の請求書に9行の売上。
- 請求書は2枚出力。
- 2枚目の最後の行には請求合計を出力
ソースは下記のGitHubにあります。
環境
- Windows10 Pro
- PowerShell
- LibreOffice Draw
- Flat ODT(fodg)
作成開始
では作成していきます。
Templateを作成
Dataを作成
- data.csvを作成
- headerは salesno,customer,supplier,item,subtotal
- 売上の内容をゴリゴリ書いていきます。
下記な感じになります。
salesno | customer | supplier | item | subtotal |
---|---|---|---|---|
1 | You | Amazon | Nintendo Switch1 | 100 |
1 | You | Amazon | Nintendo Switch2 | 200 |
1 | You | Amazon | Nintendo Switch3 | 300 |
1 | You | Amazon | Nintendo Switch4 | 400 |
1 | You | Amazon | Nintendo Switch5 | 500 |
1 | You | Amazon | Nintendo Switch6 | 600 |
1 | You | Amazon | Nintendo Switch7 | 700 |
1 | You | Amazon | Nintendo Switch8 | 800 |
1 | You | Amazon | Nintendo Switch9 | 900 |
帳票作成シェル
makeinvoice.ps1 を作成します。
詳しくはソースを見て下さい。
ざっくりした説明をすると
- dataを読込
- templateを読込
- templateの{salesno}等を該当するデータに書換
- 6行目になったら請求書を出力
- 以下繰り返し
- 最後のあまりを請求書に出力
- 最後の請求書に合計を出力
となります。
makeinvoice.ps1
# load data
$data=Import-Csv -Path .\data.csv -Encoding UTF8
# load template
$temp=Get-Content .\invoice.fodg -Encoding UTF8
# cnt row in report
$i=1
# reportrows
$rprow=6
# total row count
$rc=0
# page
$p=0
# total page
$tp=$data.Count/$rprow
$tp=[Math]::Ceiling($tp)
# calcurate total
$sum=$data | Measure-Object 'subtotal' -sum
foreach($d in $data){
# merge template
$temp=$temp -replace '{salesno}',$d.salesno
$temp=$temp -replace '{customer}',$d.customer
$temp=$temp -replace '{supplier}',$d.supplier
$temp=$temp -replace "{item$i}",$d.item
$temp=$temp -replace "{subtotal$i}",$d.subtotal
# rowcount
$rc=$rc+1
# report end write build report
if($i%$rprow -eq 0){
# Write-Output "行"$rc
# Write-Output "data数"$data.Count
# Page Count
$p=$p+1
# write total
if($rc -eq $data.Count){
$temp=$temp -replace '{total}',$sum.Sum
}
# add Page No
$temp=$temp -replace '{page}',"$p"
# add Total Page
$temp=$temp -replace '{total page}',"$tp"
# delete {}
$temp=$temp -replace "{(.*)}",""
# output name
$date=Get-Date -Format yyyyMMddhhmmss
$file="output\"+$date+$p
# output newfile
$temp | out-file -FilePath $file'.fodg' -Encoding utf8
$i=$i-$rprow
# load template
$temp=Get-Content .\invoice.fodg -Encoding UTF8
}
# report in row
$i=$i+1
}
# output remainder data to report
if($data.Count%$rprow -ne 0){
$p=$p+1
$file="output\"+$date+$p
# write total
$temp=$temp -replace '{total}',$sum.Sum
$temp=$temp -replace '{page}',"$p"
$temp=$temp -replace '{total page}',"$tp"
# delete {}
$temp=$temp -replace "{(.*)}",""
#output report
$temp | out-file -FilePath $file'.fodg' -Encoding utf8
}
印刷
print.ps1
下記の動作をしてくれます。
- outputに出力された請求書を標準プリンターに印刷
- 印刷後削除
print.ps1
# Get report list to print
$outputs=(Get-ChildItem output\*.fodg)
foreach($invoice in $outputs){
# Print to Default Printer
Start-Process $invoice -Verb Print | Stop-Process
# After print and Delete
Remove-Item $invoice
}
最後に
夢のDrawで帳票ができてしまいました。
- エンドユーザーが帳票を設計できる
- OSSで導入が低コスト
結構いけるんじゃないでしょうか?
メリー、クリスマス!
Author And Source
この問題について(PowerShellとLibreOffice Drawで請求書作成), 我々は、より多くの情報をここで見つけました https://qiita.com/arachan@github/items/bcb73be7d28aa92f1112著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .