BLOG main image
정민군's Blog
miniya devlog

'Language'에 해당되는 글 16건

  1. 2007.05.28 AUTOBOXING
  2. 2007.04.22 Object 태그 정리
  3. 2007.04.12 Busy Developers' Guide to HSSF Features 1

AUTOBOXING

Language/Java 2007. 5. 28. 13:07 by 정민군
AUTOBOXING 소개
Java 프로그래밍 언어는 객체지향적 언어이긴 하지만 원시 타입으로 작업을 해야 할 경우가 종종 있다. J2SE 5.0 이전에는 원시 타입으로 작업할 경우 원시 타입과 래퍼 클래스(wrapper class)간에 형변환 작업을 반복해야 했다. 이번 테크팁에서는, J2SE 5.0의 새로운 기능인 오토박싱(autoboxing)을 이용해 형변환--이를 테면, int 타입의 값과 Integer 타입의 값 사이에--을 처리하는 방법에 대해 알아보도록 하자.

2004년 10월 5일자 테크 팁, 새로운 포매터로 출력물 포맷하기에서는 C 언어의 printf()와 유사한 출력 포맷을 만드는 새로운 방법에 대해 다루었다. 이 테크팁의 예제에서는 printf() 메소드를 integral 값을 출력하기 위해 사용하였다. 다음은 printf() 메소드를 이용한 간단한 예제이다.

   public class FormatPrint {
     public static void main(String[] args) {
       System.out.printf("There is only %d thing.", 1);
     }
   }

FormatPrint 예제에서 printf() 메소드의 용법은 다음과 같다:

   printf(String format, Object... args)

숫자 1은 원시 타입이고 오브젝트가 아니므로, 아래 라인

   System.out.printf("There is only %d thing.", 1);

은 컴파일 되지 않는다고 생각할 것이다. 그러나 오토박싱은 적절한 래퍼 오브젝트에 있는 integer 값으로 자동 래핑하여 상황을 인식한다. J2SE 1.4에서는 new Integer(1)과 같은 식을 이용해 원시값을 수동으로 래핑해야 할 필요가 있다.

원시 타입으로부터 자동 변환이 유용한 또 다른 경우는 콜렉션 API를 사용하는 경우인데, 콜렉션 클래스는 오브젝트를 저장하기 위해 만들어졌다. 다음은 ArrayList에서 0에서 9까지의 int값을 저장하는 간단한 예제이다.

   import java.util.ArrayList;

    public class Autoboxing {
      public static void main(String[] args) {
          ArrayList<Integer> list = new ArrayList<Integer>();
          for(int i = 0; i < 10; i++){
             list.add(i);
          }
      }
    }

J2SE 1.4.2의 경우의 비교할 수 있는 프로그램은 다음과 같다:

   import java.util.ArrayList;

   public class ManualBoxing {
     public static void main(String[] args) {
        ArrayList list = new ArrayList();
        for(int i = 0; i < 10; i++){
            list.add(new Integer(i));
        }
     }
   }

ManualBoxing을 이용하는 경우에는 list.add(new Integer(i))를 사용하여 Integer 오브젝트를 명시적으로 생성해야 한다. 오토박싱을 이용할 경우와는 달리 int i는 list.add(i) 라인에서 Integer 오브젝트로 오토박싱 되었다.

오토박싱은 J2SE 5.0의 다른 새로운 기능들과 함께 잘 동작한다. 예를 들면, 오토박싱 기능을 통해 제네릭 타입과 원시 타입을 결함 없이 통합할 수 있다. ManualBoxing 예제에서, ArrayList의 엘리먼트(element)는 Object 타입인데 비해 오토박싱 예제에서의 리스트 타입은 Integer이다. (제네릭에 대한 상세 정보는 제너릭 테크 팁을 참조하기 바란다.)

오토박싱 예제를 ArrayList의 전체 엘리먼트를 순환하며 이들의 합을 구하는 경우로 확장보자. 이번 새 버전에서는 엘리먼트 순환을 위해 역시 J2SE 5.0 루프 강화(enhanced for loop)가 사용된다는 점에 유의하기 바란다.

   import java.util.ArrayList;
  
     public class Autoboxing {
       public static void main(String[] args) {
           ArrayList<Integer> list = new ArrayList<Integer>();
           for(int i = 0; i < 10; i++){
              list.add(i);
           }
           int sum = 0;
          for ( Integer j : list){
            sum += j;
          }
         System.out.printf("The sum is %d.", sum );
       }
     }

오토박싱은 새로운 오토박싱 예제에서 자주 사용되었다. 우선 ints는 ArrayList에 추가될 때 Integers로 박싱되었다가, 그 합을 계산할 때에는 int로 언박싱 되며(unboxed), 결국 합을 표현하는 ints는 printf()문에서 사용될 때 다시 박싱된다.

박싱(boxing)과 언박싱(unboxing)이 명확하기 때문에 오토박싱은 매우 유용하다. 그러나 오토박싱 기능을 사용하려면 상당한 주의가 필요하다. 특히, 오토박싱으로 생성된 오브젝트의 동등성(equality)에 대한 테스트는 오토박싱으로 생성되지 않은 오브젝트에 대한 동등성 테스트와는 다르다. 이것을 알아보기 위해, 다음의 BoxingEquality 클래스를 살펴보기로 하자.

   import java.util.ArrayList;
  
     public class BoxingEquality {
       public static void main(String[] args) {
          int i = 2;
          int j = 2;
          ArrayList <Integer> list = new ArrayList<Integer>();
          list.add(i);
          list.add(j);
          System.out.printf("It is %b that i ==j.\n",
                            (i==j)); //(1)
          System.out.printf("It is %b that " +
                            "list.get(0) == list.get(1).\n",
                            list.get(0)==list.get(1)); //(2)
          System.out.printf("It is %b that " +
                         "list.get(0).equals(list.get(1)).",
                         list.get(0).equals(list.get(1))); //(3)
        }
     }

