https://stackoverflow.com/questions/50317773/how-to-include-bootstrap-4-in-an-electron-app


1. package.json 에 추가하기.

npm install --save jquery 

npm install --save bootstrap 

 - 아래와 같은 메시지가 노출된다면.


npm install --save popper.js 


2. html에 import 하기

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Elctron Test</title>
<link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.css">
</head>
<body>
<a class="btn btn-info">TEST BTN</a>
<script>
window.$ = window.jquery = require("jquery");
window.popper = require("popper.js");
require("bootstrap");

require('./common.js');
</script>
</body>
</html>


3. 사용해보기.

 - 결과


'프로그래밍 > Node.js' 카테고리의 다른 글

[Electron.js] Bootstrap 4 사용하기.  (0) 2018.09.11
npm에서 --save, --save-dev 옵션  (0) 2018.05.02
Mongoose 사용하기.  (0) 2016.08.22

1. Bootstrap

 - 웹사이트 제작시에 많이 사용 되는 요소들을 모아놓은 오픈소스

 - 반응형 웹페이지를 손쉽게 만들 수 있다.

 - 수많은 유, 무료 테마


2. 사용해보기

 1) js, css

  - cdn 링크 : http://getbootstrap.com/docs/4.1/getting-started/introduction/ 참고

  - 다운로드 : http://getbootstrap.com 참고


3. 샘플

 1) BUTTON

  - http://getbootstrap.com/docs/4.1/components/buttons/

  - 샘플코드

<button type="button">기본버튼</button>

<button type="button" class="btn">BS 버튼</button>

<button type="button" class="btn btn-primary">Primary</button>
<button type="button" class="btn btn-secondary">Secondary</button>
<button type="button" class="btn btn-success">Success</button>
<button type="button" class="btn btn-danger">Danger</button>
<button type="button" class="btn btn-warning">Warning</button>
<button type="button" class="btn btn-info">Info</button>
<button type="button" class="btn btn-light">Light</button>
<button type="button" class="btn btn-dark">Dark</button>

<button type="button" class="btn btn-link">Link</button>

<button type="button" class="btn btn-primary btn-lg">Primary</button>
<button type="button" class="btn btn-success btn-md">Success</button>
<button type="button" class="btn btn-secondary btn-sm">Secondary</button>

<button type="button" class="btn btn-outline-primary">Primary</button>
<button type="button" class="btn btn-outline-secondary">Secondary</button>
<button type="button" class="btn btn-outline-success">Success</button>
<button type="button" class="btn btn-outline-danger">Danger</button>
<button type="button" class="btn btn-outline-warning">Warning</button>
<button type="button" class="btn btn-outline-info">Info</button>
<button type="button" class="btn btn-outline-light">Light</button>
<button type="button" class="btn btn-outline-dark">Dark</button>

<button type="button" class="btn btn-primary btn-lg btn-block">Block level button</button>
<button type="button" class="btn btn-secondary btn-lg btn-block">Block level button</button>


  - 결과



 2) input

  - http://getbootstrap.com/docs/4.1/components/input-group/

  - 샘플소스

기본 <input type="text">

<input type="text" class="form-control" placeholder="GEUN.kr">


<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" id="addon1">@</span>
</div>
<input type="text" class="form-control" placeholder="Username" aria-describedby="addon1">
</div>

<div class="input-group mb-3">
<input type="text" class="form-control" placeholder="Username" aria-describedby="addon2">
<div class="input-group-append">
<span class="input-group-text" id="addon2">@geun.kr</span>
</div>
</div>


  - 결과



3) NavBar

  - https://getbootstrap.com/docs/4.1/components/navbar/

  - 샘플코드

<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="#">GEUN.kr</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>

<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">BLOG</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
Language
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="#">JAVA</a>
<a class="dropdown-item" href="#">PHP</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">JAVASCRIPT</a>
</div>
</li>
<li class="nav-item">
<a class="nav-link disabled" href="#">Disabled</a>
</li>
</ul>
<form class="form-inline my-2 my-lg-0">
<input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
</nav>

  - 결과


 4) Table

  - https://getbootstrap.com/docs/4.1/content/tables/

  - 샘플소스

