티스토리 뷰

dev/vue

vue에서 json 프린트 하기

동큐 2019. 3. 27. 18:56

vue 로 개발을 하던 도중 data grid를 출력할 일이 생겼다.

report 솔루션 라이센스도 없고 이걸 html로 노가다 해야 하나 고민하던 도중 괜찮은 (물론 MIT 라이센스의) util 하나를 발견했다.

 

이름은 Print.js (http://printjs.crabbly.com/

사이트를 방문해 보면 PDF, Html, Image, Json 프린팅을 지원한다고 되어 있다.

 

이중에서 Html 프린팅과 Json 프린팅 두가지를 시험해 보았다. 

 

출력 데이터는 아래와 같다. 

날짜 항목 이름 기수 금액 비고
2019-01-01 회비 홍길동 1기 30,000 2019 1월회비
2019-01-01 회비 김영일 3기 30,000 2019 1월회비
2019-01-02 회비 전도일 5기 30,000 2019 1월회비
2019-02-03 회비 박상도 6기 30,000 2019 1월회비

* 출력조건:

1. 수평정렬: 날짜,항목-가운데, 이름,기수,비고-왼쪽, 금액-오른쪽

2. 수직정렬: 중앙

3. 헤더는 페이지마다 반복

4. 컬럼은 한페이지에 나올것 ( 예. 비고가 잘려 다른 페이지에 출력되서는 안됨)

 

* 사용법:

npm i print-js --save

* print.vue

<template>
  <v-btn @click="print">print</v-btn>
</template>
<script>
import printJs from 'print-js'
export default {
  data: {
    return {
      items: [
        { date: '2019-01-01', name: '홍길동', item: '회비', group: '1기', amt: '30,000', remark: '2019 1월 회비'},
        { date: '2019-01-01', name: '김영일', item: '회비', gorup: '3기', amt: '30,000', remark: '2019 1월 회비'},
        { date: '2019-01-02', name: '전도일', item: '회비', gorup: '5기', amt: '30,000', remark: '2019 1월 회비'},
        { date: '2019-02-03', name: '박상도', item: '회비', gorup: '6기', amt: '30,000', remark: '2019 1월 회비'}
      ]
    }
  },
  method: {
    print () {
      printable: this.items,
      properties: [
        {field: 'date', displayName: '날짜'},
        {field: 'item', displayName: '항목'},
        {field: 'name', displayName: '이름'},
        {field: 'group', displayName: '기수'},
        {field: 'amt', displayName: '금액'},
        {field: 'remark', displayName: '비고'}
      ],
      type: 'json'
    }
  }
}
</script>

일단 위 조건 중 2,3,4 는 해결되어 깔끔하게 출력되는데 1번의 수평정렬은 아무리 찾아봐도 옵션이 없다. 

 

그래서 'type'을 html 로 바꾸고 json data를 html로 변환도 해봤는데 오히려 더 이상하게 나온다.. json type일때는 printJs가 어느정도 자체 css를 가지고 print에 필요한 html로 변환시키는 반면 html type일때는 사용자가 html을 만들때인쇄영역에서 필요한 모든걸 통제해야 하는 것 같다.

 

혹시나 싶어 data에서 필요한 부분에만 html code를 넣어본다.

<template>
  <v-btn @click="print">print</v-btn>
</template>
<script>
import printJs from 'print-js'
export default {
  data: {
    return {
      items: [
        { date: '<span style="display: block; text-align: center; vertical-align: middle;">2019-01-01</span>',
          name: '홍길동', item: '회비', group: '1기',
          amt: '<span style="display: block; text-align: right; vertical-align: middle;">30,000</span>',
          remark: '2019 1월 회비'},
        { date: '<span style="display: block; text-align: center; vertical-align: middle;">2019-01-01</span>',
          name: '김영일', item: '회비', gorup: '3기',
          amt: '<span style="display: block; text-align: right; vertical-align: middle;">30,000</span>',
          remark: '2019 1월 회비'},
        { date: '<span style="display: block; text-align: center; vertical-align: middle;">2019-01-02</span>',
          name: '전도일', item: '회비', gorup: '5기',
          amt: '<span style="display: block; text-align: right; vertical-align: middle;">30,000</span>',
          remark: '2019 1월 회비'},
        { date: '<span style="display: block; text-align: center; vertical-align: middle;">2019-02-03</span>',
          name: '박상도', item: '회비', gorup: '6기',
          amt: '<span style="display: block; text-align: right; vertical-align: middle;">30,000</span>',
          remark: '2019 1월 회비'}
      ]
    }
  },
  method: {
    print () {
      printable: this.items,
      properties: [
        {field: 'date', displayName: '날짜'},
        {field: 'item', displayName: '항목'},
        {field: 'name', displayName: '이름'},
        {field: 'group', displayName: '기수'},
        {field: 'amt', displayName: '금액'},
        {field: 'remark', displayName: '비고'}
      ],
      type: 'json'
    }
  }
}
</script>

잘 동작함. ^^ 

 

상용 report tool 처럼 강력하진 않지만 간단히 data grid 출력할 용도로는 훌륭한것 같음.

댓글