BoxingEquality의 첫 번째 print문은 원시값 i와 j가 같은지를 비교하자. 두 번째 print문은 오토박싱 i와 j에 의해 생성된 오브젝트가 동일한지를 비교하고, 세 번째 print문은 오토박싱 i와 j에 의해 생성된 오브젝트의 값을 비교한다. 첫 번째와 세 번째 print문이 참을 리턴한다고 볼 수 있지만, 두 번째는 어떻게 될까요? BoxingEquality 프로그램 실행시 출력은 다음과 같다.

   It is true that i ==j.
   It is true that list.get(0) == list.get(1).
   It is true that list.get(0).equals(list.get(1)).

이제 i와 j의 값을 2000으로 바꾸어 보자.

   import java.util.ArrayList;

   public class BoxingEquality {
     public static void main(String[] args) {
       int i = 2000;
       int j = 2000;
       // . . .
   }

저장하고 컴파일 한 다음, BoxingEquality를 실행한다. 이 경우 결과는 달리 나타난다.

   It is true that i ==j.
   It is false that list.get(0) == list.get(1).
   It is true that list.get(0).equals(list.get(1)).

원시값은 동일하고 박싱된 int 값도 동일하다. 그러나 이 경우 각각의 int 값은 서로 다른 오브젝트를 가리키고 있다. 작은 정수값의 경우에는 오브젝트가 String과 매우 유사하게 하나의 풀(pool)에 캐시(cache)된다. i와 j가 2일 경우에는 하나의 오브젝트가 2개의 서로 다른 위치에서 참조되고, i와 j가 2000인 경우에는 각기 다른 두 개의 오브젝트가 참조된다. 오토박싱은 [-128, 127] 범위에 있는 정수값의 경우 같은 오브젝트의 리턴을 보장하지만, 구현에 따라 그 범위 밖의 임의의 값을 캐시할 수도 있다. 코드에서 이 캐시값에 의존하는 것은 바람직하지 않다.

사실상, ==를 사용하여 오브젝트 동등성을 테스트하면 원래 의도했던 것과 다른 결과와 나오는 것은 당연하다. 컴파일러가 원시값과 오브젝트 사이를 오가기 쉽게 할 경우, 사용자는 이들 중 어느 것을 다루고 있는지 놓치는 경우가 발생할 수 있다. 따라서 이번 테크팁에서는 이와 같이 주의를 요하는 예제를 함께 다루고 있다.

Object 태그 정리

Language/DHTML 2007. 4. 22. 21:45 by 정민군

# 미디어 플레이어 객체 제어하기
 * 조절메서드
  - Pause() : 일시정지합니다.
  - Play() : 재생합니다.
  - Stop() : 중지합니다.
  - Next() : 다음으로 이동합니다.
  - Previous() : 이전으로 이동합니다.
 * PlayState속성 - 재생, 중지, 일시정지 중인지의 상태를 알아냅니다.
  -- mpStopped : [0] 재생이 중지된 상태
  -- mpPaused : [1] 재생이 일시정지된 상태
  -- mpPlaying : [2] 재생중인 상태
  -- mpWaiting : [3] 시작하기 위해서 기다리는 상태
  -- mpScanForward : [4] 재생흐름을 다음으로 이동
  -- mpScanReverse : [5] 재생흐름을 이전으로 이동
  -- mpSkipForward : [6] 다음 단계로 이동
  -- mpSkipReverse : [7] 이전 단계로 이동
  -- mpClosed : [8] 재생닫혀있는 상태
 * DisplaySize속성 - 화면크기를 조절합니다.
  -- mpDefaultSize : [0] 기본크기
  -- mpHalfSize : [1] 기본크기에서 1/2크기
  -- mpDoubleSize : [2] 기본크기에서 두배로 확대한 크기
  -- mpFullScreen : [3] 화면 전체크키
  -- mpFitToSize : [4] 사용자가 디자인한 크기
  -- mpOneSixteenScreen : [5] 전체화면의 1/16크기
  -- mpOneFourthScreen : [6] 전체화면의 1/4크키
  -- mpOneHalfScreen : [7] 전체화면의 1/2크기
 * Mute속성 - 소리를 끄거나 켜기위해 사용됩니다.
   Boolean값이 True이면 소리가 꺼진 상태이고 False이면 소리가 켜진 상태입니다.
 
# 윈도우 미디어플레이어 속성
AllowChangedDisplayMode 초단위, 프레임 단위로 최종 사용자가 디스플레이 모드를 실행시 변경할 수 있는지를 나타낸다.
AllowHideControls 최종 사용자가 컨트롤 패널을 실행시 감출 수 있는지를 나타낸다.
AllowHideDisplay 최종 사용자가 디스필레이를 실행시 감출 수 있는지를 나타낸다.
Apperance 디스플레이 패널의 경계의 모양을 지정한다. 1=inset border 패인모양, 0=무경계
AutoRewind 파일의 재생이 끝났을 때 자동으로 되감기를 할 것인지를 표시한다.
AutoStart 웹페이지를 열면 자동으로 재생을 시작할 것인지를 표시한다.
Balance 소리의 균형을 나타낸다. 0=균형, -10,000=왼쪽스피커만 사용, 10,000=오른쪽 스피커만 사용
BorderStyle 컨트롤 경계 스타일을 지정한다. 0=무사용, 1=고정된 싱글 경계
CurrentPosition 재생 파일에서의 현 위치를 초 단위로 나타낸다.
CurrentState 플레이어의 현 상태를 나타낸다. 0=정지, 2=재생, 1=일시정지
DisplayBackColor 디스플레이 패널의 배경색을 나타낸다.
DisplayForeColor 디스플레이 패널의 전경생을 나타낸다.
DisplayMode 디스플레이 패널에 초단위 또는 프레임 단위로 현위치를 디스플레이할지를 나타낸다. 0=초, 1=프레임
EnableContextMenu 단축 메뉴를 활성화시킬지를 나타낸다.
Enabled 컨트롤이 활성화되었는지를 나타낸다.
EnablePositionControls 컨트롤 패널에 위치 버튼을 보여줄 것인지를 표현한다.
EnableSelectControls 컨트롤 패널에 선택 버튼을 보여줄 것인지를 표현한다.
EnableTracker 컨트롤 패널에 트랙바 컨트롤을 보여줄 것인지를 표시
FileName 재생될 멀티미디어 파일을 지정한다.
FullScreenMode 모니터 전체의 크기로 멀티미디어를 표시한다.
MovieWindowSize 재생 패널의 크기를 결정한다. 0=원래크기, 1=원래크기의 2배, 2=화면의 1/6크기, 3=화면의 1/4
PlayCount 재생할 횟수를 지정한다.
Rate 재생 비율을 결정한다.
ReadyState 소스 파일을 얼마나 로드했는가에 따른 Active Movie Control의 준비 상태를 나타낸다.
SelectionEnd 파일의 처음에서부터 종료 위치를 초 단위로 지정한다.
SelectionStart 파일의 처음에서부터 시작 위치를 초 단위로 지정한다.
ShowControls 컨트롤 패널 표시 여부를 지정한다.
ShowDisplay 디스플레이 패널 표시 여부를 지정한다.
ShowPositionControls 위치 컨트롤의 표시 여부를 지정한다.
ShowSelectControls 선택 컨트롤의 표시 여부를 지정한다.
ShowTracker 트랙바의 표시 여부를 지정한다.
Volume 데이벨의 100분의 1 단위로 볼륨을 지정한다.
.. 그외 자세한 사항은 MSDN:Windows Media Player Properties를 참고하기 바랍니다.
 ----------------------------------------------------------------------------------------

 <html>
<script language="JavaScript">
<!--

 function mmp_state() {  /* 재생상태를 출력 */
 switch(mmp.PlayState) {
  case 0 : frm1.state.value = "중지상태";
   break;
  case 1 : frm1.state.value = "일시중지";
   break;
  case 2 : frm1.state.value = "실행중";
   break;
 }
}

 function mmp_play() {  /* 재생 */
 if (mmp.Filename!="")
  mmp.Play();
 mmp_state();
}

 function mmp_stop() {  /* 멈춤 */
 if (mmp.Filename!="")
  mmp.Stop();
 mmp_state();
}

 function media_size(my_sel) {  /* 화면크기조정 */
 switch(my_sel) {
  case 0 : mmp.DisplaySize = 0;
   break;
  case 2 : mmp.DisplaySize = 2;
   break;
  case 3 : mmp.DisplaySize = 3;
   break;
 }
}

 function mmp_pause() {  /* 일시멈춤 */
 if (mmp.Filename!="")
  mmp.Pause();
 mmp_state();
}

 function mmp_sound() {  /* 소리제어 */
 if (mmp.Filename!="") {
  if (mmp.Mute == true) {
   mmp.Mute = false;
   frm1.sound.value = "소리켬";
  } else {
   mmp.Mute = true;
   frm1.sound.value = "소리끔";
  }
 }
}

 -->
</script>

 <body>
<div align="center">

<object classid="CLSID:22D6F312-B0F6-11D0-94AB-0080C74C7E95" codeBase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701" id="mmp" style="left:0px; top:0px; width:320px; height:240;">
 <param name="AudioStream" value=-1>
 <param name="AutoSize" value=-1>
 <param name="AutoStart" value=-1>  <!-- 웹페이지를 열면 자동으로 재생을 시작할 지 설정 -->
 <param name="AnimationAtStart" value=-1>
 <param name="AllowScan" value=-1>
 <param name="AllowChangeDisplaySize" value=-1>
 <param name="AutoRewind" value=0>  <!-- 파일의 재생이 끝났을 때 자동으로 되감기를 할 지 설정 -->
 <param name="Balance" value=0>  <!-- 스피커의 음량분배, 0=균형, -10,000=왼쪽스피커만 사용, 10,000=오른쪽 스피커만 사용  -->
 <param name="BaseURL" value="">
 <param name="BufferingTime" value=5>
 <param name="CaptioningID" value="">
 <param name="ClickToPlay" value=-1>
 <param name="CursorType" value=0>
 <param name="CurrentPosition" value=1>  <!-- 재생 파일에서의 현 위치를 초 단위로 나타낸다.  -->
 <param name="CurrentMaker" value=0>
 <param name="DefaultFrame" value="">
 <param name="DisplayBackColor" value=0>  <!--  디스플레이 패널의 배경색을 나타낸다.  -->
 <param name="DisplayForeColor" value="16777215">  <!-- 디스플레이 패널의 전경색 -->
 <param name="DisplauMode" value=0>  <!-- 디스플레이 패널에 초단위 또는 프레임 단위로 현위치를 디스플레이할지를 나타낸다. 0=초, 1=프레임 -->
 <param name="DisplaySize" value=0>
 <param name="Enabled" value=-1>  <!-- 컨트롤이 활성화되었는지를 나타낸다. -->
 <param name="EnableContextMenu" value=-1>  <!-- 단축 메뉴를 활성화시킬지를 나타낸다. -->
 <param name="EnablePositionControls" value=-1>  <!-- 컨트롤 패널에 위치 버튼의 출력설정 -->
 <param name="EnableFullscreenControls" value=0>
 <param name="EnableTracker" value=-1>  <!-- 컨트롤 패널에 트랙바 컨트롤을 보여줄 지를 표시 -->
 <param name="Filename" value="king_1118.asf">  <!-- 재생될 멀티미디어 파일을 지정한다. -->
 <param name="InvokeURLs" value=-1>
 <param name="Language" value=-1>
 <param name="Mute" value=0>
 <param name="PlayCount" value=1>  <!-- 재생할 횟수를 지정한다.  -->
 <param name="PreviewMode" value=0>
 <param name="Rate" value=1>  <!-- 재생 비율을 결정한다.  -->
 <param name="SAMILang" value="">
 <param name="SAMIStyle" value="">
 <param name="SAMIFileName" value="">
 <param name="SelectionStart" value=-1>  <!-- 파일의 처음에서부터 시작 위치를 초 단위로 지정 -->
 <param name="SelectionEnd" value=-1>  <!--  파일의 처음에서부터 종료 위치를 초 단위로 지정 -->
 <param name="SendOpenStateChangeEvents" value=-1>
 <param name="SendWarnigEvents" value=-1>
 <param name="SendErrorEvents" value=-1>
 <param name="SendKeyboardEvents" value=0>
 <param name="SendMouseClickEvents" value=0>
 <param name="SendMouseMoveEvents" value=0>
 <param name="SendPlayStateChangeEvents" value=-1>
 <param name="ShowCaptioning" value=0>
 <param name="ShowControls" value=0>  <!-- 컨트롤 패널 표시 여부를 지정한다 -->
 <param name="ShowAudioControls" value=0>
 <param name="ShowDisplay" value=0>  <!-- 디스플레이 패널 표시 여부를 지정한다.  -->
 <param name="ShowGotoBar" value=0>
 <param name="ShowPositionControls" value=0>  <!--  위치 컨트롤의 표시 여부를 지정한다.  -->
 <param name="ShowStatusBar" value=0>
 <param name="ShowTracker" value=-1>  <!-- 트랙바의 표시 여부를 지정한다. -->
 <param name="TransparentAtStart" value=0>
 <param name="VideoBorderWidth" value=0>
 <param name="VideoBorderColor" value=0>
 <param name="VideoBorder3D" value=0>
 <param name="Volume" value=-600>  <!-- 데시벨의 100분의 1 단위로 볼륨을 지정한다.  -->
 <param name="WindowlessVideo" value=0>
</object>

 <form name="frm1">
 <input type="button" name="play" value="실행" onClick="mmp_play()">
 <input type="button" name="stop" value="중지" onClick="mmp_stop()">
 <input type="button" name="next" value="일시중지" onClick="mmp_pause()">
 <input type="button" name="sound" value="소리 켬" onClick="mmp_sound()">
 <br><br>
 <input type="button" name="size1" value="기본크기" onClick="media_size(0)">
 <input type="button" name="size2" value="두배크기" onClick="media_size(2)">
 <input type="button" name="size3" value="전체크기" onClick="media_size(3)">
 <br><br>
 상태 : <input type="text" name="state" value="실행중">

</form>

 </div>
</body>
</html>

http://blog.naver.com/apchima/80025433424

Busy Developers' Guide to HSSF Features

Language/Java 2007. 4. 12. 21:28 by 정민군

New Workbook

    HSSFWorkbook wb = new HSSFWorkbook();
    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

New Sheet

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet1 = wb.createSheet("new sheet");
    HSSFSheet sheet2 = wb.createSheet("second sheet");
    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Creating Cells

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("new sheet");

    // Create a row and put some cells in it. Rows are 0 based.
    HSSFRow row = sheet.createRow((short)0);
    // Create a cell and put a value in it.
    HSSFCell cell = row.createCell((short)0);
    cell.setCellValue(1);

    // Or do it on one line.
    row.createCell((short)1).setCellValue(1.2);
    row.createCell((short)2).setCellValue("This is a string");
    row.createCell((short)3).setCellValue(true);

    // Write the output to a file
    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Creating Date Cells

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("new sheet");

    // Create a row and put some cells in it. Rows are 0 based.
    HSSFRow row = sheet.createRow((short)0);

    // Create a cell and put a date value in it.  The first cell is not styled
    // as a date.
    HSSFCell cell = row.createCell((short)0);
    cell.setCellValue(new Date());

    // we style the second cell as a date (and time).  It is important to
    // create a new cell style from the workbook otherwise you can end up
    // modifying the built in style and effecting not only this cell but other cells.
    HSSFCellStyle cellStyle = wb.createCellStyle();
    cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
    cell = row.createCell((short)1);
    cell.setCellValue(new Date());
    cell.setCellStyle(cellStyle);

    // Write the output to a file
    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Working with different types of cells

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("new sheet");
    HSSFRow row = sheet.createRow((short)2);
    row.createCell((short) 0).setCellValue(1.1);
    row.createCell((short) 1).setCellValue(new Date());
    row.createCell((short) 2).setCellValue("a string");
    row.createCell((short) 3).setCellValue(true);
    row.createCell((short) 4).setCellType(HSSFCell.CELL_TYPE_ERROR);

    // Write the output to a file
    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Demonstrates various alignment options

    public static void main(String[] args)
            throws IOException
    {
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet("new sheet");
        HSSFRow row = sheet.createRow((short) 2);
        createCell(wb, row, (short) 0, HSSFCellStyle.ALIGN_CENTER);
        createCell(wb, row, (short) 1, HSSFCellStyle.ALIGN_CENTER_SELECTION);
        createCell(wb, row, (short) 2, HSSFCellStyle.ALIGN_FILL);
        createCell(wb, row, (short) 3, HSSFCellStyle.ALIGN_GENERAL);
        createCell(wb, row, (short) 4, HSSFCellStyle.ALIGN_JUSTIFY);
        createCell(wb, row, (short) 5, HSSFCellStyle.ALIGN_LEFT);
        createCell(wb, row, (short) 6, HSSFCellStyle.ALIGN_RIGHT);

        // Write the output to a file
        FileOutputStream fileOut = new FileOutputStream("workbook.xls");
        wb.write(fileOut);
        fileOut.close();

    }

    /**
     * Creates a cell and aligns it a certain way.
     *
     * @param wb        the workbook
     * @param row       the row to create the cell in
     * @param column    the column number to create the cell in
     * @param align     the alignment for the cell.
     */
    private static void createCell(HSSFWorkbook wb, HSSFRow row, short column, short align)
    {
        HSSFCell cell = row.createCell(column);
        cell.setCellValue("Align It");
        HSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(align);
        cell.setCellStyle(cellStyle);
    }
                    

Working with borders

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("new sheet");

    // Create a row and put some cells in it. Rows are 0 based.
    HSSFRow row = sheet.createRow((short) 1);

    // Create a cell and put a value in it.
    HSSFCell cell = row.createCell((short) 1);
    cell.setCellValue(4);

    // Style the cell with borders all around.
    HSSFCellStyle style = wb.createCellStyle();
    style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
    style.setBottomBorderColor(HSSFColor.BLACK.index);
    style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
    style.setLeftBorderColor(HSSFColor.GREEN.index);
    style.setBorderRight(HSSFCellStyle.BORDER_THIN);
    style.setRightBorderColor(HSSFColor.BLUE.index);
    style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM_DASHED);
    style.setTopBorderColor(HSSFColor.BLACK.index);
    cell.setCellStyle(style);

    // Write the output to a file
    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Fills and colors

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("new sheet");

    // Create a row and put some cells in it. Rows are 0 based.
    HSSFRow row = sheet.createRow((short) 1);

    // Aqua background
    HSSFCellStyle style = wb.createCellStyle();
    style.setFillBackgroundColor(HSSFColor.AQUA.index);
    style.setFillPattern(HSSFCellStyle.BIG_SPOTS);
    HSSFCell cell = row.createCell((short) 1);
    cell.setCellValue("X");
    cell.setCellStyle(style);

    // Orange "foreground", foreground being the fill foreground not the font color.
    style = wb.createCellStyle();
    style.setFillForegroundColor(HSSFColor.ORANGE.index);
    style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
    cell = row.createCell((short) 2);
    cell.setCellValue("X");
    cell.setCellStyle(style);

    // Write the output to a file
    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Merging cells

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("new sheet");

    HSSFRow row = sheet.createRow((short) 1);
    HSSFCell cell = row.createCell((short) 1);
    cell.setCellValue("This is a test of merging");

    sheet.addMergedRegion(new Region(1,(short)1,1,(short)2));

    // Write the output to a file
    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Working with fonts

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("new sheet");

    // Create a row and put some cells in it. Rows are 0 based.
    HSSFRow row = sheet.createRow((short) 1);

    // Create a new font and alter it.
    HSSFFont font = wb.createFont();
    font.setFontHeightInPoints((short)24);
    font.setFontName("Courier New");
    font.setItalic(true);
    font.setStrikeout(true);

    // Fonts are set into a style so create a new one to use.
    HSSFCellStyle style = wb.createCellStyle();
    style.setFont(font);

    // Create a cell and put a value in it.
    HSSFCell cell = row.createCell((short) 1);
    cell.setCellValue("This is a test of fonts");
    cell.setCellStyle(style);

    // Write the output to a file
    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Custom colors

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet();
    HSSFRow row = sheet.createRow((short) 0);
    HSSFCell cell = row.createCell((short) 0);
    cell.setCellValue("Default Palette");

    //apply some colors from the standard palette,
    // as in the previous examples.
    //we'll use red text on a lime background

    HSSFCellStyle style = wb.createCellStyle();
    style.setFillForegroundColor(HSSFColor.LIME.index);
    style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

    HSSFFont font = wb.createFont();
    font.setColor(HSSFColor.RED.index);
    style.setFont(font);

    cell.setCellStyle(style);

    //save with the default palette
    FileOutputStream out = new FileOutputStream("default_palette.xls");
    wb.write(out);
    out.close();

    //now, let's replace RED and LIME in the palette
    // with a more attractive combination
    // (lovingly borrowed from freebsd.org)

    cell.setCellValue("Modified Palette");

    //creating a custom palette for the workbook
    HSSFPalette palette = wb.getCustomPalette();

    //replacing the standard red with freebsd.org red
    palette.setColorAtIndex(HSSFColor.RED.index,
            (byte) 153,  //RGB red (0-255)
            (byte) 0,    //RGB green
            (byte) 0     //RGB blue
    );
    //replacing lime with freebsd.org gold
    palette.setColorAtIndex(HSSFColor.LIME.index, (byte) 255, (byte) 204, (byte) 102);

    //save with the modified palette
    // note that wherever we have previously used RED or LIME, the
    // new colors magically appear
    out = new FileOutputStream("modified_palette.xls");
    wb.write(out);
    out.close();
                    