<table>
<thead>
<th>Firstname</th>
<th>Lastname</th>
<th>Email</th>
</thead>
<tbody>
<tr>
<td>Mary</td>
<td>Moe</td>
<td>mary@example.com</td>
</tr>
<tr>
<td>July</td>
<td>Dooley</td>
<td>july@example.com</td>
</tr>
</tbody>
</table>

<table class="table table-striped table-bordered">
<thead>
<th>Firstname</th>
<th>Lastname</th>
<th>Email</th>
</thead>
<tbody>
<tr>
<td>Mary</td>
<td>Moe</td>
<td>mary@example.com</td>
</tr>
<tr>
<td>July</td>
<td>Dooley</td>
<td>july@example.com</td>
</tr>
<tr>
<td>Mary</td>
<td>Moe</td>
<td>mary@example.com</td>
</tr>
<tr>
<td>July</td>
<td>Dooley</td>
<td>july@example.com</td>
</tr>
</tbody>
</table>


  - 결과



 5) Pagination

  - https://getbootstrap.com/docs/4.1/components/pagination/

  - 샘플소스

<ul class="pagination">
<li class="page-item"><a class="page-link" href="#">Previous</a></li>
<li class="page-item"><a class="page-link" href="#">1</a></li>
<li class="page-item"><a class="page-link" href="#">2</a></li>
<li class="page-item"><a class="page-link" href="#">3</a></li>
<li class="page-item"><a class="page-link" href="#">4</a></li>
<li class="page-item"><a class="page-link" href="#">5</a></li>
<li class="page-item"><a class="page-link" href="#">Next</a></li>
</ul>


  - 결과



 6) Modal

  - https://getbootstrap.com/docs/4.1/components/modal/

  - 샘플소스

<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal">
Launch demo modal
</button>

<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
...
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>


  - 결과


 7) containers

  - https://getbootstrap.com/docs/4.0/layout/overview/#containers

  - 샘플소스

<div class="container">

</div>

  - 결과



  - 샘플소스

<div class="container-fluid">

</div>
  - 결과


 8) Grid 시스템 

  - https://getbootstrap.com/docs/4.1/layout/grid/

  - 참고 : http://shoelace.io/ 

  - 브라우저 크기에 따라 최대 12개의 컬럼을 어떻게 배치할 건지에 대한 정의

  - 샘플코드


<!-- Control the column width, and how they should appear on different devices -->
<div class="row">
<div class="col-sm-6" style="background-color:yellow;">50%</div>
<div class="col-sm-6" style="background-color:orange;">50%</div>
</div>
<br>

<div class="row">
<div class="col-sm-4" style="background-color:yellow;">33.33%</div>
<div class="col-sm-4" style="background-color:orange;">33.33%</div>
<div class="col-sm-4" style="background-color:yellow;">33.33%</div>
</div>
<br>

<!-- Or let Bootstrap automatically handle the layout -->
<div class="row">
<div class="col-sm" style="background-color:yellow;">25%</div>
<div class="col-sm" style="background-color:orange;">25%</div>
<div class="col-sm" style="background-color:yellow;">25%</div>
<div class="col-sm" style="background-color:orange;">25%</div>
</div>
<br>

<div class="row">
<div class="col" style="background-color:yellow;">25%</div>
<div class="col" style="background-color:orange;">25%</div>
<div class="col" style="background-color:yellow;">25%</div>
<div class="col" style="background-color:orange;">25%</div>
</div>


  - PC


  - 태블릿

  - 폰



추가적으로 아래 사이트를 가시면 커스텀한 Bootstrap compenent를 사용할 수 있습니다.

 - https://bootsnipp.com/

'프로그래밍 > html & css' 카테고리의 다른 글

