ブック作成サンプルコード











//
//	ARK X-TRAiN for Java サンプルプログラム
//
//	JavaプログラムからJNA(Java Native Interface)の機能でX-TRAiNの関数をCALLして、
//	エクセルブックを作成するサンプルです。
//
//	実行にはjna.jarが必要です。https://github.com/java-native-access/jna
//
//	出力先は定数BOOK_PATHでフルパス指定する必要があります。
//
//	コンパイル
//	# javac -cp jna.jar JNA_xtrain.java
//
//	実行
//	# java -classpath .;jna.jar JNA_xtrain
//
//	(c) ARKTRAN,INC.
//
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import java.util.Calendar;
import java.text.SimpleDateFormat;


class JNA_xtrain{

	public static final String BOOK_PATH = "C:\\TEMP\\Java_SAMPLE.xlsx";	// 出力ブックのパス

	public interface JxlsLib extends Library {

		// X-TRAiN
		JxlsLib INSTANCE = (JxlsLib) Native.loadLibrary(Platform.isWindows() ? "axls_api" : "axls_api", JxlsLib.class);

		// X-TRAiN java用関数
		String	open_book();
		int	open_sheet(String book, String sheet);
		int	put_cell(String book, String cell, String value);
		int	put_values(String book, String values);
		String	cell_name(String book, int row, int column);
		String	cell_range(String book, int row1, int column1, int row2, int column2);
		int	save_book(String book);
		int	scrap_book(String book);
		int	error_code(String book);
		String	error_mesg(String book);
	}

	public static void main(String[] args){
		int	rc;
		JxlsLib JXLS = JxlsLib.INSTANCE;

		// 開始ログ出力
		Calendar c = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E曜日");
        sdf.applyPattern("yyyy/MM/dd HH:mm:ss SSS");
        System.out.printf("処理開始  %s\n", sdf.format(c.getTime()));

		// Excelブックオープン
		// 戻り値にブック用構造体アドレスが文字列として返されますので、以降の処理で使用します。
		// 処理を終了する際は、save_book関数(保存して正常終了)またはscrap_book関数(メモリ破棄)をCALLする必要があります。
		// scrap_book関数をCALLしない場合はメモリリークが起こります
		String book = JXLS.open_book();
		if (book == null || book.length() == 0){
			System.out.printf("ERROR:JXLS.open_book()");
			System.exit(-1);
		}

		// シートオープン
		String arguments = "SHEET_NAME=Javaサンプル MODE=CREATE";
		if (JXLS.open_sheet(book, arguments) != 0){
			String error_mesg = JXLS.error_mesg(book);
			JXLS.scrap_book(book);
			System.out.println(error_mesg);

			System.exit(-1);
		}

		// ブック名設定
		// 値や属性の設定はput_values関数に、項目=項目値 の形式の引数で指定します。
		// 空白またはタブで区切り、複数指定することができます。
		arguments = "BOOK=" + BOOK_PATH;
		rc = JXLS.put_values(book, arguments);
		if (rc != 0){
			String error_mesg = JXLS.error_mesg(book);
			JXLS.scrap_book(book);
			System.out.printf("ERROR:JXLS.put_values() rc=%d %s\n", rc, error_mesg);

			System.exit(-1);
		}

		// 列幅設定
		arguments = "B.幅=20 C.幅=20 D.幅=20 E.幅=20";
		rc = JXLS.put_values(book, arguments);
		if (rc != 0){
			String error_mesg = JXLS.error_mesg(book);
			JXLS.scrap_book(book);
			System.out.printf("ERROR:JXLS.open_book() rc=%d %s\n", rc, error_mesg);

			System.exit(-1);
		}

        sdf.applyPattern("yyyy/MM/dd");
        String now_date = sdf.format(c.getTime());

		int line_ct = 0;
		int max_row = 1000;

		// 行数繰り返し
		for (int row=1; row<=max_row; row++){

			// A〜E列に数値、文字、日付を設定
			int column = 1;
			String cell1 = JXLS.cell_name(book, row, 1);
			String cell2 = JXLS.cell_name(book, row, 2);
			String cell3 = JXLS.cell_name(book, row, 3);
			String cell4 = JXLS.cell_name(book, row, 4);
			String cell5 = JXLS.cell_name(book, row, 5);
			line_ct++;

			arguments = cell1 + "=" + row + " " + cell2 + "=日本語文字列" + row + " " + cell2 + ".フォント.色=赤 " + cell3 + "=" + now_date + " " + cell3 + ".書式=和暦 " + cell4 + "=ABCDEFG " + cell4 + ".フォント.名=\"Arial Black\" " + cell5 + "=12345 " + cell5 + ".書式=漢数字";
			rc = JXLS.put_values(book, arguments);
			if (rc != 0){
				String error_mesg = JXLS.error_mesg(book);
				JXLS.scrap_book(book);
				System.out.printf("ERROR:JXLS.put_values() rc=%d %s\n", rc, error_mesg);

				System.exit(-1);
			}

			// 偶数行を塗りつぶす
			if (line_ct % 2 == 0){

				String range = JXLS.cell_range(book, row, 1, row, 5);
				arguments = range + ".塗りつぶし.色=#CCCCCC";

				rc = JXLS.put_values(book, arguments);
				if (rc != 0){
					String error_mesg = JXLS.error_mesg(book);
					JXLS.scrap_book(book);
					System.out.printf("ERROR:JXLS.put_values() rc=%d %s\n", rc, error_mesg);

					System.exit(-1);
				}
			}
		}

		// 表全体に罫線を付ける
		String range = JXLS.cell_range(book, 1, 1, max_row, 5);
		arguments = range + ".罫線=実線";

		rc = JXLS.put_values(book, arguments);
		if (rc != 0){
			String error_mesg = JXLS.error_mesg(book);
			JXLS.scrap_book(book);
			System.out.printf("ERROR:JXLS.put_values() rc=%d %s\n", rc, error_mesg);

			System.exit(-1);
		}

		// Excelブック保存
		rc = JXLS.save_book(book);
		if (rc != 0){
			String error_mesg = JXLS.error_mesg(book);
			JXLS.scrap_book(book);
			System.out.printf("ERROR:JXLS.save_book() rc=%d %s\n", rc, error_mesg);

			System.exit(-1);
		}

		// 終了ログ出力
		c = Calendar.getInstance();
        sdf = new SimpleDateFormat("yyyy年MM月dd日 E曜日");
        sdf.applyPattern("yyyy/MM/dd HH:mm:ss SSS");
        System.out.printf("処理終了  %s\n", sdf.format(c.getTime()));
        System.out.printf("Excelブック%sを出力しました。\n", BOOK_PATH);
	}
}
	