Reading and Rewriting Workbooks

    POIFSFileSystem fs      =
            new POIFSFileSystem(new FileInputStream("workbook.xls"));
    HSSFWorkbook wb = new HSSFWorkbook(fs);
    HSSFSheet sheet = wb.getSheetAt(0);
    HSSFRow row = sheet.getRow(2);
    HSSFCell cell = row.getCell((short)3);
    if (cell == null)
        cell = row.createCell((short)3);
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    cell.setCellValue("a test");

    // Write the output to a file
    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Using newlines in cells

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet s = wb.createSheet();
    HSSFRow r = null;
    HSSFCell c = null;
    HSSFCellStyle cs = wb.createCellStyle();
    HSSFFont f = wb.createFont();
    HSSFFont f2 = wb.createFont();

    cs = wb.createCellStyle();

    cs.setFont( f2 );
    //Word Wrap MUST be turned on
    cs.setWrapText( true );

    r = s.createRow( (short) 2 );
    r.setHeight( (short) 0x349 );
    c = r.createCell( (short) 2 );
    c.setCellType( HSSFCell.CELL_TYPE_STRING );
    c.setCellValue( "Use \n with word wrap on to create a new line" );
    c.setCellStyle( cs );
    s.setColumnWidth( (short) 2, (short) ( ( 50 * 8 ) / ( (double) 1 / 20 ) ) );

    FileOutputStream fileOut = new FileOutputStream( "workbook.xls" );
    wb.write( fileOut );
    fileOut.close();