Bootstrap 사용하기  (0) 2018.08.08
textarea 리사이즈 관련  (0) 2018.07.16
radio, checkbox clear 버튼 만들기.  (0) 2018.04.25
<html lang="ko">  (0) 2018.04.09
html tag(select box, checkbox) Readonly(?)처럼 사용하기  (0) 2018.03.08

1. 기본

 

 범위

 예시

 10진수

 0 - 9

0,  1, 2, 3, 4 .... 8, 9, 10 ...

 16진수(Hex)

 0 ~ 9, A ~ F 

0,  1, 2 .... 9, A, B ... F, 10, 11 .... 19, 1A, 1B

 8진수(Octal)

 0 ~ 7

 0, 1, 2 .... 6, 7, 10, 11 ....

 2진수(Binary)

 0, 1

 0, 1, 10, 11, 100, 101



2. Python 으로 구현해보기

 1) 내장함수로 구현해보기

  - 소스 코드

if __name__ == "__main__":
num_10 = 236

num_2 = bin(num_10) # 접두어 "0b"가 붙음
num_8 = oct(num_10)
num_16 = hex(num_10)

print("10 -> 2 : ", num_2)
print("10 -> 8 : ", num_8)
print("10 -> 16 : ", num_16)
print("=================")

# int(x, base=10)
print("2 -> 10 : ", int(num_2, 2))
print("8 -> 10 : ", int(num_8, 8))
print("16 -> 10 : ", int(num_16, 16))

  - 결과


 2) 함수 구현해보기.

  - 재귀함수를 사용하여 함수 구현

def convert(num, base):
T = "0123456789ABCDEF"
quotient, remainder = divmod(num, base)

if quotient == 0:
return T[remainder]
else:
return convert(quotient, base) + T[remainder]


if __name__ == "__main__":
num_10 = 236

print(convert(num_10, 2))
print(convert(num_10, 8))
print(convert(num_10, 16))

print("=================")
print(int(convert(num_10, 2), 2))
print(int(convert(num_10, 8), 8))
print(int(convert(num_10, 16), 16))

  - 실행결과



3. 전체 소스

def convert(num, base):
T = "0123456789ABCDEF"
quotient, remainder = divmod(num, base)

if quotient == 0:
return T[remainder]
else:
return convert(quotient, base) + T[remainder]


if __name__ == "__main__":
num_10 = 236

num_2 = bin(num_10) # 접두어 "0b"가 붙음
num_8 = oct(num_10)
num_16 = hex(num_10)

print("10 -> 2 : ", num_2)
print("10 -> 8 : ", num_8)
print("10 -> 16 : ", num_16)
print("=================")

# int(x, base=10)
print("2 -> 10 : ", int(num_2, 2))
print("8 -> 10 : ", int(num_8, 8))
print("16 -> 10 : ", int(num_16, 16))
print("=================")

print(convert(num_10, 2))
print(convert(num_10, 8))
print(convert(num_10, 16))

print("=================")
print(int(convert(num_10, 2), 2))
print(int(convert(num_10, 8), 8))
print(int(convert(num_10, 16), 16))


'프로그래밍 > Python' 카테고리의 다른 글

10진수 n진수로 변환하기.  (0) 2018.07.30
[Basic] 약수  (0) 2018.06.04

1. 세가지 공통점

 - 문자열을 처리하는 Class


2. String 과 (StringBuffer, StringBuilder)의 차이점

 - 메모리 상에서 처리방식에서 차이점이 있다.

 - String은 immutable(변경불가) 이고, StringBuffer는 mutable이다.


3. StringBuffer, StringBuilder 두개의 차이점

 1) StringBuffer

  - append 메소드

@Override
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
}


 2) StringBuilder

  - append 메소드

@Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}


4. 결론

 - 단순한 처리일 경우 String 을 사용해도 크게 문제 안됨.

 - multi thread 환경에서는 StringBuffer를 사용하는게 안전하다. 그렇지 않을 경우라면 StringBuilder가 더 빠르다. 아래 소스를 참고하자.

