JAVA 크롤러 만들기 3 - 엑셀, 증권 정보 크롤링

반응형

엑셀 데이터 다루기

jexcel(JXL) 라이브러리 다운로드

JAVA 에서 Excel 파일을 다루기 위해서는 일반적으로 JXL 라이브러리를 활용한다.
jexcel api 다운로드
해당 API 의 Excel 지원 버전은 2003 이지만 여전히 많이 쓰이는 API 이다.
(또는 POI 라이브러리를 활용할 수도 있다.)

프로젝트에 JXL 추가하기

다운로드 받은 jar 파일을 프로젝트에 추가한다.
intellij, ecelipse 에서 프로젝트에 jar 라이브러리를 추가하는 방법은 다음 링크를 참고한다.

Eclipse에서 프로젝트에 외부 jar 추가하기
IntelliJ에서 프로젝트에 외부 jar 추가하기

JXL 엑셀파일 제어 기초

github 소스코드 보기

JXL 기본 조작 예제

  • 엑셀파일 생성
  • Sheet 생성
  • Cell 에 데이터 입력 (Label)
import java.io.File;

import jxl.Workbook;  
import jxl.write.Label;  
import jxl.write.WritableSheet;  
import jxl.write.WritableWorkbook;

public class ExcelWriteEx01 {

    public static void main(String[] args) {
        File file = new File("C:\\Users\\pc-13\\Desktop\\test.xls");
        try {
            //1.엑셀파일생성
            WritableWorkbook workbook = Workbook.createWorkbook(file);

            //2.Sheet 생성
            WritableSheet sheet = workbook.createSheet("Sheet1", 0);

            //3.cell에 들어갈 데이터를 생성 -> Label(열, 행, 데이터)
            Label label = new Label(0, 0, "(0,0)");

            //4.cell에 저장
            sheet.addCell(label);

            label = new Label(2, 3, "(2,3)");
            sheet.addCell(label);

            sheet = workbook.createSheet("Sheet2", 1);
            label = new Label(2, 3, "(2,3)");
            sheet.addCell(label);

            //엑셀파일 저장
            workbook.write();
            workbook.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

반응형

 

JXL for 문 활용하여 여러 cell에 데이터 입력 예제

import java.io.File;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class ExcelWritePractice01 {

    public static void main(String[] args) {
        File file = new File("C:\\Users\\pc-13\\Desktop\\practice.xls");
        try {
            //1.엑셀파일생성
            WritableWorkbook workbook = Workbook.createWorkbook(file);

            //2.Sheet 생성
            WritableSheet sheet = workbook.createSheet("Sheet1", 0);

            for (int i = 0; i < 10; i++) {
                for (int j = 0; j < 10; j++) {
                    Label label = new Label(j, i, i + "" + j);
                    sheet.addCell(label);
                }
            }            

            //엑셀파일 저장
            workbook.write();
            workbook.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

JXL 2차원 배열 데이터 입력하기 예제

import java.io.File;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class ExcelWritePractice02 {

    public static void main(String[] args) {
        File file = new File("C:\\Users\\pc-13\\Desktop\\2017년_급여현황.xls");
        String[][] salary = {{"부서", "성명", "직위", "급여"}, 
                                    {"영업부", "이수진", "대리", "1500000"},
                                    {"사업부", "박참봉", "과장", "2150000"},
                                    {"개발부", "김무봉", "부장", "2700000"},
                                    {"기획부", "마진혁", "사원", "1200000"},
                                    {"경리부", "진소라", "대리", "1500000"},
                                    {"행정부", "이시후", "사원", "1200000"}};

        try {
            //1.엑셀파일생성
            WritableWorkbook workbook = Workbook.createWorkbook(file);

            //2.Sheet 생성
            WritableSheet sheet = workbook.createSheet("Salary", 0);

            for (int i = 0; i < salary.length; i++) {
                for (int j = 0; j < salary[i].length; j++) {
                    Label label = new Label(j, i, salary[i][j]);
                    sheet.addCell(label);
                }
            }

            //엑셀파일 저장
            workbook.write();
            workbook.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

JXL 엑셀 데이터 불러오기 예제

import java.io.File;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;

public class ExcelRead {

    public static void main(String[] args) {
        //1.¿¢¼¿ÆÄÀÏÀоî¿À±â

        File file = new File("C:\\Users\\pc-13\\Desktop\\practice.xls");
        try {
            Workbook workbook = Workbook.getWorkbook(file);

            Sheet sheet = workbook.getSheet(0);

            for (int i = 0; i < 10; i++) {
                for (int j = 0; j < 10; j++) {
                    Cell cell = sheet.getCell(j, i);

                    System.out.print(cell.getContents() + "\t");
                }
                System.out.println();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

JXL 실습, 사원정보 엑셀로 입력하기 예제

JAVA에서 Excel 로 사원정보 입출력 예제

Info.java

public class Info {
    private String department;
    private String name;
    private String level;
    private String salary;

    public Info(String department, String name, String level, String salary) {
        this.department = department;
        this.name = name;
        this.level = level;
        this.salary = salary;
    }

    public String getDepartment() {
        return department;
    }
    public String getName() {
        return name;
    }
    public String getLevel() {
        return level;
    }
    public String getSalary() {
        return salary;
    }
}

InfoMain.java

import java.io.File;
import java.util.ArrayList;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class InfoMain {
    public static void main(String[] args) {
        File file = new File("C:\\Users\\pc-13\\Desktop\\2017년_급여현황.xls");

        try {
            // 1.엑셀파일생성
            WritableWorkbook workbook = Workbook.createWorkbook(file);

            // 2.Sheet 생성
            WritableSheet sheet = workbook.createSheet("Salary", 0);

            String[] arr = { "부서", "이름", "직위", "급여" };

            ArrayList<Info> list = new ArrayList<Info>();
            list.add(new Info("영업부", "이수진", "대리", "1500000"));
            list.add(new Info("사업부", "박참봉", "과장", "2150000"));
            list.add(new Info("개발부", "김무봉", "부장", "2700000"));
            list.add(new Info("기획부", "마진혁", "사원", "1200000"));
            list.add(new Info("경리부", "진소라", "대리", "1500000"));
            list.add(new Info("행정부", "이시후", "사원", "1200000"));

            Label label = null;
            for (int i = 0; i < arr.length; i++) {
                label = new Label(i, 0, arr[i]);
                sheet.addCell(label);
            }

            for (int i = 0; i < list.size(); i++) {
                for (int j = 0; j < arr.length; j++) {
                    switch (j) {
                    case 0:
                        label = new Label(j, i+1, list.get(i).getDepartment());
                        sheet.addCell(label);
                        break;
                    case 1:
                        label = new Label(j, i+1, list.get(i).getName());
                        sheet.addCell(label);
                        break;
                    case 2:
                        label = new Label(j, i+1, list.get(i).getLevel());
                        sheet.addCell(label);
                        break;
                    case 3:
                        label = new Label(j, i+1, list.get(i).getSalary());
                        sheet.addCell(label);
                        break;
                    }
                }
            }

            // 엑셀파일 저장
            workbook.write();
            workbook.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

JAVA 증권정보 크롤러 with Excel 예제

웹에 존재하는 증권정보를 크롤링하여 엑셀파일로 저장하는 예제를 진행해보자

  • 네이버 코스피 시세 페이지의 시간별시세 iframe 태그의 속성인 src 의 값을 가져오기
  • 표 형태의 자료 처리(엑셀 컨트롤과 연동)
package com.finance;

import java.io.File;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class FinanceCrawling {

    public static void main(String[] args) {
        String url = "http://finance.naver.com/sise/sise_index.nhn?code=KOSPI";

        File file = new File("C:\\Users\\pc-13\\Desktop\\증권.xls");

        try {
            Document financePage = Jsoup.connect(url).get();

            // 1.엑셀파일생성
            WritableWorkbook workbook = Workbook.createWorkbook(file);

            // 2.Sheet 생성
            WritableSheet sheet = workbook.createSheet("finance", 0);

            // System.out.println(financePage.select(".box_type_m + iframe").attr("src"));

            Document iFrameUrl = Jsoup
                    .connect("http://finance.naver.com" + financePage.select(".box_type_m + iframe").attr("src")).get();

            Elements titles = iFrameUrl.select("tr > th"); // 제목
            Elements date = iFrameUrl.select(".date"); // 체결시각
            Elements money = iFrameUrl.select(".number_1"); // 체결가, 변동량, 거래량, 거래대금
            Elements rate_down = iFrameUrl.select(".rate_down"); // 전일비

            Label label = null;
            for (int i = 0; i < titles.size(); i++) {
                label = new Label(i, 0, titles.get(i).text());
                sheet.addCell(label);
            }

            System.out.println(titles.text());
            for (int i = 0; i < date.size(); i++) {
                System.out.print(date.get(i).text() + " "); // 체결시각
                System.out.print(money.get(i * 4).text() + " "); // 체결가
                System.out.print(rate_down.text() + " "); // 전일비
                System.out.print(money.get((i * 4) + 1).text() + " "); // 변동량
                System.out.print(money.get((i * 4) + 2).text() + " "); // 거래량
                System.out.println(money.get((i * 4) + 3).text() + " "); // 거래대금

                label = new Label(0, i + 1, date.get(i).text());
                sheet.addCell(label);
                label = new Label(1, i + 1, money.get(i * 4).text());
                sheet.addCell(label);
                label = new Label(2, i + 1, rate_down.text());
                sheet.addCell(label);
                label = new Label(3, i + 1, money.get((i * 4) + 1).text());
                sheet.addCell(label);
                label = new Label(4, i + 1, money.get((i * 4) + 2).text());
                sheet.addCell(label);
                label = new Label(5, i + 1, money.get((i * 4) + 3).text());
                sheet.addCell(label);
            }

            // 엑셀파일 저장
            workbook.write();
            workbook.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
반응형

Designed by JB FACTORY