Data Formats

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("format sheet");
    HSSFCellStyle style;
    HSSFDataFormat format = wb.createDataFormat();
    HSSFRow row;
    HSSFCell cell;
    short rowNum = 0;
    short colNum = 0;

    row = sheet.createRow(rowNum++);
    cell = row.createCell(colNum);
    cell.setCellValue(11111.25);
    style = wb.createCellStyle();
    style.setDataFormat(format.getFormat("0.0"));
    cell.setCellStyle(style);

    row = sheet.createRow(rowNum++);
    cell = row.createCell(colNum);
    cell.setCellValue(11111.25);
    style = wb.createCellStyle();
    style.setDataFormat(format.getFormat("#,##0.0000"));
    cell.setCellStyle(style);

    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Fit Sheet to One Page

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("format sheet");
    HSSFPrintSetup ps = sheet.getPrintSetup();
    
    sheet.setAutobreaks(true);
    
    ps.setFitHeight((short)1);
    ps.setFitWidth((short)1);


    // Create various cells and rows for spreadsheet.

    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Set Print Area

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("Sheet1");
    wb.setPrintArea(0, "$A$1:$C$2");
    //sets the print area for the first sheet
    //Alternatively:
    //wb.setPrintArea(0, 0, 1, 0, 0) is equivalent to using the name reference (See the JavaDocs for more details)  

    // Create various cells and rows for spreadsheet.

    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
    
    
                    

