jquery csv파일로 export 하기

2021. 1. 21. 23:54·dev/web
728x90
반응형
SMALL

웹에서 export로 csv 파일로 다운로드 하는 경우가 많이 생긴다. 

이번에는 jquery로 간단하게 csv파일로 다운로드 하는방법을 알아보자. 

 

위 이미지와 같은 웹이 있을 경우 export 버튼을 csv파일로 내보내도록하자. 

우선 버튼이 어떻게 만들어 졌는지 보면 

 

    <div class="div_button_wrap">
        <div id="export_button" onclick="downloadCSV()">export</div>
    </div>

export 버튼을 누르면 downloadCSV()함수를 호출한다. 

그럼 downloadCSV() 구조를 보자.

 

   function downloadCSV() {
        const fileName = "userList.csv";
        const csv = convertNodeToCsvString();

        var link = document.createElement("a");
        var blob = new Blob(["\uFEFF"+csv], {type: 'text/csv; charset=utf-8'});
        var url = URL.createObjectURL(blob);
        $(link).attr({"download" : fileName , "href" : url});
        link.click();
    }

파일이름은 userList.csv로 지정해 줬다. 

covertNodeToCsvString() 함수로 csv 포멧으로 만들어 줄 것이다. 

 

  function convertNodeToCsvString() {
        var result = "";
        var node = $(".div_table_title").children();

        $(node).each(function (index, value) {
           result += $(value).text() + ",";
        })
        result += "\n";

        var itemNodes = $(".div_table_list").children();
        $(itemNodes).each(function (index, value) {
            result += $(value).find(".row_no").text() +",";
            result += $(value).find(".row_name").text() +",";
            result += $(value).find(".row_gender").text() +",";
            result += $(value).find(".row_phone").text() +",\n";
        })
        return result;
    }

csv는 ,로 구분하고 \n으로 행을 바꾼다. 

우선 제목부분으로 행을 만들고 줄바꿈을 해준다. 

그다음은 이제 데이터 부분을 만들어준다. 

 

blob = new Blob은 Binary Large Objects의 약자 대용량 바이너리 객체라고 생각하면 된다.

더 쉽게 파일같은 데이터를 배열로 담아주는 역활을 한다. 

 

 

'\uFEFF' + csv는 어떤의미를 할까?

쉽게 말하면 인코딩 식별자라고 생각하면 될 것 같다. 

자세히 설명을 하기 위해선 BOM부터 조금 깊게 설명이 필요하지만 

여기서는 스킵하도록한다. 

 

그 외 코드는 blob 객체를 url로 만들고 a태그에  attributes를 줘서 강제로 클릭시 켜서 다운로드 하게 하는 방법이다. 

 

마지막으로 전체소스 코드와 함꼐 마무리 합니다.

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>csv 파일 export</title>

    <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
    
</head>
<style>
    .div_table {
        display        : flex;
        flex-direction : column;
        width          : 1200px;
        position       : absolute;
        transform      : translate(-50%, -50%);
        top            : 50%;
        left           : 50%;
    }

    .item_row,
    .div_table_title {
        display       : flex;
        height        : 50px;
        line-height   : 50px;
        border-bottom : 1px solid #C1C1C1;
    }

    .div_table_title {
        border-top : 1px solid #C1C1C1;
    }

    .item_row > div,
    .div_table_title > div {
        min-width  : 300px;
        text-align : center;
    }

    .div_table_title > div {
        font-weight : bold;
    }

    .item_row > div:first-child,
    .div_table_title > div:first-child {
        border-left : 1px solid #C1C1C1;
    }

    .item_row > div:last-child,
    .div_table_title > div:last-child {
        border-right : 1px solid #C1C1C1;
    }

    .div_button_wrap {
        margin-top : 25px;
    }

     #export_button {
        width         : 72px;
        height        : 25px;
        margin        : 0 0 0 auto;
        background    : #404040;
        text-align    : center;
        border        : 1px solid #707070;
        color         : white;
        border-radius : 14px;
        cursor        : pointer;
    }

