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

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

エクセルからデータを読み込み、Peakを検出しエクセルに出力する

生化学実験において蛍光顕微鏡を用いた 生細胞イメージングは重要な実験となっている。ここでは、最終的に遺伝子コード型カルシウムセンサー(GECI)やFura2などの蛍光カルシウムセンサーを用いた実験結果等から、Peakを検出し解析するためのプログラミングをJavaで書くソースコードが長いため、いくつかのパートに分けて掲載する。(但し、本プログラミングにより得られた結果については責任を負いかねるため、自己責任でご利用ください。また、プログラミング初心者のため、ソースコードは非常に読みにくいです。)

(注:JFreeChartとApache POIをインストールしたJava Projectで作成すること。)

まずは、エクセルからのデータの取得
ここでは、JFrame上の"Open"ボタンを押すことでエクセルファイルを選び、エクセル内のデータを取り出し、JFrame上の"Save"ボタンを押すことで取得したデータをコンソールに書き出すプログラムを示す。(importは冗長になるために省いた。)
エクセルファイルのデータ取得にはApache POIを使用し、ファイルの選択はJFileChooserのshowOpenDialogで行えるようにした。

public class ExcelOpen2 extends JFrame implements ActionListener  {

	int ColSize;
	int RowSize;
	int data [][] = null;

    //エクセルからのデータの読み込みおよび解析
    public void InputData () {

        //解析するエクセルの選択
        JFileChooser filechooser = new JFileChooser();
        filechooser.setAcceptAllFileFilterUsed(false);
        FileNameExtensionFilter filter = new FileNameExtensionFilter("エクセルファイル", "xlsx");
        filechooser.addChoosableFileFilter(filter);
        int selected = filechooser.showOpenDialog(this);
        if (selected == JFileChooser.APPROVE_OPTION) {
            File file = filechooser.getSelectedFile();

            try {
                //エクセルファイルを開く
                FileInputStream infile = new FileInputStream(file);
                XSSFWorkbook fileEx = new XSSFWorkbook(infile);
                XSSFSheet sheet = fileEx.getSheetAt(0);
                XSSFRow row = sheet.getRow(0);
                XSSFCell cell;

                //エクセルファイルのデータ数の取得
                ColSize = row.getLastCellNum(); //列数
                RowSize = sheet.getLastRowNum () + 1; //行数

                //エクセルデータを入れるための配列作成
                data = new int [ColSize][RowSize];

                //エクセルデータの取得
                for (int i = 0; i < ColSize; i++) {
                    for (int j = 0; j < RowSize; j++) {
                        cell = sheet.getRow(j).getCell((short)i);
                        data [i][j] = (int)cell.getNumericCellValue();
                    }
                }
            } catch (IOException ex) {
            System.out.println("処理が失敗しました");
        }
        }
    }

  //取得したデータの書き出し
    public void OutputData (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();
    	}
    }

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

    //JFrameの設定
	ExcelOpen2 (String title) {
		setTitle(title);
		setSize(180, 120);
		setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

		JButton button1 = new JButton("Open");
		JButton button2 = new JButton("Close");
		button1.addActionListener (this);
		button2.addActionListener(this);
		button1.setActionCommand("button1");
		button2.setActionCommand("button2");

		JPanel pane1 = new JPanel();
		JPanel pane2 = new JPanel();
		pane1.add(button1);
		pane2.add(button2);
		getContentPane().add(pane1, BorderLayout.CENTER);
		getContentPane().add(pane2, BorderLayout.SOUTH);
	}

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		ExcelOpen2 frame = new ExcelOpen2 ("Test");
		frame.setVisible(true);
	}
}

f:id:Aki-Miya:20150201194652p:plain

このプログラミングでは、上記エクセルファイルのように、各列に個々の細胞またはROIのデータが並んだエクセルファイルを想定している。

また、このプログラミングでは、拡張子が".xlsx"のエクセルファイルを取り扱っている。拡張子が".xls"のエクセルファイルを用いる場合は、"XSSF"を全て"HSSF"に変えることで扱えるようになる。
また、"xlsx"のエクセルのみを選択させるために、

FileNameExtensionFilter filter = new FileNameExtensionFilter("エクセルファイル", "xlsx");
filechooser.addChoosableFileFilter(filter);

上記の部分で、ダイアログ上の「全てのファイル」の項目をなくし、"xlsx"ファイルのみが表示されるようにした。

エクセルファイルにあるデータを調べるために下記を使った。

//エクセルファイルのデータ数の取得
ColSize = row.getLastCellNum();   //列数
RowSize = sheet.getLastRowNum () + 1;   //行数

(おそらく他の簡単な方法があると思う)

エクセルのデータの取得を確認するために、今回は"System.out.print"で書き出した。次回、エクセルに書き出すためのコードを書く。