POIで罫線を書く。Javaサンプルプログラムと、全ての罫線出力

ApachePOI

JavaでExcelの加工や出力をおこなう時は、Apache POIが便利です。
Apache POIは、セルへの文字列出力や塗り潰し色の設定が可能ですが、罫線の設定も可能です。


今回は、Apache POIで可能な罫線出力を、サンプルプログラムと同時に出力結果をふまえて紹介していきます。


セルの塗り潰し色設定方法については、以前の記事を参考にしてください。



環境情報


  • OS:Windows10
  • Java:Java1.8.0_60
  • Apache POI:poi 4.1.0

罫線を設定するサンプルプログラム


サンプルプログラムは以下になります。
ApachePOIで設定可能な全ての罫線を設定して出力しています。


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class PoiLine {

    public static void main(String[] args){
        System.out.print("start: main\r\n");

        Workbook tempbook = null;
        try {
            //--- テンプレートファイルをひらいて、シートを指定 --//
            Path tempPath = Paths.get("./template.xlsx");
            InputStream inSt = Files.newInputStream(tempPath);
            tempbook = new XSSFWorkbook(inSt);
            Sheet sheet = tempbook.getSheet("Sheet1");

            //--- B2セル 罫線なし ---//
            Row row = sheet.createRow(1);
            Cell cell = row.createCell(1);
            cell.setCellValue("罫線なし");
            CellStyle style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.NONE);
            cell.setCellStyle(style);

            //--- B4セル 長点線 ---//
            row = sheet.createRow(3);
            cell = row.createCell(1);
            cell.setCellValue("長点線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.DASH_DOT);
            cell.setCellStyle(style);

            //--- B6セル 長点点線 ---//
            row = sheet.createRow(5);
            cell = row.createCell(1);
            cell.setCellValue("長点点線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.DASH_DOT_DOT);
            cell.setCellStyle(style);

            //--- B8セル 破線 ---//
            row = sheet.createRow(7);
            cell = row.createCell(1);
            cell.setCellValue("破線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.DASHED);
            cell.setCellStyle(style);

            //--- B10セル 点線 ---//
            row = sheet.createRow(9);
            cell = row.createCell(1);
            cell.setCellValue("点線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.DOTTED);
            cell.setCellStyle(style);

            //--- B12セル 二重線 ---//
            row = sheet.createRow(11);
            cell = row.createCell(1);
            cell.setCellValue("二重線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.DOUBLE);
            cell.setCellStyle(style);

            //--- B14セル 中太線 ---//
            row = sheet.createRow(13);
            cell = row.createCell(1);
            cell.setCellValue("中太線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.MEDIUM);
            cell.setCellStyle(style);

            //--- B16セル 長点線(中太線) ---//
            row = sheet.createRow(15);
            cell = row.createCell(1);
            cell.setCellValue("長点線(中太線)");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.MEDIUM_DASH_DOT);
            cell.setCellStyle(style);

            //--- B18セル 長点点線(中太線) ---//
            row = sheet.createRow(17);
            cell = row.createCell(1);
            cell.setCellValue("長点点線(中太線)");
            style = tempbook.createCellStyle();
            style = setBorder(
                style, BorderStyle.MEDIUM_DASH_DOT_DOT);
            cell.setCellStyle(style);

            //--- B20セル 破線(中太線) ---//
            row = sheet.createRow(19);
            cell = row.createCell(1);
            cell.setCellValue("破線(中太線)");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.MEDIUM_DASHED);
            cell.setCellStyle(style);

            //--- B22セル 斜長点線 ---//
            row = sheet.createRow(21);
            cell = row.createCell(1);
            cell.setCellValue("斜長点線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.SLANTED_DASH_DOT);
            cell.setCellStyle(style);

            //--- B24セル 太線 ---//
            row = sheet.createRow(23);
            cell = row.createCell(1);
            cell.setCellValue("太線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.THICK);
            cell.setCellStyle(style);

            //--- B26セル 細線 ---//
            row = sheet.createRow(25);
            cell = row.createCell(1);
            cell.setCellValue("細線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.THIN);
            cell.setCellStyle(style);

            //--- B28セル 細点線 ---//
            row = sheet.createRow(27);
            cell = row.createCell(1);
            cell.setCellValue("細点線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.HAIR);
            cell.setCellStyle(style);

            //--- out.xlsxとしてファイル出力 --//
            Path outPath = Paths.get("./out.xlsx");
            OutputStream outSt = Files.newOutputStream(outPath);
            tempbook.write(outSt);
        } catch (IOException e) {
            System.out.print("入出力例外が発生!");
        } finally {
            //--- テンプレートをクローズ --//
            try {
                if (tempbook != null) {
                    tempbook.close();
                }
            } catch (IOException e) {
                System.out.print("終了処理で入出力例外が発生!");
            }
        }
        System.out.print("end: main\r\n");
    }

    // 
    // 罫線を設定する
    // 
    public static CellStyle setBorder(
        CellStyle cellStyle, BorderStyle kind) {
        cellStyle.setBorderLeft(kind);
        cellStyle.setBorderRight(kind);
        cellStyle.setBorderTop(kind); 
        cellStyle.setBorderBottom(kind); 
        return cellStyle;
    }
}

実際に罫線を設定している処理は、「setBorder」メソッドになります。
罫線は上下左右を別々にしか設定できないため、上下左右全ての罫線を指定された罫線種別に変更するメソッドを自作しています。


setBorderLeft() セル左の罫線を設定
setBorderRight() セル右の罫線を設定
setBorderTop() セル上の罫線を設定
setBorderBottom() セル下の罫線を設定

罫線の種類


ApachePOIでは、エクセルで設定可能な罫線を全て指定可能になります。
罫線の種類はBorderStyleクラスに定義されており、サンプルプログラムで全ての罫線設定を試しています。


NONE 罫線なし
DASH_DOT 長点線
DASH_DOT_DOT 長点点線
DASHED 破線
DOTTED 点線
DOUBLE 二重線
MEDIUM 中太線
MEDIUM_DASH_DOT 長点線(中太線)
MEDIUM_DASH_DOT_DOT 長点点線(中太線)
MEDIUM_DASHED 破線(中太線)
SLANTED_DASH_DOT 斜長点線
THICK 太線
THIN 細線
HAIR 細点線

実際にサンプルプログラムを出力した結果は以下になります。
全ての罫線が出力できています。



まとめ


ApachePOIを使用すれば、簡単にエクセル操作ができます。
今回紹介した罫線の設定も可能ですが、色の設定も可能となります。


まとめ
  • Javaでエクセルを操作するためには、Apache POIをつかうべき!
  • Apache POIを使えば、エクセルへの文字列出力だけではなく、罫線設定も簡単におこなうことができる


sakusaku

都内でSIerをやっています。 使用している技術は、Java、PHP、MySQL、PostgreSQL、Oracle、Apache、Tomcat、あたりです。 Pythonやってみたいです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください