지식메모

 

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

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 배열의 사이즈만큼 알아서 콤보박스에 값이 노출되었다

 

 

 

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

갤럭시 노트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 파일 복사해서 데스크탑에 붙여넣었더니 해결...

 

증말...

 



보통 파티션은 컴퓨터 관리에서 가능한데

윈도우7에서 하드디스크 파티션 나누기 합치기

https://yonoo88.tistory.com/187


왠걸 SSD 포맷을 하려고 디스크 관리에서 볼륨을 삭제하고 합치려고 했는데 아래와 같은 복구파티션이라는 부분이 삭제가 안됐다

우클릭을 해도 도움말 메뉴만 나오는 상황



이걸 해결하기 위해 CMD를 관리자 권한으로 실행

아래와 같은 명령어를 입력해준다

디스크 0, 디스크 1 구분은 컴퓨터 관리 > 디스크 관리 메뉴에 나오는 걸로 확인하면 된다.


이 과정이 끝나면 복구파티션도 삭제 및 생성 등  파티션 관리가 가능해진다.




다수의 영상이 존재할 때 한번에 영상의 길이를 동일하게 맞추는 방법

다빈치 리졸브 15.2.4 기준





단축키로 공백을 한방에 없애는 꿀팁이 있었따.







영상을 보다보면 종종 아래 사진과 같이 영상과 똑같은 영상을 배경으로 집어넣은 영상이 있다.


다빈치 리졸브 15.2.4 에서 이 기능이 추가되었다









핵심은 Blanking Fill 이라는 효과로 Effect Library 에서 사용할 수 있다. 

Blanking Fill을 끌어다 타임라인에 가져다 놓으면 배경이 삽입되고




우측 상단 OpenFx에서 Blur Background 수치를 조절하여 배경의 흐릿함을 조절할 수 있다



특히 세로영상인 경우 가로영상일 때 양쪽 빈 공간이 생기는데 그럴 때 사용하기 딱 좋은 기능이다.






자동화를 하면 항상 새 크롬창을 띄웠는데 현재 실행 중인 크롬 창에서 실행할 수는 없을까해서 검색해본 결과


무조건 한번은 새로 크롬을 새로 띄워야 한다는 결론에 도달.


그리고 그 크롬에서 적용 할 수 있었다.


첫번째 해야할 것은 (크롬드라이버 다운은 필수)


cmd에서 디버그용? 크롬을 실행시켜야 한다


chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\AutomationProfile" 


이걸 cmd에서 실행해보면 크롬이 실행된다.


안된다면 C:\Program Files (x86)\Google\Chrome\Application\ 이 경로로 이동해서 실행해보거나


환경변수에 위 경로를 추가해준다.



이 크롬으로 계속 재활용할 수 있다.


이제 이걸 자바 코드 내에 cmd 실행을 시킨다음 실행해주면 된다.


참고로 코드 내에서 실행할 때는 완전한 경로로 해주어야 실행이 된다.


 Runtime.getRuntime().exec("C:/Program Files (x86)/Google/Chrome/Application/chrome.exe --remote-debugging-port=9222 --user-data-dir=\"C:/selenum/AutomationProfile\"");


위 코드를 먼저 실행해 준 다음


ChromeOptions options = new ChromeOptions();

options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");

driver = new ChromeDriver(options); 


크롬 옵션을 추가해주어 실행된 크롬창을 사용하도록 지정해준다.(9222포트는 위 실행명령어 포트와 동일)



전체적인 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Automation {
 
    private static WebDriver driver;
 
    @BeforeClass 
    public static void setUp() throws Exception { 
        System.setProperty("webdriver.chrome.driver""C:\\chromedriver.exe");
            
        Runtime.getRuntime().exec("C:/Program Files (x86)/Google/Chrome/Application/chrome.exe --remote-debugging-port=9222 --user-data-dir=\"C:/selenum/AutomationProfile\"");
 
        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("debuggerAddress""127.0.0.1:9222");
        driver = new ChromeDriver(options);
        
        System.out.println(driver.getTitle());
        driver.manage().window().maximize();
        driver.get("https://www.naver.com");
        
    }
}
cs



 자동화 실행 후 현재 실행중인 크롬에서 확인해보려면  Runtime.getRuntime().exec 코드를 주석처리하고 실행하면 확인해볼 수 있다


주석처리를 안하면 실행할 때마다 새로운 크롬이 생성된다.



+ Recent posts