由于項目業務需要,需要開發一個打印票據的需求。于是前面找了一堆資料來簡單學習了下,就開始自己動手開發起來了,下面直接細說。 首先小票模板的設計就用到了Jaspersoft Studio 這個軟件(如果需要可以聯系我或者官網上能下載到: https://community.jaspersoft.com/community-download)。
1.模板設計。
設計模板的步驟就不一一細說了,前面轉載的文章也有提到,可以去看看。直接上已經做好的模板,如下圖: 數據來源是 json數據源,先寫一個json文件并且類型、名稱要對應與之連接。 而兩者連接需要xml文件,再新建一個xml文件。 最后進行連接匹配,如下圖: 最后將其生成的.jasper文件放到項目中去,如圖:
2.工具類。
到此,模板就設計完成了,下面就是利用java代碼進行賦值并且連接打印機打印了。 給出jasperReport的工具類,代碼如下:
package com
. yd
. wb
. report
. jasperReport
; import java
. io
. ByteArrayInputStream
;
import java
. io
. IOException
;
import java
. io
. OutputStream
;
import java
. net
. URLEncoder
;
import java
. util
. ArrayList
;
import java
. util
. HashMap
;
import java
. util
. List
;
import java
. util
. Map
;
import java
. util
. UUID
; import javax
. servlet
. http
. HttpServletRequest
;
import javax
. servlet
. http
. HttpServletResponse
; import net
. sf
. jasperreports
. engine
. JRPrintPage
;
import net
. sf
. jasperreports
. engine
. JasperFillManager
;
import net
. sf
. jasperreports
. engine
. JasperPrint
;
import net
. sf
. jasperreports
. engine
. JasperReport
;
import net
. sf
. jasperreports
. engine
. export
. HtmlExporter
;
import net
. sf
. jasperreports
. engine
. export
. JRPdfExporter
;
import net
. sf
. jasperreports
. engine
. export
. ooxml
. JRXlsxExporter
;
import net
. sf
. jasperreports
. engine
. query
. JsonQueryExecuterFactory
;
import net
. sf
. jasperreports
. engine
. util
. JRLoader
;
import net
. sf
. jasperreports
. export
. SimpleExporterInput
;
import net
. sf
. jasperreports
. export
. SimpleHtmlExporterOutput
;
import net
. sf
. jasperreports
. export
. SimpleOutputStreamExporterOutput
;
import net
. sf
. jasperreports
. export
. SimpleXlsxReportConfiguration
; import org
. apache
. log4j
. Logger
;
import org
. springframework
. beans
. factory
. annotation
. Autowired
;
import org
. springframework
. core
. io
. ResourceLoader
;
import org
. springframework
. stereotype
. Component
; import util
. JCDFJsonUtil
;
@Component
public class JasperResolver { private Logger logger
= Logger
. getLogger ( JasperResolver
. class ) ; @Autowired private ResourceLoader resourceLoader
; public void exportJasperReport ( Map
< String, Object> data
, String reportFileName
, ReportType reportType
, HttpServletRequest request
, HttpServletResponse response
) throws Exception
{ List
< Map
< String, Object> > list
= new ArrayList < Map
< String, Object> > ( ) ; list
. add ( data
) ; exportJasperReport ( list
, reportFileName
, reportType
, request
, response
) ; } public void exportJasperReport ( List
< Map
< String, Object> > data
, String reportFileName
, ReportType reportType
, HttpServletRequest request
, HttpServletResponse response
) throws Exception
{ exportJasperReport ( data
, "/WEB-INF/report/" , reportFileName
, reportType
, request
, response
) ; } private void exportJasperReport ( List
< Map
< String, Object> > data
, String reportPath
, String reportFileName
, ReportType reportType
, HttpServletRequest request
, HttpServletResponse response
) throws Exception
{ OutputStream os
= null
; JasperPrint jasperPrint
= null
; try { if ( reportType
== ReportType
. JSON
) { response
. setContentType ( "text/html;charset=UTF-8" ) ; response
. setHeader ( "Pragma" , "no-cache" ) ; response
. setHeader ( "Cache-Control" , "no-cache, must-revalidate" ) ; response
. setHeader ( "Pragma" , "no-cache" ) ; try { response
. getWriter ( ) . write ( JCDFJsonUtil
. fromObjctToJson ( data
, null
) ) ; response
. getWriter ( ) . flush ( ) ; response
. getWriter ( ) . close ( ) ; } catch ( IOException e
) { e
. printStackTrace ( ) ; } return ; } os
= response
. getOutputStream ( ) ; response
. setContentType ( reportType
. getMimeType ( ) + "; charset=utf-8" ) ; response
. setDateHeader ( "Expires" , 0 ) ; response
. setHeader ( "Content-Disposition" , "inline;filename=" + URLEncoder
. encode ( UUID
. randomUUID ( ) + reportType
. getSuffix ( ) , "utf-8" ) ) ; JasperReport report
= ( JasperReport
) JRLoader
. loadObject ( resourceLoader
. getResource ( reportPath
+ reportFileName
+ ".jasper" ) . getInputStream ( ) ) ; Map
< String, Object> parameters
= new HashMap < String, Object> ( ) ; String classesPath
= this . getClass ( ) . getClassLoader ( ) . getResource ( "" ) . getPath ( ) ; String servletContextRealPath
= classesPath
. substring ( 0 , classesPath
. lastIndexOf ( "WEB-INF" ) ) ; parameters
. put ( "SUBREPORT_DIR" , servletContextRealPath
+ reportPath
) ; for ( Map
< String, Object> item
: data
) { String json
= JCDFJsonUtil
. fromObjctToJson ( item
, null
) ; ByteArrayInputStream jsonDataStream
= new ByteArrayInputStream ( json
. getBytes ( "utf-8" ) ) ; parameters
. put ( JsonQueryExecuterFactory
. JSON_INPUT_STREAM
, jsonDataStream
) ; if ( null
== jasperPrint
) { jasperPrint
= JasperFillManager
. fillReport ( report
, parameters
) ; } else { JasperPrint jasperPrintTemp
= JasperFillManager
. fillReport ( report
, parameters
) ; List
< JRPrintPage> pages
= jasperPrintTemp
. getPages ( ) ; for ( JRPrintPage page
: pages
) { jasperPrint
. addPage ( page
) ; } } } switch ( reportType
) { case PDF
: JRPdfExporter pdfExporter
= new JRPdfExporter ( ) ; pdfExporter
. setExporterInput ( new SimpleExporterInput ( jasperPrint
) ) ; pdfExporter
. setExporterOutput ( new SimpleOutputStreamExporterOutput ( os
) ) ; pdfExporter
. exportReport ( ) ; break ; case XLSX
: Map
< String, String> dateFormats
= new HashMap < String, String> ( ) ; dateFormats
. put ( "EEE, MMM d, yyyy" , "ddd, mmm d, yyyy" ) ; JRXlsxExporter xlsxExporter
= new JRXlsxExporter ( ) ; SimpleXlsxReportConfiguration configuration
= new SimpleXlsxReportConfiguration ( ) ; xlsxExporter
. setExporterInput ( new SimpleExporterInput ( jasperPrint
) ) ; xlsxExporter
. setExporterOutput ( new SimpleOutputStreamExporterOutput ( os
) ) ; configuration
. setDetectCellType ( Boolean
. TRUE
) ; configuration
. setFormatPatternsMap ( dateFormats
) ; xlsxExporter
. setConfiguration ( configuration
) ; xlsxExporter
. exportReport ( ) ; break ; default : HtmlExporter htmlExporter
= new HtmlExporter ( ) ; htmlExporter
. setExporterInput ( new SimpleExporterInput ( jasperPrint
) ) ; htmlExporter
. setExporterOutput ( new SimpleHtmlExporterOutput ( os
) ) ; htmlExporter
. exportReport ( ) ; break ; } if ( null
!= os
) { os
. flush ( ) ; } } finally { if ( null
!= os
) { try { os
. close ( ) ; } catch ( Exception e
) { logger
. error ( e
) ; } } } }
}
package com
. yd
. wb
. report
. jasperReport
; import java
. util
. HashMap
;
import java
. util
. Map
;
public enum ReportType
{ PDF ( ".pdf" , 1 , "application/pdf" ) , XLSX ( ".xlsx" , 2 , "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ) , HTML ( ".html" , 4 , "text/html" ) , JSON ( ".json" , 4 , "application/json" ) ; private String suffix
; private int value
; private String mimeType
; private ReportType ( String suffix
, int value
, String mimeType
) { this . suffix
= suffix
; this . value
= value
; this . mimeType
= mimeType
; } private static final Map
< String, ReportType> stringToEnum
= new HashMap < String, ReportType> ( ) ; static { for ( ReportType item
: values ( ) ) { stringToEnum
. put ( item
. toString ( ) , item
) ; } } public static ReportType
fromString ( String name
) { return stringToEnum
. get ( name
) ; } public String
getSuffix ( ) { return suffix
; } public void setSuffix ( String suffix
) { this . suffix
= suffix
; } public int getValue ( ) { return value
; } public void setValue ( int value
) { this . value
= value
; } public String
getMimeType ( ) { return mimeType
; } public void setMimeType ( String mimeType
) { this . mimeType
= mimeType
; } }
3.java代碼獲取值
controller層代碼:
……………………………………………………………有關別的項目的代碼就不顯示了。
@Autowired private JasperResolver jasperResolver
; private static final String C_ACTION_PRINT
= "printTickets" ; @RequestMapping ( value
= "/printTickets" ) public CIPResponseMsg
print ( HttpServletRequest request
, HttpServletResponse response
, String serial_no
, String trans_doc_id
, String gross_weight
, String net_weight
) { CIPResponseMsg msg
= new CIPResponseMsg ( ) ; Integer grossWeight
= Integer
. parseInt ( gross_weight
) ; try { if ( grossWeight
== 0 && trans_doc_id
. startsWith ( "300" ) ) { List
< Map
< String, Object> > data
= dataService
. queryData ( serial_no
) ; jasperResolver
. exportJasperReport ( data
, "TICKETS_NETPOINT_CARS1" , ReportType
. PDF
, request
, response
) ; } else if ( grossWeight
> 0 && trans_doc_id
. startsWith ( "300" ) ) { List
< Map
< String, Object> > data
= dataService
. queryOverweight ( serial_no
) ; jasperResolver
. exportJasperReport ( data
, "TICKETS_NETPOINT_CARS2" , ReportType
. PDF
, request
, response
) ; } else if ( trans_doc_id
. startsWith ( "68" ) ) { List
< Map
< String, Object> > data
= dataService
. query ( serial_no
, trans_doc_id
, net_weight
) ; jasperResolver
. exportJasperReport ( data
, "TICKETS_NETPOINT_CARS3" , ReportType
. PDF
, request
, response
) ; } } catch ( CIPServiceException e
) { CIPErrorCode error
= e
. getErrorCode ( ) ; msg
. errorCode
= error
. code
; msg
. msg
= error
. name
; } catch ( CIPDaoException e
) { CIPErrorCode error
= e
. getErrorCode ( ) ; msg
. errorCode
= error
. code
; msg
. msg
= error
. name
; } catch ( CIPRuntimeException e
) { CIPErrorCode error
= e
. getErrorCode ( ) ; msg
. errorCode
= error
. code
; msg
. msg
= error
. name
; } catch ( Exception e
) { log
. error ( e
) ; } return msg
; }
service層代碼:
@Override public List
< Map
< String, Object> > queryData ( String ids
) { List
< Map
< String, Object> > list
= new ArrayList < Map
< String, Object> > ( ) ; String
[ ] idArr
= ids
. split ( "," ) ; for ( String serial_no
: idArr
) { Map
< String, Object> paraMap
= new HashMap < String, Object> ( ) ; paraMap
. put ( "serial_no" , serial_no
) ; Map
< String, Object> data
= new HashMap < String, Object> ( ) ; Map
< String, Object> map
= dataDao
. queryData ( paraMap
) ; if ( map
!= null
) { Set
< Entry
< String, Object> > entrySet
= map
. entrySet ( ) ; for ( Entry
< String, Object> entry
: entrySet
) { data
. put ( entry
. getKey ( ) , entry
. getValue ( ) ) ; } } list
. add ( data
) ; } return list
; }
dao層代碼:
@Override public Map
< String, Object> queryData ( Map
< String, Object> paraMap
) { Map
< String, Object> map
= null
; String sql
= "SELECT b.com_name weight_site,DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') create_time,serial_no,b.com_name start_site_name,concat('(', a.start_site, ')') start_site,car_id,trans_doc_id,ifnull(c.emp_name,a.operator) operator,SYSDATE() FROM wb_busi_gross_weight a " + " LEFT JOIN wb_base_com b ON a.weight_site = b.com_bm LEFT JOIN wb_base_emp c on a.operator = c.emp_id WHERE a.serial_no = ?" ; Object serial_no
= paraMap
. get ( "serial_no" ) ; try { map
= jdbcTemplate
. queryForMap ( sql
, serial_no
) ; return map
; } catch ( Exception e
) { log
. error ( e
) ; return map
; } }
sql語句,注意:查詢后的字段要求與json文件的key相對應。
SELECTb
. com_name weight_site
, DATE_FORMAT ( create_time
, '%Y-%m-%d %H:%i:%s' ) create_time
, serial_no
, b
. com_name start_site_name
, concat ( '(' , a
. start_site
, ')' ) start_site
, car_id
, trans_doc_id
, ifnull ( c
. emp_name
, '' ) operator
, SYSDATE ( )
FROMwb_busi_gross_weight a
LEFT JOIN wb_base_com b ON a
. weight_site
= b
. com_bm
LEFT JOIN wb_base_emp c ON a
. operator
= c
. emp_id
WHEREa
. serial_no
= '?'
html頁面部分代碼: 最后的效果如下圖:
當然打印機驅動是我自己安裝的,這個看公司用的什么打印機,這里我就不介紹打印機配置的步驟了。 僅此記錄下來,歡迎各位大佬指教。
總結
以上是生活随笔 為你收集整理的jaspersoft studio实践 --实现网页版打印小票(模板一) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。