Set Page Numbers on Footer

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("format sheet");
    HSSFFooter footer = sheet.getFooter()
    
    footer.setRight( "Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages() );
    


    // Create various cells and rows for spreadsheet.

    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Using the Convenience Functions

The convenience functions live in contrib and provide utility features such as setting borders around merged regions and changing style attributes without explicitly creating new styles.

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet1 = wb.createSheet( "new sheet" );

    // Create a merged region
    HSSFRow row = sheet1.createRow( (short) 1 );
    HSSFRow row2 = sheet1.createRow( (short) 2 );
    HSSFCell cell = row.createCell( (short) 1 );
    cell.setCellValue( "This is a test of merging" );
    Region region = new Region( 1, (short) 1, 4, (short) 4 );
    sheet1.addMergedRegion( region );

    // Set the border and border colors.
    final short borderMediumDashed = HSSFCellStyle.BORDER_MEDIUM_DASHED;
    HSSFRegionUtil.setBorderBottom( borderMediumDashed,
        region, sheet1, wb );
    HSSFRegionUtil.setBorderTop( borderMediumDashed,
        region, sheet1, wb );
    HSSFRegionUtil.setBorderLeft( borderMediumDashed,
        region, sheet1, wb );
    HSSFRegionUtil.setBorderRight( borderMediumDashed,
        region, sheet1, wb );
    HSSFRegionUtil.setBottomBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);
    HSSFRegionUtil.setTopBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);
    HSSFRegionUtil.setLeftBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);
    HSSFRegionUtil.setRightBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);

    // Shows some usages of HSSFCellUtil
    HSSFCellStyle style = wb.createCellStyle();
    style.setIndention((short)4);
    HSSFCellUtil.createCell(row, 8, "This is the value of the cell", style);
    HSSFCell cell2 = HSSFCellUtil.createCell( row2, 8, "This is the value of the cell");
    HSSFCellUtil.setAlignment(cell2, wb, HSSFCellStyle.ALIGN_CENTER);

    // Write out the workbook
    FileOutputStream fileOut = new FileOutputStream( "workbook.xls" );
    wb.write( fileOut );
    fileOut.close();
                    

