Excelファイルの読み込み

目的
Excelファイルを読み込みます。

ソリューション

ExcelファイルをWindowsクリップボードに書き込むJavaScript関数を使用します。 次に、CopyTextを使用してクリップボードを読み取ります。

別の方法があります。たとえば、Excelオートメーションを使用してJavaScriptで各セルの値を読み取り、各セルのGuiXT変数を入力します。 これは、一部のカラムや行のサブセットのみが必要な場合に適しています。ここで説明するソリューションはすべてのデータを読み取るのに比較的単純で高速なアプローチです。 また、Excelファイルごとに同じJavaScript関数を使用できるという利点もあります。

JavaScript関数excel_to_clipboard()

この関数は、基本的に次の3つの操作で構成されています。

// create Excel automation object
var XL = guixt.CreateObject(“Excel.Application”);

// open file
var wBook = XL.Workbooks.Open(path)

// write file to clipboard
wBook.ActiveSheet.UsedRange.Copy

以下の完全な関数では、エラー処理 “E: Excel file not found” を追加し、Excelファイルの最後に度々存在する空の行を削除します。 また、すべてのオブジェクトを正しく解放します。そうしないと、Excelインスタンスがバックグラウンドで実行され続けます。

 

function excel_to_clipboard(path) {

var XL = guixt.CreateObject(“Excel.Application”);

XL.Visible = false;

XL.DisplayAlerts = false;

 

var wBook = null;

 

try

{

wBook = XL.Workbooks.Open(path)

}

catch (e)

{

return “”;

}

 

// copy to clipboard

wBook.ActiveSheet.UsedRange.Copy;

 

// we remove empty rows via the “PasteSpecial” function

var tempSheet = XL.ActiveWorkbook.Sheets.Add;

tempSheet.UsedRange.PasteSpecial(null, null, true);

tempSheet.UsedRange.Copy;

tempSheet = null;

 

wBook.Close(false);

wBook = null;

XL.Quit;

XL = null;

 

return “X”;

 

}

 

サンプル例

以下のExcelファイルを読み取り、SAPGUIテーブルに表示します。

InputScriptは、1675行6列で構成されるデモファイルを読み取り、テーブルを作成するのにかかる時間は約1秒です。

GuiXT script

Pushbutton (toolbar) “Load operations” _

process=“load_operations.txt”

 

if V[opcount>0]

Table (2,2) (30,135) name=“operations” rows=“&V[opcount]” _

fixedcolumns=title=“Orders and Operations”

Column “Order” name=“aufnr” size=8

Column “Description” name=“ktext” size=40

Column “Operation” name=“vornr” size=8

Column “Short text” name=“ltxa1” size=40

Column “Workplace” name=“arbpl” size=10

Column “Syst.State” name=“sttxt” size=20

endif

 

Input script
CallJS found = excel_to_clipboard _
“C:\temp\operations.xlsx”

if not V[found]

return “E: Excel file not found” -statusline

endif

// read data from clipboard

CopyText toText=“tmp” -fromCLipboard

 

// we need a TAB character (Hexcode 09)

Set text[TAB] “X”

ReplaceText TAB from=“X” toHexCode=“09”

Set V[TAB] “&text[TAB]”

 

// clear all cell values and table status

Clear V[operations.*]

 

// row index

Set V[k] 1

 

label next_row

CopyText fromText=“tmp” toString=“s”  line=“&V[k]”

if Q[ok]

CopyText fromString=“s” toText=“cells”

 

// order number

CopyText fromText=“cells” line=1  _

toString=“operations.cell.aufnr.&V[k]” _

delimiter=“&V[TAB]”

// description

CopyText fromText=“cells” line=2  _
toString=“operations.cell.ktext.&V[k]” _
delimiter=“&V[TAB]”

// operation number
CopyText fromText=“cells” line=3 _
toString=“operations.cell.vornr.&V[k]”  _

delimiter=“&V[TAB]”

// operation text
CopyText fromText=“cells” line=4 _

toString=“operations.cell.ltxa1.&V[k]”  _
delimiter=“&V[TAB]”

// workplace
CopyText fromText=“cells” line=5 _
toString=“operations.cell.arbpl.&V[k]”  _
delimiter=“&V[TAB]”

// system status

CopyText fromText=“cells” line=6  _
toString=“operations.cell.sttxt.&V[k]” _
delimiter=“&V[TAB]”

// next row

Set V[k] &V[k] + 1

goto next_row

endif

Set V[opcount] &V[k] – 1

return “S: &V[opcount] operations loaded” -statusline

備考

InputScriptは、固定ファイル名を想定しています。 ユーザーにExcelファイルを選択させたい場合は、SelectFileを追加します。

現在のクリップボードのコンテンツを上書きしたくない場合は、InputScriptの開始時にクリップボードを保存し、最後にそのコンテンツを復元します。

CopyText toText=“clip” -fromClipboard
….
CopyText fromText=“clip” -toCLipboard