Apache POI의 엑셀 Formula에BIN2HEX HEX2BIN 지원 추가하기

Posted at 2018/01/10 15:04 // in Programming // by Daniel

POI의 엑셀 Formula 중에, BIN2HEX HEX2BIN 이 지원되지 않았습니다.
이를 커스텀으로 추가하려고 코드를 짜봤습니다.


package com.autron.odin.excel.core.ethercc.imports;

import org.apache.poi.ss.formula.OperationEvaluationContext;
import org.apache.poi.ss.formula.eval.ErrorEval;
import org.apache.poi.ss.formula.eval.EvaluationException;
import org.apache.poi.ss.formula.eval.OperandResolver;
import org.apache.poi.ss.formula.eval.StringEval;
import org.apache.poi.ss.formula.eval.ValueEval;
import org.apache.poi.ss.formula.functions.FreeRefFunction;

/** *

 * com.autron.odin.excel.core.ethercc.imports
 *   |_ Hex2Bin.java
 * 
 * Description:    to support formula HEX2BIN
 * Howto Use : AnalysisToolPak.registerFunction("HEX2BIN", Hex2Bin.instance);
 * 
* Company: Hyundai Autron * Author: JSSONG * Date: 2018. 1. 10. * * version *
 * Revision History:  
 * Version No:  Date of update:    Updated by:  Changes
 * 1.0.0   		2018. 1. 10.        JSSONG       refs #10669 #11020 to support formula HEX2BIN
 * 
*/
class Hex2Bin implements FreeRefFunction { public static final FreeRefFunction instance = new Hex2Bin(); /* (non-Javadoc) * see org.apache.poi.ss.formula.functions.FreeRefFunction#evaluate(org.apache.poi.ss.formula.eval.ValueEval[], org.apache.poi.ss.formula.OperationEvaluationContext) */ Override public ValueEval evaluate(ValueEval[] paramArrayOfValueEval, OperationEvaluationContext paramOperationEvaluationContext) { return evaluateHex2Bin(paramArrayOfValueEval); }

/** * Desc : evaluate HEX2BIN * HEX2BIN * 16진수를 2진수로 변환합니다. * – number 필수 요소입니다. 변환할 16진수입니다. * number는 최대 10자까지 사용할 수 있습니다. * number의 최상위 비트는 부호 비트(오른쪽에서 40번째 비트)이고, 나머지 9비트는 값을 나타내는 비트입니다. * 음수는 2의 보수 표기법으로 표시됩니다. * – places 선택 요소입니다. * 사용할 자릿수입니다. * places를 생략하면 HEX2BIN에서는 필요한 최소 자릿수가 사용됩니다. * places를 지정하면 반환 값의 앞부분을 0으로 채울 수 있습니다. * * Method Name : evaluateHex2Bin * param paramArrayOfValueEval * @return evaluated StringEval(BIN value) or ErrorEval.VALUE_INVALID */ private ValueEval evaluateHex2Bin(ValueEval[] paramArrayOfValueEval) { String strHex = “”; int places = -1; if (paramArrayOfValueEval.length==1) { strHex = OperandResolver.coerceValueToString(paramArrayOfValueEval0); } if (paramArrayOfValueEval.length==2) { strHex = OperandResolver.coerceValueToString(paramArrayOfValueEval0); try { places = OperandResolver.coerceValueToInt(paramArrayOfValueEval1); } catch (EvaluationException e) { e.printStackTrace(); } } try { String binStr = Integer.toString(Integer.parseInt(strHex, 16),2); if (places>0) { if (places > binStr.length()) { int num0 = places – binStr.length(); String str0 = “”; for (;num0>0;num0—) { str0 += “0”; } binStr = str0 + binStr; } } // System.out.println(strHex + “ “ + places + “ -> “ + binStr); return new StringEval(binStr); } catch (Exception e) { return ErrorEval.VALUE_INVALID; } }
}


package com.autron.odin.excel.core.ethercc.imports;

import org.apache.poi.ss.formula.OperationEvaluationContext;
import org.apache.poi.ss.formula.eval.ErrorEval;
import org.apache.poi.ss.formula.eval.EvaluationException;
import org.apache.poi.ss.formula.eval.OperandResolver;
import org.apache.poi.ss.formula.eval.StringEval;
import org.apache.poi.ss.formula.eval.ValueEval;
import org.apache.poi.ss.formula.functions.FreeRefFunction;

/** *

 * com.autron.odin.excel.core.ethercc.imports
 *   |_ Bin2Hex.java
 * 
 * Description:    to support formula BIN2HEX.
 * Howto Use : AnalysisToolPak.registerFunction("BIN2HEX", Bin2Hex.instance);
 * 
* Company: Hyundai Autron * Author: JSSONG * Date: 2018. 1. 10. * * version *
 * Revision History:  
 * Version No:  Date of update:    Updated by:  Changes
 * 1.0.0   		2018. 1. 10.        JSSONG       refs #10669 #11020 to support formula BIN2HEX
 * 
*/
class Bin2Hex implements FreeRefFunction { public static final FreeRefFunction instance = new Bin2Hex(); /** * Desc : Private Constructor of Bin2Hex.java class */ private Bin2Hex() { // make it private } /** * Desc : * Method Name : evaluate * param paramArrayOfValueEval * param paramOperationEvaluationContext * return */ @Override public ValueEval evaluate(ValueEval[] paramArrayOfValueEval, OperationEvaluationContext paramOperationEvaluationContext) {
// System.out.println(“BIN2HEX “ + paramArrayOfValueEval + paramOperationEvaluationContext); return evaluateBin2Hex(paramArrayOfValueEval); }

/** * Desc : evaluate BIN2HEX * Method Name : evaluateBin2Hex * BIN2HEX(number, [places]) * - number 필수 요소입니다. 변환할 2진수입니다. * number는 최대 10자(10비트)까지 사용할 수 있습니다. 최상위 비트는 부호 비트이고 나머지 9비트는 값을 * 나타내는 비트입니다. 음수는 2의 보수 표기법으로 표시됩니다. * - places 선택 요소입니다. 사용할 자릿수입니다. * places를 생략하면 필요한 최소 자릿수가 사용됩니다. places를 지정하면 반환 값의 앞부분을 0으로 채울 수 * 있습니다. * param paramArrayOfValueEval * @return evaluated StringEval(HEX value) or ErrorEval.VALUE_INVALID */ private ValueEval evaluateBin2Hex(ValueEval[] paramArrayOfValueEval) { String strBin = “”; int places = -1; if (paramArrayOfValueEval.length==1) { strBin = OperandResolver.coerceValueToString(paramArrayOfValueEval0); } if (paramArrayOfValueEval.length==2) { strBin = OperandResolver.coerceValueToString(paramArrayOfValueEval0); try { places = OperandResolver.coerceValueToInt(paramArrayOfValueEval1); } catch (EvaluationException e) { e.printStackTrace(); } } try { String hexStr = Integer.toString(Integer.parseInt(strBin, 2),16); if (places>0) { if (places > hexStr.length()) { int num0 = places – hexStr.length(); String str0 = “”; for (;num0>0;num0—) { str0 += “0”; } hexStr = str0 + hexStr; } } // System.out.println(strBin + “ “ + places + “ -> “ + hexStr); return new StringEval(hexStr); } catch (Exception e) { return ErrorEval.VALUE_INVALID; } } }

사용법은 위 클래스를 추가하고 런타임에

AnalysisToolPak.registerFunction("BIN2HEX", Bin2Hex.instance);
AnalysisToolPak.registerFunction("HEX2BIN", Hex2Bin.instance);

코드를 호출하면 됩니다.
이외에도 지원안되는 함수가 많이 있습니다.

제 사용 예는 아래와 같습니다.


// Register BIN2HEX Formula
AnalysisToolPak.registerFunction(“BIN2HEX”, Bin2Hex.instance);

// Register HEX2BIN formula
AnalysisToolPak.registerFunction(“HEX2BIN”, Hex2Bin.instance);

evaluator = wb.getCreationHelper().createFormulaEvaluator();
evaluator.evaluateAll();

wb는 org.apache.poi.ss.usermodel.Workbook 타입입니다.

크리에이티브 커먼즈 라이센스
Creative Commons License

믿음 소망 사랑. 소망

Posted at 2017/07/14 12:58 // in Essay // by Daniel

소망.

(잠 23:18) 정녕히 네 장래가 있겠고 네 소망이 끊어지지 아니하리라
(잠 24:14) 지혜가 네 영혼에게 이와 같은 줄을 알라 이것을 얻으면 정녕히 네 장래가 있겠고 네 소망이 끊어지지 아니하리라

(롬 15:12~13) 또 이사야가 이르되 이새의 뿌리 곧 열방을 다스리기 위하여 일어나시는 이가 있으리니 열방이 그에게 소망을 두리라 하였느니라
소망의 하나님이 모든 기쁨과 평강을 믿음 안에서 너희에게 충만하게 하사 성령의 능력으로 소망이 넘치게 하시기를 원하노라

(엡 1:18) 너희 마음의 눈을 밝히사 그의 부르심의 소망이 무엇이며 성도 안에서 그 기업의 영광의 풍성함이 무엇이며

(살전 2:19) 우리의 소망이나 기쁨이나 자랑의 면류관이 무엇이냐 그가 강림하실 때 우리 주 예수 앞에 너희가 아니냐

(살전 5:8) 우리는 낮에 속하였으니 정신을 차리고 믿음과 사랑의 호심경을 붙이고 구원의 소망의 투구를 쓰자

(딤전 4:10) 이를 위하여 우리가 수고하고 힘쓰는 것은 우리 소망을 살아 계신 하나님께 둠이니 곧 모든 사람 특히 믿는 자들의 구주시라

(롬 5:4) 인내는 연단을, 연단은 소망을 이루는 줄 앎이로다

(롬 8:24) 우리가 소망으로 구원을 얻었으매 보이는 소망이 소망이 아니니 보는 것을 누가 바라리요

(롬 12:12) 소망 중에 즐거워하며 환난 중에 참으며 기도에 항상 힘쓰며

(롬 15:4) 무엇이든지 전에 기록된 바는 우리의 교훈을 위하여 기록된 것이니 우리로 하여금 인내로 또는 성경의 위로로 소망을 가지게 함이니라

소망을 가지려면...
성경의 위로가 필요하다.

그 소망은 결국 우리의 구원에 대한 소망인가보다.
연단이 소망을 이루게 한다.. 고로 많은 참음과 고난이 있겠구나...
그리고 그 소망은 하나님이 주신다. 성령의 능력으로 기쁨과 평안 -> 소망

크리에이티브 커먼즈 라이센스
Creative Commons License

opal - SWT 위에서 아기자기한 위젯들

Posted at 2017/02/14 16:59 // in Programming // by Daniel

https://github.com/lcaron/opal

여기 가면 있다.
원래 nebula 말고 다른 위젯이 있나 찾아보고있었는데
이런 것도 있더군.

https://github.com/lcaron/opal/blob/releases/V1.0.4/opal-1.0.4-src.zip?raw=true
를 다운 받는다면 test 폴더에 각 위젯들을 테스트한 코드가 들어있다.
로그인창 부터 프로퍼티 테이블, blur 패널, notification 등등 자그만 위젯들이 많다.

사용자 삽입 이미지

사용자 삽입 이미지
사용자 삽입 이미지

하나씩 실행해보면 알 수 있다.

크리에이티브 커먼즈 라이센스
Creative Commons License

cmd(배치) 스크립트, 파일명을 변수로 쓰기

Posted at 2017/02/14 16:20 // in Tips // by Daniel

SetLocal EnableDelayedExpansion
echo off
for /r %%f in (myfiles.*) do (
REM echo %%~nxf
set filename=%%~nxf
@echo !filename!
)
echo on

위와 같이 하면 된다.
참고)
http://stackoverflow.com/questions/1556 ··· variable

크리에이티브 커먼즈 라이센스
Creative Commons License
1 2 3 4 5 6 ... 188