Shift rows up or down on a sheet

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("row sheet");

    // Create various cells and rows for spreadsheet.

    // Shift rows 6 - 11 on the spreadsheet to the top (rows 0 - 5)
    sheet.shiftRows(5, 10, -5);

    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Set a sheet as selected

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("row sheet");
    sheet.setSelected(true);

    // Create various cells and rows for spreadsheet.

    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Set the zoom magnification

The zoom is expressed as a fraction. For example to express a zoom of 75% use 3 for the numerator and 4 for the denominator.

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet1 = wb.createSheet("new sheet");
    sheet1.setZoom(3,4);   // 75 percent magnification
    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Splits and freeze panes

There are two types of panes you can create; freeze panes and split panes.

A freeze pane is split by columns and rows. You create a freeze pane using the following mechanism:

sheet1.createFreezePane( 3, 2, 3, 2 );

The first two parameters are the columns and rows you wish to split by. The second two parameters indicate the cells that are visible in the bottom right quadrant.

Split pains appear differently. The split area is divided into four separate work area's. The split occurs at the pixel level and the user is able to adjust the split by dragging it to a new position.

Split panes are created with the following call:

sheet2.createSplitPane( 2000, 2000, 0, 0, HSSFSheet.PANE_LOWER_LEFT );

The first parameter is the x position of the split. This is in 1/20th of a point. A point in this case seems to equate to a pixel. The second parameter is the y position of the split. Again in 1/20th of a point.

The last parameter indicates which pane currently has the focus. This will be one of HSSFSheet.PANE_LOWER_LEFT, PANE_LOWER_RIGHT, PANE_UPPER_RIGHT or PANE_UPPER_LEFT.

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet1 = wb.createSheet("new sheet");
    HSSFSheet sheet2 = wb.createSheet("second sheet");
    HSSFSheet sheet3 = wb.createSheet("third sheet");
    HSSFSheet sheet4 = wb.createSheet("fourth sheet");

    // Freeze just one row
    sheet1.createFreezePane( 0, 1, 0, 1 );
    // Freeze just one column
    sheet2.createFreezePane( 1, 0, 1, 0 );
    // Freeze the columns and rows (forget about scrolling position of the lower right quadrant).
    sheet3.createFreezePane( 2, 2 );
    // Create a split with the lower left side being the active quadrant
    sheet4.createSplitPane( 2000, 2000, 0, 0, HSSFSheet.PANE_LOWER_LEFT );

    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Repeating rows and columns

It's possible to set up repeating rows and columns in your printouts by using the setRepeatingRowsAndColumns() function in the HSSFWorkbook class.

This function Contains 5 parameters. The first parameter is the index to the sheet (0 = first sheet). The second and third parameters specify the range for the columns to repreat. To stop the columns from repeating pass in -1 as the start and end column. The fourth and fifth parameters specify the range for the rows to repeat. To stop the columns from repeating pass in -1 as the start and end rows.

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet1 = wb.createSheet("new sheet");
    HSSFSheet sheet2 = wb.createSheet("second sheet");

    // Set the columns to repeat from column 0 to 2 on the first sheet
    wb.setRepeatingRowsAndColumns(0,0,2,-1,-1);
    // Set the the repeating rows and columns on the second sheet.
    wb.setRepeatingRowsAndColumns(1,4,5,1,2);

    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Headers and Footers

Example is for headers but applies directly to footers.

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("new sheet");

    HSSFHeader header = sheet.getHeader();
    header.setCenter("Center Header");
    header.setLeft("Left Header");
    header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") + 
                    HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16");

    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
                    