public class StrTest {

public static void main(String[] args) {

strBufferTest();
strBuilderTest();
}

private static void strBufferTest() {
Date start = new Date();
StringBuffer stringBuffer = new StringBuffer();

new Thread(() -> {
IntStream.range(1, 10000).forEach(num -> {
stringBuffer.append(num);
});

}).start();

new Thread(() -> {
IntStream.range(1, 10000).forEach(num -> {
stringBuffer.append(num);
});

}).start();

new Thread(() -> {
Date end = new Date();
long millis = end.getTime() - start.getTime();

try {
Thread.sleep(5000);

System.out.println("StringBuffer length : " + stringBuffer.length());
System.out.println("StringBuffer time(ms) :" + millis);

} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}

private static void strBuilderTest() {
Date start = new Date();
StringBuilder stringBuilder = new StringBuilder();
new Thread(() -> {
IntStream.range(1, 10000).forEach(num -> {
stringBuilder.append(num);
});

}).start();

new Thread(() -> {
IntStream.range(1, 10000).forEach(num -> {
stringBuilder.append(num);
});

}).start();

new Thread(() -> {
Date end = new Date();
long millis = end.getTime() - start.getTime();

try {
Thread.sleep(5000);

System.out.println("StringBuilder length : " + stringBuilder.length());
System.out.println("StringBuilder time(ms) :" + millis);

} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();

}
}

  - 위 소스 결과


 - JDK 1.5버전 부터인지 정확하지는 않지만 String 선언시 문자열을 '+'하는 형태로 작업 할 경우 컴파일시에 StringBuilder로 변경됨.



*참고 페이지

 - https://www.slipp.net/questions/271

 - https://lalwr.blogspot.com/2016/02/string-stringbuffer-stringbuilder.html

https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser?rq=1  에서 본 내용을 간단하게 정리해봄.




결과


'프로그래밍 > Javascript' 카테고리의 다른 글

How to detect browser.  (0) 2018.07.23
IOS 버전 관련 처리  (0) 2018.07.20
[Jquery] .each에서 break, continue 구현하기.  (0) 2018.07.02
How to create dynamic a form!  (0) 2018.06.07
javascript replaceAll 사용하기  (0) 2018.03.08
Timer 구현하기  (0) 2017.01.25

1. IOS Useagent


Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1


2. 하고싶은 것

 - 11.4 버전 이상일 경우를 체크하고 싶다.


 - 소스

function osVersion(){
var mt = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);

if (mt === undefined || mt === null || nt === '') {
return false;
}

var version = [
parseInt(mt[1], 10),
parseInt(mt[2], 10),
parseInt(mt[3] || 0, 10)
];

return parseFloat(version.join('.'))
}

 - 사용법

if (osVersion() > 11.4) {
alert("에러");
}


* IOS 인지 아닌지에 대한 처리는 없습니다. 관련 소스는 추가해서 사용하세요 ^_^

'프로그래밍 > Javascript' 카테고리의 다른 글

How to detect browser.  (0) 2018.07.23
IOS 버전 관련 처리  (0) 2018.07.20
[Jquery] .each에서 break, continue 구현하기.  (0) 2018.07.02
How to create dynamic a form!  (0) 2018.06.07
javascript replaceAll 사용하기  (0) 2018.03.08
Timer 구현하기  (0) 2017.01.25

(작성일 기준으로 1.2.8 버전이 최신버전)


자바(with Spring)를 개발하다보면 Class를 추가/변경 하는 작업을 많이 한다. 그럴때마다 서버를 리스타트하는 일은 엄청나게 번거로운 일이다. 그래서 자동으로 reload 시켜주는 걸 찾아봤다.


1. 설치하기

 - pom.xml

<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.8.RELEASE</version>
</dependency>
</dependencies>
</plugin>
</plugins>


 - jar 다운로드(이 경우에는 다운로드한 경로를 따로 복사해 놓으세요.)

http://mvnrepository.com/artifact/org.springframework/springloaded/1.2.8.RELEASE


4. Spring Boot

 1) maven 명령어로 실행

spring-boot:run 을 실행시킨다.


 2) vm option 추가

-javaagent:<pathTo>/springloaded-{VERSION}.jar -noverify


