기본 코드는 이 링크를 참고하였습니다.

https://javaslave.tistory.com/78

 

POI Library를 이용한 Excel Read

Apache POI Grid 형태의 데이터를 핸들링 하는 화면에는 보통 '엑셀다운로드', '엑셀업로드' 버튼이 존재한다. 이를 구현하기 위해서 Apache에서 제공하는 POI 라이브러리를 이용하는 방법을 알아보도록 하자. Jav..

javaslave.tistory.com

 

POI 버전은 3.11을 사용하였습니다. (최신 poi 4점대 버전에서는 코드가 동작하지 않습니다)

poi 3.11 라이브러리 파일

lib (2).zip
7.51MB
lib.zip
3.21MB

용량 제한으로 압축파일 2개로 나뉘어 첨부함

 

사용 용도 

엑셀 내용( 확장자 xlsx 필수)
account.xlsx
0.01MB

위와 같은 엑셀 내용에서 각 열 별로 데이터를 긁어와 각 ArrayList에 저장함

로그인시

ID에는 ArrayList1.get(0)

암호에는 ArrayList2.get(0) 

이런 식을 1:1 매칭해서 로그인에 활용하는 단순 용도

총 6개의 ArrayList  선언 (액셀에 총 6개의 열이 있기 때문)

 

스위치 문에서 각 열마다 1개의 ArrayList에 값을 넣음

발생하는 문제점

첫 열의 개수에 따라 나머지 열의 개수가 결정됨

첫 열이 10개고 나머지 열이 20개,16개 등등 제 각기라면 첫 열 기준으로 모두 10개의 데이터만 가져오게 되는 문제가 존재함

 

전체 코드

package poi;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class POIReader {
    public static List<String> account1 = new ArrayList<String>();
    public static List<String> account2= new ArrayList<String>();
    public static List<String> account3 = new ArrayList<String>();
    public static List<String> account4 = new ArrayList<String>();
    public static List<String> account5 = new ArrayList<String>();
    public static List<String> account6 = new ArrayList<String>();
    
   /**
    * XLSX 파일을 분석하여 List<poi> 객체로 반환
    * @param filePath
 * @return 
    * @return
    */
   public static void xlsxTopoiList(String filePath) {
       // 반환할 객체를 생성
       FileInputStream fis = null;
       XSSFWorkbook  workbook = null;
       
       try {
           
           fis= new FileInputStream(filePath);
           // XSSFWorkbook은 엑셀파일 전체 내용을 담고 있는 객체
           workbook = new XSSFWorkbook (fis);
           
           // 탐색에 사용할 Sheet, Row, Cell 객체
           XSSFSheet curSheet;
           XSSFRow   curRow;
           XSSFCell  curCell;
//           poiList vo;
           
           // Sheet 탐색 for문
           for(int sheetIndex = 0 ; sheetIndex < workbook.getNumberOfSheets(); sheetIndex++) {
               // 현재 Sheet 반환
               curSheet = workbook.getSheetAt(sheetIndex);
               
               // row 탐색 for문
               for(int rowIndex=0; rowIndex < curSheet.getPhysicalNumberOfRows(); rowIndex++) {
                   // row 0은 헤더정보이기 때문에 무시
                   if(rowIndex != 0) {
                       // 현재 row 반환
                       curRow = curSheet.getRow(rowIndex);
//                       vo = new poiList();
                       String value;
                           // row의 첫번째 cell값이 비어있지 않은 경우 만 cell탐색
                       System.out.println("---"+curRow.getCell(0));
                       if(curRow.getCell(0) != null){ // 첫번째열 모자를 때 구분
                    	   if(!"".equals(curRow.getCell(0).getStringCellValue())) {
                               
                               // cell 탐색 for 문
                               for(int cellIndex=0;cellIndex<curRow.getPhysicalNumberOfCells(); cellIndex++) {
                                   curCell = curRow.getCell(cellIndex);
                                   
                                   if(true) {
                                       value = "";
                                       // cell 스타일이 다르더라도 String으로 반환 받음
                                       if(curCell != null){ //각 열의 목록 길이에 따라 분기
                                    	   switch (curCell.getCellType()){
                                           case XSSFCell.CELL_TYPE_FORMULA:
                                               value = curCell.getCellFormula();
                                               break;
                                           case XSSFCell.CELL_TYPE_NUMERIC:
                                               value = curCell.getNumericCellValue()+"";
                                               break;
                                           case XSSFCell.CELL_TYPE_STRING:
                                               value = curCell.getStringCellValue()+"";
                                               break;
                                           case XSSFCell.CELL_TYPE_BLANK:
                                               value = curCell.getBooleanCellValue()+"";
                                               break;
                                           case XSSFCell.CELL_TYPE_ERROR:
                                               value = curCell.getErrorCellValue()+"";
                                               break;
                                           default:
                                               value = new String();
                                               break;
                                           }
                                       }
                                       switch (cellIndex) {
                                       case 0: // name
                                    	   account1.add(rowIndex-1, value);
                                           break;
                                           
                                       case 1: // 암호                                	   
                                    	   account2.add(rowIndex-1, value);
                                           break;
                                           
                                       case 2: // 여기서 하나씩 분류
                                    	   account3.add(rowIndex-1, value);
                                           break;
           
                                       case 3: // 여기서 하나씩 분류
                                    	   account4.add(rowIndex-1, value);
                                           break;
                                           
                                       case 4: // 여기서 하나씩 분류
                                    	   account5.add(rowIndex-1, value);
                                           break;
                                           
                                       case 5: // 여기서 하나씩 분류
                                    	   account6.add(rowIndex-1, value);
                                           break;
                                       default:
                                           break;
                                       }
                                   }
                               }
                           }
                       }
                       
                   }
               }
           }
       } catch (FileNotFoundException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
           
       } finally {
           try {
               // 사용한 자원은 finally에서 해제
               if( workbook!= null) 
            	   workbook.close();
               if( fis!= null) fis.close();
               
           } catch (IOException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
           }
       }
   }
}

 

 