Drawing Shapes

POI supports drawing shapes using the Microsoft Office drawing tools. Shapes on a sheet are organized in a hiearchy of groups and and shapes. The top-most shape is the patriarch. This is not visisble on the sheet at all. To start drawing you need to call createPatriarch on the HSSFSheet class. This has the effect erasing any other shape information stored in that sheet. By default POI will leave shape records alone in the sheet unless you make a call to this method.

To create a shape you have to go through the following steps:

  1. Create the patriarch.
  2. Create an anchor to position the shape on the sheet.
  3. Ask the patriarch to create the shape.
  4. Set the shape type (line, oval, rectangle etc...)
  5. Set any other style details converning the shape. (eg: line thickness, etc...)
    HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
    a = new HSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 0, (short) 1, 0 );
    HSSFSimpleShape shape1 = patriarch.createSimpleShape(a1);
    shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
                    

Text boxes are created using a different call:

    HSSFTextbox textbox1 = patriarch.createTextbox(
            new HSSFClientAnchor(0,0,0,0,(short)1,1,(short)2,2));
    textbox1.setString(new HSSFRichTextString("This is a test") );
                    

It's possible to use different fonts to style parts of the text in the textbox. Here's how:

    HSSFFont font = wb.createFont();
    font.setItalic(true);
    font.setUnderline(HSSFFont.U_DOUBLE);
    HSSFRichTextString string = new HSSFRichTextString("Woo!!!");
    string.applyFont(2,5,font);
    textbox.setString(string );
                    

Just as can be done manually using Excel, it is possible to group shapes together. This is done by calling createGroup() and then creating the shapes using those groups.

It's also possible to create groups within groups.

Warning
Any group you create should contain at least two other shapes or subgroups.

Here's how to create a shape group:

    // Create a shape group.
    HSSFShapeGroup group = patriarch.createGroup(
            new HSSFClientAnchor(0,0,900,200,(short)2,2,(short)2,2));

    // Create a couple of lines in the group.
    HSSFSimpleShape shape1 = group.createShape(new HSSFChildAnchor(3,3,500,500));
    shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
    ( (HSSFChildAnchor) shape1.getAnchor() ).setAnchor((short)3,3,500,500);
    HSSFSimpleShape shape2 = group.createShape(new HSSFChildAnchor((short)1,200,400,600));
    shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
                    

If you're being observant you'll noticed that the shapes that are added to the group use a new type of anchor: the HSSFChildAnchor. What happens is that the created group has it's own coordinate space for shapes that are placed into it. POI defaults this to (0,0,1023,255) but you are able to change it as desired. Here's how:

    myGroup.setCoordinates(10,10,20,20); // top-left, bottom-right
                    

If you create a group within a group it's also going to have it's own coordinate space.

Styling Shapes

By default shapes can look a little plain. It's possible to apply different styles to the shapes however. The sorts of things that can currently be done are:

  • Change the fill color.
  • Make a shape with no fill color.
  • Change the thickness of the lines.
  • Change the style of the lines. Eg: dashed, dotted.
  • Change the line color.

Here's an examples of how this is done:

    HSSFSimpleShape s = patriarch.createSimpleShape(a);
    s.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);
    s.setLineStyleColor(10,10,10);
    s.setFillColor(90,10,200);
    s.setLineWidth(HSSFShape.LINEWIDTH_ONE_PT * 3);
    s.setLineStyle(HSSFShape.LINESTYLE_DOTSYS);
                    

Shapes and Graphics2d

While the native POI shape drawing commands are the recommended way to draw shapes in a shape it's sometimes desirable to use a standard API for compatibility with external libraries. With this in mind we created some wrappers for Graphics and Graphics2d.

Warning
It's important to not however before continuing that Graphics2d is a poor match to the capabilities of the Microsoft Office drawing commands. The older Graphics class offers a closer match but is still a square peg in a round hole.

All Graphics commands are issued into an HSSFShapeGroup. Here's how it's done:

    a = new HSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 0, (short) 1, 0 );
    group = patriarch.createGroup( a );
    group.setCoordinates( 0, 0, 80 * 4 , 12 * 23  );
    float verticalPointsPerPixel = a.getAnchorHeightInPoints(sheet) / (float)Math.abs(group.getY2() - group.getY1());
    g = new EscherGraphics( group, wb, Color.black, verticalPointsPerPixel );
    g2d = new EscherGraphics2d( g );
    drawChemicalStructure( g2d );
                    

The first thing we do is create the group and set it's coordinates to match what we plan to draw. Next we calculate a reasonable fontSizeMultipler then create the EscherGraphics object. Since what we really want is a Graphics2d object we create an EscherGraphics2d object and pass in the graphics object we created. Finally we call a routine that draws into the EscherGraphics2d object.

The vertical points per pixel deserves some more explanation. One of the difficulties in converting Graphics calls into escher drawing calls is that Excel does not have the concept of absolute pixel positions. It measures it's cell widths in 'characters' and the cell heights in points. Unfortunately it's not defined exactly what type of character it's measuring. Presumably this is due to the fact that the Excel will be using different fonts on different platforms or even within the same platform.

Because of this constraint we've had to implement the concept of a verticalPointsPerPixel. This the amount the font should be scaled by when you issue commands such as drawString(). To calculate this value use the follow formula:

    multipler = groupHeightInPoints / heightOfGroup
                    

The height of the group is calculated fairly simply by calculating the difference between the y coordinates of the bounding box of the shape. The height of the group can be calculated by using a convenience called HSSFClientAnchor.getAnchorHeightInPoints().

Many of the functions supported by the graphics classes are not complete. Here's some of the functions that are known to work.

  • fillRect()
  • fillOval()
  • drawString()
  • drawOval()
  • drawLine()
  • clearRect()

Functions that are not supported will return and log a message using the POI logging infrastructure (disabled by default).

Outlining