  (1) Intelli J 일 경우

 - File -> Setting -> Build, Execution, Deployment -> Compiler

Build project automatically 체크!!




  (2) Eclipse 일 경우

    - 추후 작성


5. Spring Framework + Tomcat

 - 추후 작성


6. Daemon 실행

java -javaagent:<pathTo>/springloaded-{VERSION}.jar -noverify SomeJavaClass


7. 테스트 결과

 1) 전역변수 추가 -> 안됨.

  - 테스트 코드(변경 전)

@RequestMapping(value = "/")
public ResponseEntity<String> test() {
return new ResponseEntity<String>("INDEX", HttpStatus.OK);
}

  - 테스트코드(변경 후)

private String ma = "test222";

@RequestMapping(value = "/")
public ResponseEntity<String> test() {
LOG.info("test : {} ", ma);
return new ResponseEntity<String>("INDEX", HttpStatus.OK);
}


  - 결과


 2) @Controller 추가 -> 안됨.

@Controller
public class Test {
@RequestMapping(value = "/test")
public ResponseEntity<String> test2() {
return new ResponseEntity<String>("INDEX 2", HttpStatus.OK);
}
}

 

 3) @RequestMapping 추가 -> 안됨.

@RequestMapping(value = "/test")
public ResponseEntity<String> test2() {
return new ResponseEntity<String>("INDEX 2", HttpStatus.OK);
}

   - 404가 뜬다.


 4) Class 추가 - 됨!!

  - 테스트 코드

public enum TestCd {
BOOK, NOTE;
}

  - 잘 추가/수정 된다.


 5) 지역변수 -> 됨!

@RequestMapping(value = "/")
public ResponseEntity<String> test() {

String testValue = "test test test";
LOG.info("test : {} ", testValue);

return new ResponseEntity<String>("INDEX", HttpStatus.OK);
}

 - 잘 추가/수정 된다.



관련문서

 - https://github.com/spring-projects/spring-loaded

 - https://andromedarabbit.net/spring-loaded%EC%99%80-gradle%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%B4-%ED%95%AB%EC%8A%A4%EC%99%91-%EC%A7%80%EC%9B%90%ED%95%98%EA%B8%B0/

 - http://www.holaxprogramming.com/2015/05/29/spring-boot-and-loaded/





1. X Stream

 - IntStream 은 int를 지정한 범위 내에서 반복문을 동작함

 - LongStream dms Long을 지정한 범위 내에서 반복문을 동작함


2. range, rangeclosed

 - range는 endExclusive 값 전까지만 반복

 - rangeClosed는 endExclusive 를 포함하여 반복


3. IntStream

 - 소스

public class IntRangeTest {

public static void main(String[] args) {
int startNum = 1;
int endNum = 9;

intRangeTest(startNum, endNum);
System.out.println("\n");
intRangeClosedTest(startNum, endNum);

System.out.println("\n");
}

private static void intRangeTest(int startNum, int endNum) {
System.out.print("IntRange Test 1 : ");
IntStream.range(startNum, endNum).forEach(System.out::print);

System.out.println();

System.out.print("IntRange Test 2 : ");
for (int i = startNum; i < endNum; i++) {
System.out.print(i);
}
}

private static void intRangeClosedTest(int startNum, int endNum) {
System.out.print("IntRangeClosed Test 1 : ");
IntStream.rangeClosed(startNum, endNum).forEach(System.out::print);

System.out.println();

System.out.print("IntRangeClosed Test 2 : ");
for (int i = startNum; i <= endNum; i++) {
System.out.print(i);
}
}
}


 - 결과



4. LongStream

 - 소스

