作成可能なスタイルの上限

広告

スタイルはワークブックから作成していますが、一つのワークブックで作成可能なスタイルは上限が決まっています。その為、1つ1つスタイルを作成するのではなく、同じスタイルであれば再利用するようにプログラムする必要があります。

次のサンプルを見てください。

Sample14_1.java

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import java.io.*;

public class Sample14_1{
  public static void main(String[] args){
    Workbook wb = new HSSFWorkbook();
    Sheet sheet = wb.createSheet();

    for (int i = 0 ; i < 5000 ; i++){
      Row row = sheet.createRow(i);
      Cell cell = row.createCell(1);
      cell.setCellValue("Test");

      CellStyle style = wb.createCellStyle();
      style.setFillPattern(CellStyle.SOLID_FOREGROUND);
      style.setFillForegroundColor(IndexedColors.AQUA.getIndex());

      cell.setCellStyle(style);
    }

    FileOutputStream out = null;
    try{
      out = new FileOutputStream("sample14_1.xls");
      wb.write(out);
    }catch(IOException e){
      System.out.println(e.toString());
    }finally{
      try {
        out.close();
      }catch(IOException e){
        System.out.println(e.toString());
      }
    }
  }
}

この例では5000個のセルを作成し、各セルに対して新規に作成したスタイルを設定しています。このプログラムはコンパイルや実行する時点ではエラーとなりませんが、作成されたExcelファイルを開こうとすると次のようなエラーが表示されます。

作成可能なスタイルの上限

これはワークブックに作成可能なスタイルの上限を超えてしまったためです。下記のURLにこのエラーの解説があります。

Excel でエラー メッセージ "表示形式を追加できません" が表示される

作成したスタイルは複数のセルに対して設定することができますので、同じスタイルを適用する場合には都度新しいスタイルを作成するのではなく、一度作成したスタイルを繰り返し使うようにすることでこのエラーを回避できます。

では先ほどのサンプルを書き直してみます。

Sample14_2.java

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import java.io.*;

public class Sample14_2{
  public static void main(String[] args){
    Workbook wb = new HSSFWorkbook();
    Sheet sheet = wb.createSheet();

    CellStyle style = wb.createCellStyle();
    style.setFillPattern(CellStyle.SOLID_FOREGROUND);
    style.setFillForegroundColor(IndexedColors.AQUA.getIndex());

    for (int i = 0 ; i < 5000 ; i++){
      Row row = sheet.createRow(i);
      Cell cell = row.createCell(1);
      cell.setCellValue("Test");

      cell.setCellStyle(style);
    }

    FileOutputStream out = null;
    try{
      out = new FileOutputStream("sample14_2.xls");
      wb.write(out);
    }catch(IOException e){
      System.out.println(e.toString());
    }finally{
      try {
        out.close();
      }catch(IOException e){
        System.out.println(e.toString());
      }
    }
  }
}

今回のサンプルでは、1つだけ作成したスタイルを全てのセルに対して同じように設定していることです。ではプログラムを実行して作成されたExcelファイルを開いてみます。

作成可能なスタイルの上限

今度はエラーが発生せずに無事Excelファイルを開くことができました。また4,000を超えるセルに対してもスタイルが適用されています。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)