주제로 가서 오늘의 JasperReport, IREPORT 또는 JASPERSTUDIO를 소개하겠습니다. 두 가지가 시각화 도구입니다.
JasperReport는 무엇입니까?
이 제품에는 실제로 많은 국내 사용자가 있습니다. 외국 제품이며 Java보고 분야에서 널리 사용된다고 말할 수 있습니다.
이 보고서에 처음 접촉했을 때 나는 그것을 매우 좋아했습니다. 가장 중요한 것은 시각화 도구로, 실제로 멈출 수 없었습니다. 실제로 사진을 그려서 Java 보고서를 디자인 할 수있었습니다. 도면에 대해, 우리는 시각적 도구를 사용하여 보고서 템플릿을 시각적으로 디자인 할 수 있으며, 지원하는 파일 형식은 Excel, Word, PDF, HTML, XML, CSV 등을 포함하여 매우 넓습니다.
매우 강력 해 보이지 않습니까? 한 번에 설계되었으며 여러 번 재사용되었습니다. 물론, 강력한 것은 종종 양면을 가지고 있습니다. 나는 이것을 만나고 오랫동안 나를 고문했다. 나중에 자세히 설명하겠습니다.
JasperReport의 큰 가슴
나는 이전에 JasperReport, IREPORT 또는 JASPERSTUDIO가 실제로 부정확하다고 말했다. 두 번째 형제 Ireport와 세 번째 형제 Jasperstudio는 실제로 Jasper의 보조 비주얼 디자인 도구입니다. 사용하지 않고 재스퍼 보고서를 설계하고 더 많은 XML 흰색을 쓸 수 있습니다. 5.5 이전에는이 도구를 IREPORT라고합니다. 5.5 년 이후, 내 세 번째 형제 Jasperstudio가 태어나면서 IREPORT는 완전히 교체되었습니다. 실제로,이 두 도구는 기본적으로 동일 한 자녀 동포입니다.
특정 워크 플로 :
Jasper는 출력이 필요한 형식 정보의 XML 파일을 얻은 다음 XML 파일에서 .jasper 유형 파일을 컴파일합니다. 그런 다음이 재스퍼 파일을 응용 프로그램에로드하여 최종 보고서를 생성 할 수 있습니다. 당신은 매우 친숙한 느낌이 있습니까? 예, 이것은 Java와 매우 유사하며 편집해야합니다.
다음 그림은 iReport 작동 인터페이스를 보여줍니다. Jasperstudio와 비슷하므로 게시하지 않습니다. Baidu에서 직접 다운로드 할 수 있습니다.
위 그림에서 각 유형의 밴드를 간단히 소개하겠습니다.
(1) 제목 대역 : 제목 세그먼트는 전체 보고서의 첫 페이지의 상단에만 표시됩니다. 첫 번째 페이지를 제외하고 보고서에 몇 페이지가 있는지 상관없이 제목 밴드의 내용이 더 이상 나타나지 않습니다.
(2) PageHeader 대역 : 이름에서 알 수 있듯이 PageHeader 세그먼트의 내용은 전체 보고서의 모든 페이지에 나타나며 페이지 상단에 표시됩니다. 보고서의 첫 페이지 인 경우 PageHeader의 내용이 타이틀 밴드 아래에 표시됩니다. 첫 페이지를 제외한 다른 모든 페이지에서는 PageHeader의 내용이 페이지 상단에 표시됩니다.
(3) Pagefooter Band : 페이지 하단에 표시됩니다.
(4) LastPage Footer Band : 마지막 페이지의 하단에 표시됩니다.
(5) 세부 대역 : 보고서 내용 세그먼트,이 밴드의 디자인 보고서에서 반복 해야하는 컨텐츠, 세부 사항 세그먼트의 내용은 모든 페이지에 나타납니다.
(6) Columnheader Band : 세부 사항 대역의 헤더 세그먼트의 경우 일반적 으로이 세그먼트에서 보고서의 헤더가 그려집니다.
(7) Column Footer Band : 디테일 밴드 테이블의 끝.
(8) 요약 대역 : 테이블의 총 세그먼트는 전체 보고서의 마지막 페이지에 세부 대역 뒤에 나타납니다. 일반적으로 보고서에서 하나 또는 여러 필드의 총 값을 계산하는 데 사용됩니다.
위는 모든 시각화 도구입니다. 실제로 사용하기가 매우 간단합니다. 탐색하여 찾을 수 있습니다. 그것은 구덩이의 실제 기록이기 때문에 이것은 당연히 요점이 아니므로 그것에 대해 이야기하지 않을 것입니다.
코드의 응용 프로그램
이것이 제가 요약 한 단계입니다. 설명이 그다지 정확하지 않을 수도 있습니다. 제발하십시오.
sign 템플릿 디자인, jrxml 파일 생성, ↑↑ 위 시각화 도구는 필요한 템플릿 스타일을 설계합니다.
Java Java의 .java 및 .class 파일과 마찬가지로 템플릿을 컴파일하는 JRXML은 Jasper 파일로 컴파일됩니다. 프로그램은 *.jasper의 이진 파일을 실행해야합니다.
실제로이 단계는 IREPORT로 직접 컴파일하여 .jasper를 생성 할 수 있으며, 물론 런타임시 Jasper 프로그램을 통해 편집 할 수도 있습니다. 그러나 프로그램에서 컴파일 된 경우 Jasper 버전은 iReport 또는 Jasperstudio 버전과 가장 잘 일치하는 것이 좋습니다.
③ executute 보고서 (데이터는 보고서에 채워져 있음)
1. 템플릿을로드하여 JasperPort 객체를 생성하십시오
2. JasperFillManager를 사용하여 JasperPrint 객체를 생성하십시오
winally- jrxlsxexporter를 사용하여 보고서를 내보내거나 표시하십시오.
로드 템플릿
시각화 도구를 사용하여 .jasper 또는 .jrxml 파일을 생성 했으므로 자연스럽게 프로그램에로드해야합니다.
로드 된 코드, JasperPort 객체를 반환합니다
if (urlpath.endswith ( ". jrxml")) {// jrxml을 Jasper try {inputstream is = url.openstream (); jasperReport = jasperCompileManager.compileReport (IS); } catch (ioexception e) {새 baseexception 던지기 ( "로드 재스퍼 오류", e); } catch (jrexception e) {Throw New Baseexception ( "JRXML 템플릿 변환 Jasper 파일 오류로 변환", e); } catch (Throwable e) {Throw New Baseexception ( "JRXML 템플릿이 Jasper 파일 오류로 변환", e); } catch (Throwable e) {log.error (e); 새로운 바이즈 셉션 (e.getMessage ()); }} else if (urlpath.endswith ( ". jasper")) {try {inputStream is = url.openStream (); JasperReport = (JasperReport) jrloader.loadObject (IS); } catch (ioexception e) {새 baseexception 던지기 ( "로드 재스퍼 오류", e); } catch (jrexception e) {Throw New Baseexception ( "JRXML 템플릿 파일 오류", e); } catch (Throwable e) {log.error (e); 새로운 바이즈 셉션 (e.getMessage ()); }} else {Throw New Baseexception ( "유효하지 않은 파일"); }보고서에서 데이터 소스를 가져옵니다
여기서 나는 그것을 얻기 위해 Javabean을 사용합니다
jrdatasource dataSource = null; if (fieldValues! = null && fieldValues.size ()> 0) {DataSource = new JrBeanCollectionDatasource (FieldValues); } else {dataSource = new JREMPTYDATASOURCE (); } FieldValues는 데이터베이스에서 얻은 POJO의 컬렉션입니다.
보고서 작성을 수행하십시오
JasperPrint 객체를 얻으십시오
map <string, object> parametervalue = new Hashmap <string, object> (); jasperprint = jasperfillmanager.fillReport (jasperport, parametervalue, dataSource);
마지막으로, 우리는 JRXLSXEXPORTER를 사용하여 보고서를 수출합니다
또한 가장 많은 구성 매개 변수가 필요한 곳이기도합니다.
baos = new BytearRayoutputStream (); expler = new JrxlSxExporter (); expler.setParameter (jrexporterparameter.jasper_print, jasperprint); explorter.setparameter (jrexporterparameter.output_stream, baos);
expler.exportreport ();
완료된 데이터는 출력 스트림에 기록되었습니다. 직접 출력하는 방법을 결정합니다. 다른 코드 소개 방법보다 훨씬 간단합니다.
실제로 JasperReport는 코드 작성에 비교할 수없는 이점이 있으며 다양한 API가 포장되었습니다. 그러나 Chacha가 너무 많은 일을했고 많은 문제가있을 수 있습니다.
JasperReport의 문제
1. 두 줄 전에 빈 공간
위의 코드를 사용하여 Excel을 내보내는 경우 Excel의 작은 그리드가없는 Excel의 배경이 흰색임을 알 수 있습니다. 재스퍼의 기본 배경이 흰색이기 때문에 다른 형식을 내보낼 때 호환되기가 더 쉽습니다. 물론 Excel을 내보낼 필요는 없습니다. 다음 두 줄을 추가하여 해결하십시오.
// 두 줄 전에 빈 explorter.setParameter를 제거합니다 (jrxlsexporterparameter.is_remove_empty_space_between_rows, boolean.true); expler.setParameter (jrxlsexporterparameter.is_remove_empty_space_between_columns, boolean.true); // 엑셀 테이블의 배경색을 기본 흰색 extor.setParameter (jrxlsexporterparameter.is_white_page_background, boolean.false)로 설정합니다.
2. 데이터 볼륨이 크고 제목은 여러 번 작성됩니다.
시트 데이터가 많으면 테이블 헤더가 여러 번 인쇄되는 상황이 발생할 수 있습니다. 이 경우 높이 설정을 추가해야합니다.
Field PageHeight = jrbasereport.class.getDeclaredfield ( "PageHeight"); pageHeight.setAccessible (true); PageHeight.SetInt (JasperReport, integer.max_value);
3. 세포 유형 문제
때때로, 우리가 내보내는 Excel 보고서는 Excel 함수를 사용하여 계산해야합니다. 그들 모두가 텍스트 형식이라면, 우리는 자연스럽게 그것을 계산할 수 없습니다. 이 경우 사용해야합니다
// 형식을 자동으로 선택하면 SetParameter (jrxlsexporterparameter.is_detect_cell_type, boolean.true);
보고서를 설계 할 때 필드 필드의 올바른 유형을 선택하십시오.
4. 여러 시트의 문제
위의 간단한 예는 시트 페이지가 포함 된 파일입니다. 우리의 요구 사항이 하나의 파일로 여러 시트를 내보내려면 어떻게해야합니까? 걱정하지 마십시오.이 Japser는 이미 우리를 위해 그것을 생각했습니다.
위의 내보내기 단계를 다음과 같이 변경하십시오
baos = new BytearRayoutputStream (); explert = new JRXLSXEXPORTER (); EXPORTER.SETPARAMERTER.SETPARAMERTER.JASPER_PRINT_LIST, LISTJASPERPRINT); SSETPARAMETER (JREXPORTERAMERTER.OUTPUT_STREAM, BAOS); expler.setParameter (jrxlsexporterparameter.is_one_page_per_sheet, boolean.true);
jrexporterparameter.jasper_print_list, ListJasperPrints 모음을 전달하십시오. 각 JasperPrint는 시트 페이지입니다.
5. Linux 스타트 업에는보고 된 오류가 없지만 보고서는 내보낼 수 없습니다.
사실,이 문제는 오랫동안 나를 괴롭 혔습니다. 나중에, 상사의 도움으로, 나는 문제가 전혀 예외가 아니라 오류가 발생했기 때문에 문제를 기억했습니다. 나는 일부 반 친구들이 온라인 으로이 질문을 한 것을 보았습니다. 그래서 나는 그것을 게시했습니다.
Throwable을 사용하여 오류 메시지를 캡처하고 오류 메시지를 가져올 수 있습니다.
솔루션 : Tomcat/bin/catalina.sh를 수정하고 java_opts = "$ java_opts -djava.awt.headless = true"
6. 빅 데이터 메모리 오버플로 및 메모리 누출 문제! !
Excel 03과 07 버전의 차이점에 대해 이야기해야합니다. 03 버전은 65532 라인 만 지원하지만 07 버전이 끝난 후 훨씬 커졌습니다. 나는 특정 숫자를 잊어 버렸습니다. 어쨌든 그것은 같은 순서가 아닙니다.
JRXLSXEXPORTER는 XLSX 파일 내보내기를 지원합니다.
jrxlsexporter는 XLS 파일로 식별하기 쉽습니다. 내보낸 도구는 Excel과 동일합니다.
그런 다음 메모리 오버플로 및 메모리 누출 문제가 있습니다. 나는 Java를하는 친구들이 기본적으로 이것을 만났다고 생각합니다.
메모리 오버 플로우에 대한 가장 일반적인 솔루션은 컨테이너의 메모리 크기를 높이고 Tomcat의 메모리 크기를 높이는 것입니다. 바이두를 사용할 수 있고 많은 방법이 있으므로 휠을 리메이크하지 않습니다.
다음은 Tomcat을 사용하는 경우 Windows 설치, 감압 및 Linux의 구성 메소드가 다르다는 것을 상기시켜줍니다.주의를 기울이십시오.
여기서 소개해야 할 것은 JasperReport 방법입니다. 실제로 JasperReport에는 빅 데이터 솔루션이 있습니다. 매우 초기 버전 인 jrfilevirtualizer의 에뮬레이터로 시작되었습니다.
이게 사용되는 것은 무엇입니까? 실제로 설정 한 매개 변수에 따라 하드 디스크의 임시 파일에 데이터를 작성하여 보고서를 작성할 때 과도한 메모리 사용 및 오버플로 문제를 해결합니다.
현재 JasperReport에는 3 개의 에뮬레이터가 있으며이 문제는 모두이 문제를 해결하는 데 사용됩니다.
그들은 다음과 같습니다.
Jrfilevirtualizer
②jrswapfilevirtualizer
③jrgzipvirtualizer
이 세 에뮬레이터의 차이점은 무엇입니까?
먼저, 가장 빠른 jrfilevirtualizer를 시작했습니다. 테스트 할 때 약 30W의 데이터를 내보낼 때 메모리 오버플로를보고합니다. 나중에 이것을 추가 한 후에는 정상적으로 내보낼 수있었습니다. 이 에뮬레이터는 각 객체에 대한 임시 파일을 생성하고 하드 디스크에 저장하여 메모리 사용 문제를 해결합니다. 그러나 많은 임시 파일이 생성되기 때문에 파일 생성 및 삭제의 메모리 소비가 보이지 않게 증가하므로 권장되지 않습니다.
// 여러 파일 작성 jrfilevirtualizer virtualizer = new JrfileVirtualizer (2, catchpath); map <string, object> parametervalue = new Hashmap <String, Object> (); ParameterValue.put (jrparameter.report_virtualizer, virtualizer);
virtualizer.setReadOnly (true);
Catchpath는 파일 캐시 경로이며 존재해야합니다. 그렇지 않으면 오류 가보고됩니다.
그런 다음 jrfilevirtualizer의 문제를 해결하기 위해 jrswapfilevirtualizer가 있습니다. 이 에뮬레이터는 임시 파일 만 생성하고 각 객체는이 파일의 일부를 설명하므로 파일 생성 및 삭제의 메모리 소비가 줄어 듭니다. 사실, 이것은 특별히 권장되지 않습니다.
// 단일 파일 작성 rswapfile arquivoswap = new jrswapfile (catchpath, 4096, 25); jrabstractlruvirtualizer virtualizer = new jrswapfilevirtualizer (2, arquivoswap, true); map <string, object> parametervalue = new Hashmap <string, object> (); parametervalue.put (jrparameter.report_virtualizer, virtualizer);
virtualizer.setReadOnly (true);
마지막으로 jrgzipvirtualizer가 있습니다. GZIP가 표시되면 압축이라는 단어와 관련이 있는지 알 수 없습니다. 맞습니다.이 에뮬레이터는 메모리 풋 프린트를 20 번 또는 한 번의 중간으로 압축 할 수있는 특수 압축 알고리즘을 사용합니다.
jrabstractlruvirtualizer virtualizer = new jrgzipvirtualizer (2); map <string, object> parametervalue = new Hashmap <string, object> (); parametervalue.put (jrparameter.report_virtualizer, virtualizer);
간단히 말해서, 메모리 오버플로 문제를 해결하기위한 세 가지 유형의 에뮬레이터가 있습니다. 또한 JRFileVirtualizer를 사용하여 메모리 빅 데이터 문제를 해결하는 많은 블로그를 읽었습니다. 그런 다음 여기서 JRFileVirtualizer 에뮬레이터를 사용하는 것이 좋습니다. 생성 할 파일이 많이 소비 될뿐만 아니라 매우 심각한 버그 및 메모리 누출이 있기 때문입니다. ! ! 이 문제가있는 jrswapfilevirtualizer도 있습니다.
또한 에뮬레이터를 사용하지 않으면 메모리 누출 문제가 발생합니다. 보고서를 내보내면 스택 정보를 버리고 Net.sf.jasperReports.engine.fill.jrtemplateprinttext 클래스의 많은 인스턴스가 있음을 알 수 있습니다. 재활용 할 수없고 재활용 할 수 없습니다! ! ! 그리고이 문제는 여전히 최신 버전의 Japserreport 6.x에 존재합니다. 재스퍼 커뮤니티와 스택 오버플로에는 이러한 문제가 많이 있지만 해결책은 없습니다.
여기서는 jrgzipvirtualizer 에뮬레이터를 권장합니다. 고유 한 압축 알고리즘으로 인해 여전히 누출 문제가 있지만 메모리 누출 문제는 매우 작은 범위로 제어되었습니다. 유출 된 메모리 사용을 약 90%줄이기위한 해결책으로 간주됩니다.
일반적으로, 나는 지금이 계획을 포기했으며, 형제들이 나중에 우회를 피할 수 있도록 글을 썼습니다. POI 도구 수업을받은 후 다음에 모든 보고서를 POI 수출 방법으로 변경할 준비를합니다. 말하자면, POI 빅 데이터 솔루션은 상당히 좋습니다.