生物屋さんのためのゼロからのプログラミング

―忘れないための覚書 (たま~に更新)―

Apache POIを使って、エクセルにデータを書き出す。

ここでは、2次元配列を作成しエクセルに書き出す方法を書く
エクセルファイルの保存には保存ダイアログを使用し、“名前を付けて保存”が出来るようにした。
プログラミングの全体は下記のような感じ。

public class Export extends JFrame implements ActionListener {
	Random rand = new Random();
	int ColSize = 5;
	int RowSize = 20;
	int [][] data = null;

	//データの作成
	public int [][] makeData (int ColSize, int RowSize) {
		data = new int [ColSize][RowSize];
		for (int i = 0; i < ColSize; i ++) {
			for (int j = 0; j < RowSize; j++) {
				data [i][j] = rand.nextInt(100);
			}
		}
		return data;
	}

	//作成したデータの確認
	public void showData (int ColSize, int RowSize) {
		for (int i = 0; i < ColSize; i++) {
			for (int j = 0; j < RowSize; j++) {
				System.out.print(data[i][j] + " ");
			}
			System.out.println();
		}
	}

    //出力ファイルの名前書き
    String writefile() {
        FileDialog fd = new FileDialog(new Frame(), "保存 (末尾に 「.xlsx」を付けて下さい)", FileDialog.SAVE);
        fd.setVisible(true);
        String fullpath = fd.getDirectory() + fd.getFile();
        fd.dispose();
        return fullpath;
    }

    //Dataのエクセルへの保存
    public void SaveData (int ColSize, int RowSize) {
        try {
            FileOutputStream fo = new FileOutputStream(this.writefile());
            XSSFWorkbook bookR = new XSSFWorkbook();
            XSSFSheet sheetR = bookR.createSheet("コピー");
            XSSFRow rowR = sheetR.createRow((short)0);
            XSSFCell cellR;

            //エクセル上でのデータ出力用の行とセルの作成
            for (int i = 0; i < RowSize; i++) {
                rowR = sheetR.createRow((short)i);
                for (int j = 0; j < ColSize; j++) {
                    rowR.createCell((short)j);
                }
            }

            //数値をエクセルへの書き込み
            for (int i = 0; i < ColSize; i++) {
                for (int j = 0; j < RowSize; j++) {
                    rowR = sheetR.getRow(j);
                    cellR = rowR.getCell(i);
                    cellR.setCellValue(data[i][j]);
                }
            }

            bookR.write(fo);
            fo.close();

        } catch (Exception e) {
            System.out.println("保存に失敗しました");
        }
    }

    //ボタンが押された時のイベント
	public void actionPerformed(ActionEvent e) {
		String cmd = e.getActionCommand();
		if (cmd.equals("button")) {
			makeData(ColSize, RowSize);
			showData(ColSize, RowSize);
			SaveData(ColSize, RowSize);
		}
	}

	//JFrameの作成
	Export (String title) {
		setTitle(title);
		setSize(120, 100);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JButton button = new JButton("Save");
		button.addActionListener(this);
		button.setActionCommand("button");

		JPanel pane = new JPanel();
		pane.add(button);
		getContentPane().add(pane, BorderLayout.CENTER);
	}

	public static void main(String[] args) {
		Export frame = new Export ("Export");
		frame.setVisible(true);
	}
}

二次元配列はRandomメソッドで作成した。前の記事で書いたように、本来はエクセルから取得したデータを想定している。

ダイアログを利用したエクセルファイルへのデータの保存は下記の通り。

    //出力ファイルの名前書き
    String writefile() {
        FileDialog fd = new FileDialog(new Frame(), "保存 (末尾に 「.xlsx」を付けて下さい)", FileDialog.SAVE);
        fd.setVisible(true);
        String fullpath = fd.getDirectory() + fd.getFile();
        fd.dispose();
        return fullpath;
    }

    //Dataのエクセルへの保存
    public void SaveData (int ColSize, int RowSize) {
        try {
            FileOutputStream fo = new FileOutputStream(this.writefile());
            XSSFWorkbook bookR = new XSSFWorkbook();
            XSSFSheet sheetR = bookR.createSheet("コピー");
            XSSFRow rowR = sheetR.createRow((short)0);
            XSSFCell cellR;

前回の記事では、filterを用いて開くファイルの拡張子を限定していたが、保存時のfilter設定が不明なため、拡張子は自ら付ける必要がある。

また、エクセル上にデータを書き込む場合は、あらかじめセルを作成する必要があるため、本コードでは下記のようにエクセル上にセルを作成した。

            //エクセル上でのデータ出力用の行とセルの作成
            for (int i = 0; i < RowSize; i++) {
                rowR = sheetR.createRow((short)i);
                for (int j = 0; j < ColSize; j++) {
                    rowR.createCell((short)j);
                }
            }

エクセルへのデータの書き出しでは、行とセルの扱いが難しいが、下記のコードで上手くいった。

            //数値をエクセルへの書き込み
            for (int i = 0; i < ColSize; i++) {
                for (int j = 0; j < RowSize; j++) {
                    rowR = sheetR.getRow(j);
                    cellR = rowR.getCell(i);
                    cellR.setCellValue(data[i][j]);
                }
            }

今回のソースコードと前回のソースコードで、エクセルファイルからデータを取り出し、エクセルに書き出せるはず。
次回は、エクセルファイルから取り出したデータから極大値を取り出す方法を書く予定。