깜빡 하면서 실행되지 않는다

최신 버전의 이클립스를 사용하다가 플러그인이 지원을 하지 않아 구 버전(Neon) 이클립스를 받아서 실행하였다

그런데 실행이 되지 않는다. 또 한참을 삽질을 했다.

이 현상을 해결하기 위해 구글링을 해보면 eclipse.ini 파일 수정하라는 얘기가 제일 많이 나온다

-vm 에 자바 경로를 추가해라..

java.se.ee 였나 이거 추가해라.. 등등이 있는데 전혀 해결되지 않았다

결론은 자바 버전이 문제였다

자바를 11.0.2 최신 버전을 설치했었는데 이게 이클립스 구버전에서 지원이 안되는 것이었나보다.

자바를 지우고 구버전 JDK 1.8.0을 설치하였따

그랬더니 단번에 해결..

오늘도 역시나 최신 업데이트는 함부로 하는게 아니라는 진리를 깨달았다..

String 배열을 사용해서 콤보박스에 값들을 보여줬었는데

ArrayList를 사용해서 콤보박스에 보여주고 싶었따.

스트링 배열은 String[] account1 = { id,id1,id2}

이런식으로 콤마로 이루어진 값이었는데 ArrayList는 배열마다 각 값을 가지고 있기 때문에 나중에 관리하기 편할 것 같았다.

기존 String 배열(account1)을 콤보박스에 넣었을 때 코드

JComboBox<?> comboBox = new JComboBox<Object>(account1);

ArrayList(account1)를 콤보박스에 넣을 때 코드

JComboBox<?> comboBox = new JComboBox(account1.toArray(new String[account1.size()]));

이렇게 하면 account1 배열의 사이즈만큼 알아서 콤보박스에 값이 노출되었다

나이키 토트넘 핫스퍼 아카데미 드릴탑 트레이닝 세트 구매

신제품이지만 날씨는 점점 더워지고 있다. 다시 추워질 때 입으면 되니 구매

상하의 세트로 S 사이즈를 주문. 드릴탑은 기모처리가 되어있다

