質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

Q&A

解決済

1回答

1913閲覧

Powershell Excel操作 特定の列データを別列に加工コピーしたい

ekTJ

総合スコア109

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

0グッド

0クリップ

投稿2021/02/24 00:33

編集2021/02/24 00:45

特定の列のデータを、別列に加工した形でコピーしたい

powershellでOracleから取得したデータをA列に保存(Excel形式)しています。
その際、取得したデータを下記のようにA列の最終行までのデータをB列に【RHB=[A列同行のデータ]】のような形に加工し保存したいです

A     B
1 コード 情報
2 140017 RHB=140017
3 180020 RHB=180020
4 321654 RHB=321654

powershell初心者のため見よう見まねでここまでは何とか動作確認、作成できました。
どなたかお力お貸しください。宜しくお願い致します。

powershell

1※コード抜粋 2 #OracleConnectionオブジェクトの作成 3 $OraConn = New-Object System.Data.OracleClient.OracleConnection($ConnectionString) 4 5 #データセットの作成 6 $dtSet = New-Object System.Data.DataSet 7 8 #OracleDataAdapterクラスを使用して、データの取得 9 $oraDa = New-Object System.Data.OracleClient.OracleDataAdapter($strSQL, $OraConn) 10 11#ExcelWorkbookの作成 12 $workBook = new-object ClosedXML.Excel.XLWorkbook 13 #取得データをExcelに出力 14 [void]$workBook.Worksheets.Add($dtSet.Tables[0],"Sheet1") 15 16 #取得したデータをExcelに出力した後ここで加工すればいのでしょうか。 17 18 19 #Excelの保存 20 [void]$workBook.SaveAs($excelPath);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

(Closed XMLはC#でしか触ったことがないのですが同じはず…)

取得したデータをExcelに出力した後ここで加工すればいのでしょうか。

ここは合っています。

セルに書き込みを行う必要があります。
$workBook.Worksheets.Cell("B1").Value = "Hello world"

と記載すると、B1のセルにHello worldが挿入されます。この要領で、B1に数式を挿入します。

以下にすることで、B2セルに「140017」と入れられるでしょう。
$workBook.Worksheets.Cell("B2").FormulaA1 = "A2";

こんな感じでいけるんじゃないかと思っています。
$workBook.Worksheets.Cell("B2").FormulaA1 = "RHB="&A2

※ "はエスケープが必要かもしれません。

PowerShell

1$workBook = new-object ClosedXML.Excel.XLWorkbook 2#取得データをExcelに出力 3[void]$workBook.Worksheets.Add($dtSet.Tables[0],"Sheet1") 4 5$workBook.Worksheets.Cell("B2").FormulaA1 = "`"RHB`"=&A2" 6$workBook.Worksheets.Cell("B3").FormulaA1 = "`"RHB`"=&A3" 7$workBook.Worksheets.Cell("B4").FormulaA1 = "`"RHB`"=&A4" 8 9#Excelの保存 10[void]$workBook.SaveAs($excelPath);

こんな感じになりそう…

■追記
「1 140017」なのですね。

PowerShell

1"`"RHB`"&MID(A2,3,LEN(A2))"

(MID関数が使えるのかしら…)

投稿2021/02/24 01:27

編集2021/02/24 01:49
haihaikazuma

総合スコア181

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ekTJ

2021/02/24 01:47

haihaikazuma様ご回答ありがとうございます。 ちなみに行数が多くなった場合、自動的に最終行まで処理を行うには、 $Worksheet.2 To Cells(Rows.Count, "B").End(xlUp).Row = "`"RHB`"=&2 To Cells(Rows.Count, "B").End(xlUp).Row" などと記述すればよいのでしょうか。
haihaikazuma

2021/02/24 02:03

すいません、すぐにお答えしかねます。 やったことがありませんので不明ですが、ループで回すのが確実ではないかと思います。 Closed XMLを使う上での偏見ですが、バグが発生しやすいイメージがあるので、テーブルデータの取得とExcel書き込みが一貫なので、データ数分だけガリガリ書いていくのもありだと思っています。何件のデータなのか分かりませんが、そんなに書き込みは遅くない印象です。 こちらに関してはいろいろ試してみてください。基本的にはExcelのルールの話です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問