</style>
<body>
<div class="div_table">
    <div class="div_table_title">
        <div class="row_no">번호</div>
        <div class="row_name">이름</div>
        <div class="row_gender">성별</div>
        <div class="row_phone">연락처</div>
    </div>
    <div class="div_table_list">
        <div class="item_row">
            <div class="row_no">1</div>
            <div class="row_name">홍길동</div>
            <div class="row_gender">남성</div>
            <div class="row_phone">010-0000-0000</div>
        </div>
        <div class="item_row">
            <div class="row_no">2</div>
            <div class="row_name">홍길순</div>
            <div class="row_gender">여성</div>
            <div class="row_phone">010-1111-1111</div>
        </div>
    </div>
    <div class="div_button_wrap">
        <div id="export_button" onclick="downloadCSV()">export</div>
    </div>
</div>
</body>

<script>
    function downloadCSV() {
        const fileName = "userList.csv";
        const csv = convertNodeToCsvString();

        var link = document.createElement("a");
        var blob = new Blob(["\uFEFF"+csv], {type: 'text/csv; charset=utf-8'});
        var url = URL.createObjectURL(blob);
        $(link).attr({"download" : fileName , "href" : url});
        link.click();
    }

    function convertNodeToCsvString() {
        var result = "";
        var node = $(".div_table_title").children();

        $(node).each(function (index, value) {
           result += $(value).text() + ",";
        })
        result += "\n";

        var itemNodes. = $(".div_table_list").children();
        $(itemNodes).each(function (index, value) {
            result += $(value).find(".row_no").text() +",";
            result += $(value).find(".row_name").text() +",";
            result += $(value).find(".row_gender").text() +",";
            result += $(value).find(".row_phone").text() +",\n";
        })
        return result;
    }
</script>
</html>

 

 

728x90
반응형
LIST
저작자표시 (새창열림)

'dev > web' 카테고리의 다른 글

Google 3rd Party oAuth2 device 구현하기  (6) 2022.07.21
javascript 동적 Dialog Modal 만들기  (12) 2022.06.21
php 500 에러코드 출력  (6) 2021.01.18
Window 에서 Apache + PHP+ Mysql WebServer 만들기 3부 MySql 편  (14) 2021.01.10
Window 에서 Apache + PHP+ Mysql WebServer 만들기 2부 PHP 편  (4) 2021.01.09
'dev/web' 카테고리의 다른 글
  • Google 3rd Party oAuth2 device 구현하기
  • javascript 동적 Dialog Modal 만들기
  • php 500 에러코드 출력
  • Window 에서 Apache + PHP+ Mysql WebServer 만들기 3부 MySql 편
NCJ
NCJ
일상과 개발을 공유하고 소통하는 블로그입니다.
    반응형
    250x250
  • NCJ
    NCJ 프로그래밍
    NCJ
  • 전체
    오늘
    어제
    • ALL
      • dev
        • android
        • java
        • Spring Boot
        • node.js
        • MFC
        • react-native
        • web
        • 기타
        • vue
        • react
      • 일상
        • news
        • 요리
        • 영화
        • 드라마
        • 제품
        • 게임
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    삼성
    게임
    던파 모바일 사전캐릭 생성
    던파 출시일
    다이어트
    리니지w 이벤트 안내
    사전캐릭
    던파 모바일 서버오픈
    리니지w 보상
    코딩문제
    던파 서버 오픈
    java
    리니지
    window webserver
    던파 모바일 사전캐릭
    php
    Web
    리니지w 오픈
    리니지w
    리니지W 사전예약
    갤럭시
    CSS
    던파 사전캐릭
    안드로이드
    던파 캐릭생성
    갤럭시 버즈2
    리니지w 이벤트
    apache
    갤럭시 워치 4
    Android
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
NCJ
jquery csv파일로 export 하기
상단으로

티스토리툴바