public class LongRangeTest {

public static void main(String[] args) {
long startNum = 1L;
long endNum = 9L;

longRangeTest(startNum, endNum);
System.out.println("\n");
longRangeClosedTest(startNum, endNum);

System.out.println("\n");
}

private static void longRangeTest(long startNum, long endNum) {
System.out.print("LongRange Test 1 : ");
LongStream.range(startNum, endNum).forEach(System.out::print);

System.out.println();

System.out.print("LongRange Test 2 : ");
for (long i = startNum; i < endNum; i++) {
System.out.print(i);
}
}

private static void longRangeClosedTest(long startNum, long endNum) {
System.out.print("LongRangeClosed Test 1 : ");
LongStream.rangeClosed(startNum, endNum).forEach(System.out::print);

System.out.println();

System.out.print("LongRangeClosed Test 2 : ");
for (long i = startNum; i <= endNum; i++) {
System.out.print(i);
}
}
}

 

 - 결과

<!-- 리사이즈 변경 불가 -->
<textarea style="resize: none;"></textarea>
<!-- vertical horizontal 둘다 가능 -->
<textarea style="resize: both;"></textarea>
<!-- vertical 둘다 가능 -->
<textarea style="resize: vertical;"></textarea>
<!-- horizontal 둘다 가능 -->
<textarea style="resize: horizontal;"></textarea>


'프로그래밍 > html & css' 카테고리의 다른 글

Bootstrap 사용하기  (0) 2018.08.08
textarea 리사이즈 관련  (0) 2018.07.16
radio, checkbox clear 버튼 만들기.  (0) 2018.04.25
<html lang="ko">  (0) 2018.04.09
html tag(select box, checkbox) Readonly(?)처럼 사용하기  (0) 2018.03.08

업무 중에 엑셀 다운로드 기능에 "암호 걸기"가 필요해짐.


1. pom.xml에 필요한 dependencyt 추가

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>


2. 샘플

 - 아래와 같이 설정해주면 잘 나온다.

EncryptionInfo encryptionInfo = new EncryptionInfo(EncryptionMode.agile);
Encryptor encryptor = encryptionInfo.getEncryptor();
encryptor.confirmPassword(password);


 - 결과


3. 전체소스

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.poifs.crypt.EncryptionInfo;
import org.apache.poi.poifs.crypt.EncryptionMode;
import org.apache.poi.poifs.crypt.Encryptor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;

import java.io.*;
import java.security.GeneralSecurityException;
import java.util.Arrays;
import java.util.List;

@Slf4j
public class ExcelTest {

@Test
public void 엑셀파일에_암호걸기() {
final String password = "1234";
final String savePath = "c:\\temp\\excel2.xlsx";

List<String> tmpData = Arrays.asList("Java", "JavaScript", "Python", "GoLang");

try (Workbook wb2 = new XSSFWorkbook();
ByteArrayOutputStream fileOut = new ByteArrayOutputStream();
FileOutputStream fos = new FileOutputStream(savePath);) {

Sheet sheet1 = wb2.createSheet("Sheet1");

//Write Excel File
for (int i = 0; i < tmpData.size(); i++) {
String data = tmpData.get(i);

Row row = sheet1.createRow(i);
Cell cell = row.createCell(0);

cell.setCellValue(data);

}

wb2.write(fileOut);

InputStream filein = new ByteArrayInputStream(fileOut.toByteArray());
OPCPackage opc = OPCPackage.open(filein);

POIFSFileSystem fileSystem = new POIFSFileSystem();

EncryptionInfo encryptionInfo = new EncryptionInfo(EncryptionMode.agile);
Encryptor encryptor = encryptionInfo.getEncryptor();
encryptor.confirmPassword(password);

opc.save(encryptor.getDataStream(fileSystem));
fileSystem.writeFilesystem(fos);

log.info("Create Excel File!!");

} catch (IOException e) {
log.error(e.getMessage(), e);

} catch (InvalidFormatException e) {
log.error(e.getMessage(), e);

} catch (GeneralSecurityException e) {
log.error(e.getMessage(), e);
}

}

}


+ Recent posts