解説
ライブラリの宣言

        // X-TRAiN
        JxlsLib INSTANCE = (JxlsLib) Native.loadLibrary(Platform.isWindows() ? "axls_api" : "axls_api", JxlsLib.class);
 
        // X-TRAiN java用関数
        String  open_book();
        int open_sheet(String book, String sheet);
        int put_cell(String book, String cell, String value);
        int put_values(String book, String values);
        String  cell_name(String book, int row, int column);
        String  cell_range(String book, int row1, int column1, int row2, int column2);
        int save_book(String book);
        int scrap_book(String book);
        int error_code(String book);
        String  error_mesg(String book);
    }
 


	
X-TRAiNのDLL/共有ライブラリをロードして、使用する関数を宣言します。

ブックオブジェクトの作成

        // Excelブックオープン
        // 戻り値にブック用構造体アドレスが文字列として返されますので、以降の処理で使用します。
        // 処理を終了する際は、save_book関数(保存して正常終了)またはscrap_book関数(メモリ破棄)をCALLする必要があります。
        // scrap_book関数をCALLしない場合はメモリリークが起こります
        String book = JXLS.open_book();
        if (book == null || book.length() == 0){
            System.out.printf("ERROR:JXLS.open_book()");
            System.exit(-1);
        }

	
open_book関数を使い、ブックオブジェクトを生成します。
オブジェクトの実体は、DLL/共有ライブラリ内に確保された、X-TRAiN用構造体の アドレスを16進数に変換した文字列です。
以降の関数呼び出し時には、この値を使用します。
処理の終了時にはsave_book関数またはscrap_book関数でメモリを 解放する必要があります。
メモリを確保せきなかった場合は戻り値としてNULLが返却されますので、エラー処理では X-TRAiNの関数を呼び出さないでください。

値/属性の設定



        // 列幅設定
        arguments = "B.幅=20 C.幅=20 D.幅=20 E.幅=20";
        rc = JXLS.put_values(book, arguments);
        if (rc != 0){
            String error_mesg = JXLS.error_mesg(book);
            JXLS.scrap_book(book);
            System.out.printf("ERROR:JXLS.open_book() rc=%d %s\n", rc, error_mesg);
 
            System.exit(-1);
        }


	
put_values関数を使い、ブック名やシート名、セルの値、各種書式の設定を行います。
設定はセル名=値 または 属性名=値 の様な文字列を羅列した形式で行います。
使用できる属性の詳細は、マニュアルを参照してください。
エラーが発生した場合は、戻り値として0以外が返却されます。
error_mesg関数でエラーメッセージを取得することができます。
異常終了する場合は、scrap_book関数でメモリの解放を行ってください。

ブックの保存


        // Excelブック保存
        rc = JXLS.save_book(book);
        if (rc != 0){
            String error_mesg = JXLS.error_mesg(book);
            JXLS.scrap_book(book);
            System.out.printf("ERROR:JXLS.save_book() rc=%d %s\n", rc, error_mesg);
 
            System.exit(-1);
        }

	
save_book関数を使い、ブックの保存を行います。
ブック名を指定していない場合は、「Book1.xlsx」で保存しますが、パスはPHPの ディレクトリ下になってしまう事に注意してください。
保存が正常終了するとブックオブジェクトは解放されますので、以降は X-TRAiNの関数を呼び出さないでください。