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]); } }
今回のソースコードと前回のソースコードで、エクセルファイルからデータを取り出し、エクセルに書き出せるはず。
次回は、エクセルファイルから取り出したデータから極大値を取り出す方法を書く予定。