Outlines are great for grouping sections of information together and can be added easily to columns and rows using the POI API. Here's how:

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet1 = wb.createSheet("new sheet");

    sheet1.groupRow( 5, 14 );
    sheet1.groupRow( 7, 14 );
    sheet1.groupRow( 16, 19 );

    sheet1.groupColumn( (short)4, (short)7 );
    sheet1.groupColumn( (short)9, (short)12 );
    sheet1.groupColumn( (short)10, (short)11 );

    FileOutputStream fileOut = new FileOutputStream(filename);
    wb.write(fileOut);
    fileOut.close();
                    

To collapse (or expand) an outline use the following calls:

    sheet1.setRowGroupCollapsed( 7, true );
    sheet1.setColumnGroupCollapsed( (short)4, true );
                    

The row/column you choose should contain an already created group. It can be anywhere within the group.

Images

Images are part of the drawing support. To add an image just call createPicture() on the drawing patriarch. At the time of writing the following types are supported:

  • PNG
  • JPG
  • DIB

It is not currently possible to read existing images and it should be noted that any existing drawings may be erased once you add a image to a sheet.

    // Create the drawing patriarch.  This is the top level container for
    // all shapes. This will clear out any existing shapes for that sheet.
    HSSFPatriarch patriarch = sheet5.createDrawingPatriarch();

    HSSFClientAnchor anchor;
    anchor = new HSSFClientAnchor(0,0,0,255,(short)2,2,(short)4,7);
    anchor.setAnchorType( 2 );
    patriarch.createPicture(anchor, loadPicture( "src/resources/logos/logoKarmokar4.png", wb ));
            

Named Ranges and Named Cells

Named Range is a way to refer to a group of cells by a name. Named Cell is a degenerate case of Named Range in that the 'group of cells' contains exactly one cell. You can create as well as refer to cells in a workbook by their named range. When working with Named Ranges, the classes: org.apache.poi.hssf.util.CellReference and & org.apache.poi.hssf.util.AreaReference are used.

Creating Named Range / Named Cell

    // setup code
    String sname = "TestSheet", cname = "TestName", cvalue = "TestVal";
    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet(sname);
    sheet.createRow(0).createCell((short) 0).setCellValue(cvalue);
     
    // 1. create named range for a single cell using areareference
    HSSFName namedCell = wb.createName();
    namedCell.setNameName(cname);
    String reference = sname+"!A1:A1"; // area reference
    namedCell.setReference(reference);
    
    // 2. create named range for a single cell using cellreference
    HSSFName namedCell = wb.createName();
    namedCell.setNameName(cname);
    String reference = sname+"!A1"; // cell reference
    namedCell.setReference(reference);
    
    // 3. create named range for an area using AreaReference
    HSSFName namedCell = wb.createName();
    namedCell.setNameName(cname);
    String reference = sname+"!A1:C5"; // area reference
    namedCell.setReference(reference);
    
            

Reading from Named Range / Named Cell

    // setup code
    String cname = "TestName";
    HSSFWorkbook wb = getMyWorkbook(); // retrieve workbook

    // retrieve the named range
    int namedCellIdx = wb.getNameIndex(cellName);
    HSSFName aNamedCell = wb.getNameAt(namedCellIdx);
    
    // retrieve the cell at the named range and test its contents
    AreaReference aref = new AreaReference(aNamedCell.getReference());
    CellReference[] crefs = aref.getCells();
    for (int i=0; i<crefs.length; i++) {
        HSSFSheet s = wb.getSheet(crefs[i].getSheetName());
        HSSFRow r = sheet.getRow(crefs[i].getRow());
        HSSFCell c = r.getCell(crefs[i].getCol());
        // extract the cell contents based on cell type etc.
    }
            

Cell Comments

In Excel a comment is a kind of a text shape, so inserting a comment is very similar to placing a text box in a worksheet:

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("Cell comments in POI HSSF");

    // Create the drawing patriarch. This is the top level container for all shapes including cell comments.
    HSSFPatriarch patr = sheet.createDrawingPatriarch();

    //create a cell in row 3
    HSSFCell cell1 = sheet.createRow(3).createCell((short)1);
    cell1.setCellValue(new HSSFRichTextString("Hello, World"));

    //anchor defines size and position of the comment in worksheet
    HSSFComment comment1 = patr.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short)4, 2, (short) 6, 5));

     // set text in the comment
    comment1.setString(new HSSFRichTextString("We can set comments in POI"));

    //set comment author.
    //you can see it in the status bar when moving mouse over the commented cell
    comment1.setAuthor("Apache Software Foundation");

    // The first way to assign comment to a cell is via HSSFCell.setCellComment method
    cell1.setCellComment(comment1);

    //create another cell in row 6
    HSSFCell cell2 = sheet.createRow(6).createCell((short)1);
    cell2.setCellValue(36.6);


    HSSFComment comment2 = patr.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short)4, 8, (short) 6, 11));
    //modify background color of the comment
    comment2.setFillColor(204, 236, 255);

    HSSFRichTextString string = new HSSFRichTextString("Normal body temperature");

    //apply custom font to the text in the comment
    HSSFFont font = wb.createFont();
    font.setFontName("Arial");
    font.setFontHeightInPoints((short)10);
    font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    font.setColor(HSSFColor.RED.index);
    string.applyFont(font);

    comment2.setString(string);
    //by default comments are hidden. This one is always visible.
    comment2.setVisible(true); 

    comment2.setAuthor("Bill Gates");

    /**
     * The second way to assign comment to a cell is to implicitly specify its row and column.
     * Note, it is possible to set row and column of a non-existing cell.
     * It works, the commnet is visible.
     */
    comment2.setRow(6);
    comment2.setColumn((short)1);

    FileOutputStream out = new FileOutputStream("poi_comment.xls");
    wb.write(out);
    out.close();
        

Reading cell comments

    HSSFCell cell = sheet.get(3).getColumn((short)1);
    HSSFComment comment = cell.getCellComment(); 
    if (comment != null) {
      HSSFRichTextString str = comment.getString();
      String author = comment.getAuthor();
    }
       
1 2 3 4 5 6 

카테고리

분류 전체보기 (46)
Technic (5)
Language (16)
Database (8)
System (5)
Algorithm (1)
Design (1)
Tool (3)
Framework (2)
Network (1)
Utility (1)
SmartPhone (2)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

달력

«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

글 보관함