그런데 전에 구매한 스쿼드 드릴탑(https://yonoo88.tistory.com/1230) 과 사이즈 비교했을 때 상의는 좀 더 작게 나왔는지 타이트했다. 지퍼도 올리면 목이 조이는 느낌이 들 정도. 하의는 만족

그런데 스쿼드 드릴탑보다는 신축성은 조금 떨어진다. 그래서 사이즈가 작게 느껴지는 것 같기도 하다.

그래도 디자인은 스쿼드 드릴탑 보다 낫다고 생각됨.

NVY S Spurs Nike Adult THFC Academy Drill Top
NVY S Spurs Nike Adult THFC Academy Drill Top 뒷모습
NVY S Spurs Nike Adult THFC Academy Drill Top 안감 기모처리
NVY S Spurs Nike Adult THFC Academy Pant

이번에 새로 나온 아카데미 THFC 트레이닝 

여름을 대비하여 구매하였다. 사이즈는 M으로 주문했는데 티셔츠는 사이즈가 맞는데 바지가 생각보다 허리가 컸다

이전에 구매했던 트레이닝 반바지(https://yonoo88.tistory.com/1254)는 M이면 딱 좋았는데 이거는 줄로 좀 조여줘야 했다.

옷 마다 또 사이즈가 다른 건 여전한가 보다. 

그리고 이 제품을 산 건 디자인 또한 마음에 들었다. 17 18 어웨이를 연상시키는 디자인이고 그냥 캐주얼하게 입고 다녀도 무난한 색상이라 구매하였다.

NVY M Spurs Nike Adult THFC Academy T-Shirt
NVY M Spurs Nike Adult THFC Academy Shorts

 

 

 

언제나 그랬듯이 오랜만에 건드리는 것들은 어김없이 에러를 내뱉는다

갤럭시 노트9 안드로이드 9.0 으로 올리고 uiautomatorviewer 를 실행시켜서 화면 캡쳐를 하려 했더니만..

Error taking device screenshot: EOF

얜 또 뭘까..?? EOF 뭔가 DJ 페스티벌 이름 같다.

 

해결책

결론적으로는 희한하게 노트북에서는 uiautomator가 정상적으로 동작했는데 노트북에 설치되어있는 adb.exe 파일을 복사해서 데스크탑에 붙여넣기 했더니 해결되었다.

uiautomator가 동작했던 노트북의 sdk 설치현황

 

 

 

경로는 SDK가 설치된 폴더로 가서 sdk\platform-tools 이 경로에 붙여넣기 해야한다.

단 혹시 모르니 기존 adb.exe 파일은 백업해놓고 하는 것이 좋다

 

바로 이 26.0.2 버전의 adb 파일을 붙여 넣어 해결이 되었다.. 확장자를 바꾼거라 압축을 풀지 않고 .zip > .exe 로 바꿔주어야 한다. 귀중한 파일이기에 첨부

 

adb.zip
1.47MB

 

추정원인

adb 버전이 문제인 것 같다. 구글링 했을 때도 adb 버전을 낮추라는 의견이 있었는데 "귀찮아서" 다른 해결책들만 주구장창 해봤는데 결국 adb 이놈이 문제인 것 같다.

 

노트북의 Android SDK PlatformTools 버전은 26.0.2
데스크탑의 Android SDK PlatformTools 버전은 28.0.2

데스크탑의 Android SDK PlatformTools 버전이 더 높았다. 결국 버전을 낮추는게 해결책이었던 것 같다.

 

현재 데스크탑 SDK 설치 현황

 

이 방법 말곤 해결책이 없는걸까? 그럴리가 없을 것 같은데 아직 패치가 안된건가... 아무튼 해결됐으니..

혹시나 같은 문제를 겪고 있는 외국 유저들을 위해

Replace adb.exe! to Android SDK Platform-Tools 26.0.2 version of adb.exe!


 

 

시도해본 해결책들 - 참고할 필요 없으나 삽질 방지용 기록

구글링을 해봤는데 뭐 uiautomatorviewer.bat 파일을 편집하기도 하고 adb버전을 낮추라는 둥? 답변이 있었는데 그것까진 너무 귀찮았고(이걸 진작에 해봤어야 했는데..)

고민해본 결과 아무래도 안드로이드 9.0 파이에 대한 무언가가 설치가 안됐을 거라는 결론에 도달

안드로이드 스튜디오를 켜고 SDK 매니저를 열어서, 일단 안드로이드 9가 API 28버전이기 때문에 SDK 플랫폼에서 28버전을 설치해보았다

Android API 28 체크 후 Apply
설치

설치가 끝나고 다시 uiautomatorviewer를 실행 후 디바이스 스크린샷을 시도했지만 실.패.

(지금 생각해보니 이 때 안드로이드 스튜디오를 끄지 않았었는데 이것 때문일까 라는 생각이 든다)

그래서 뭐 또 설치 안한게 있나 살펴보다가 SDK Tools 탭에서 Android SDK Build-Tools 29-rc2 라는 놈이 있었는데

Android SDK Build-Tools 29-rc2 업데이트가 가능하다고 떠있다

 

 

Show Package Details를 클릭해보니 좌르륵 뜬다

여기서 살펴보니 28 버전 설치되어 있는게 아무 것도 없었다

 

그래서 가장 최신 28.0.3을 설치해주었다

28.0.3 체크 후 Apply

 

중간에 뭐 이런게 떴는데 걍 Next 해서 설치 완료

 

그리고 다시 해보니 스크린 샷이 떴다..?? 뭐지 그런데 다시 재시도 하니까 재발..

 

 

이건 아니다 싶어 다시 검색해본 결과  HXAM 얘가 유력한 원인인 것 같았다.

 

Hyper-V를 끄라는 답변이 많았다

그래서 끄려고 봤는데 없다..? 윈도우7이라 그런가 데스크탑에 뜨질 않는다. 아무래도 내 컴이 해킹을 당한건가... 온갖 문제는 다 생기는 것 같다.

 

그래서 저걸 끄는 방법을 또 구글링...

https://github.com/intel/haxm/wiki/Installation-Instructions-on-Windows

 

intel/haxm

Intel® Hardware Accelerated Execution Manager (Intel® HAXM) - intel/haxm

github.com

여기 들어가보니 커맨드 라인으로 끄는 법이 있었다

To verify that Intel HAXM is running, open a Command Prompt window with administrator privileges (Run as Administrator) and execute the following command:

sc query intelhaxm

If Intel HAXM is working, the command will show a status message indicating that the state is: "4 RUNNING".

To stop or start Intel HAXM, use these commands:

Stop:

sc stop intelhaxm

Start:

sc start intelhaxm

따라해보니 성공적으로 되었다.

 

이젠 되겠지..? 다시 uiautomatorviewer를 실행해서 캡쳐를 해보았는데 또 실패...

 

하....

이후로 sdk 재설치.. 안드로이드 스튜디오 재설치... SDK Tools 에서 intelHXAM intaller 재설치...

이걸로 이틀을 날렸다.. 그러다 3일 째 adb 버전 낮추라는 말이 번뜩 생각나서 노트북에 있는 adb.exe 파일 복사해서 데스크탑에 붙여넣었더니 해결...

 

증말...

 

 

 

 

삼성 갤럭시S10 사전예약으로 받은 갤럭시 버즈가 드디어 도착

 

 

 

버즈에 장착된 것 포함 총 3종의 이어팁과 윙팁 제공

 

원래 검정을 받으려고 했지만 화이트만 받을 수 있어서 아쉬웠는데 막상보니 화이트가 더 예쁜 것 같다


일주일간 갤럭시 버즈 써본 후기

1. 우선 유선 이어폰 쓰다 무선을 쓰니 신세계 선으로부터 해방감

2. 케이스도 들고 다녀야 하니 케이스 잃어버릴까 신경쓰이긴 함

3. 음질도 괜찮고 사람많은 곳에서 소리 끊김은 아직 못 느낌

4. 터치로 음량조절도 가능하다는게 진짜 편했음
(단 터치로 음량조절시 즉시 주변소리 듣기 기능은 사용불가)

5. 귀에 맞는 윙팁과 이어팁 장착시 귀에서 빠질 걱정 없을 정도로 잘 맞음

6. 통화할 때 상대방은 잘 들린다고 함

 

선 없는 자유로움이 정말 크다. 배터리는 케이스도 있으니 부족함은 없을 것 같고 부족해도 폰으로 무선충전도 가능하니 정말 좋은 아이템이 될 것 같다.

 

 

 

 

 

EB-P1100 삼성 고속 충전 보조 배터리 10000mAh 보러가기 (유선충전만 지원)

https://yonoo88.tistory.com/1281

 

EB-P1100 삼성 고속 충전 보조 배터리 10000mAh

샤오미 보조배터리를 살까 하다가 어차피 갤10을 쓰고 있으니 같은 삼성으로 써보자 해서 구입 배송비 합쳐 18000원에 구입(정가 21000원) 재질은 플라스틱이 아닌 금속 느낌의 재질로 모서리에 폰이 긁힐 경우..

yonoo88.tistory.com

 

무선충전의 시대다 보니 무선충전배터리가 갖고 싶어졌다.

그래서 구입한 삼성 무선충전배터리 EB-U1200

구성품은 설명서, 배터리, 케이블이 전부

 

그런데 생각보다 커서 놀랬다.. 샤오미와 비교 했을 때 훨씬 컸다. 대신 두께는 반 정도 였지만..

샤오미에 비해 거의 2배 수준의 크기
두께는 1/2 수준

 

길 가는 중에 배터리가 없어서 보조 배터리 연결하고 다닐 경우 한손에 들고 다니기 좀 큰 감이 없지 않나 싶다

아직 기술적으로는 이정도 크기가 최선인가 싶기도 하고 다음에 새로운 배터리가 출시된다면

지금보다는 작은 크기로 나왔으면 좋을 것 같다.

+ Recent posts