生成三核對文件
1、新增三核對菜單頁面中,增加生成三核對文件功能按鈕,彈窗可根據變電站、電壓等級查詢定值單。
2、定值單信息以表格形式展示,根據選擇情況,生成三核對文件。
整體就是這樣的一個需求,分sheet,合並單元格,設置各種單元格格式,要有序號。
新手,什麼都不會,同事直接給了這麼一個僵硬的需求,哈哈我當時整個人都是懵逼的。一會總結說。
全部代碼,控制層,service,前台,全都貼在最下面。
1 數據庫查詢
2將信息導出為datatable格式(公司框架)
3將datatable格式轉化為workbook(循環遍歷) 使用poi 導出excel
4workbook生成多SHEET以及合並單元格,單元格賦值,轉換style
5生成workbook後 彈出下載頁面 能夠傳到浏覽器界面提供下載 (有關springweb框架前後台傳參數取值問題 )
6中間出現的一些小問題 (全局變量設置 )
要生成一個這樣一個excel表格,而我們的信息還沒有獲取到,這時應該考慮如何根據通過前台傳過來的參數進行一次查詢。(參數為一個,就是能夠獲得一個能關聯到三個表的guid(有一個是無主鍵視圖))
把查詢想的太過簡單,關聯三個表的問題研究一會就解決了,但是又出現新的問題,首先數據庫查詢出的信息並不滿足我想要的信息,因為在需求中,那個執行日期執行人和核對日期核對人在我的數據庫查詢語句中是無法實現的,因為他們兩個是一個並行的行,只有一個guid的話,在我的查詢語句中注定只能查出不是執行日期就是核對日期的列。也就是說執行日期核對日期都只是一列中的值,不能並存,只能查出一條。
解決: 網上查了下,使用了一個比較壞的方法: 建立一個游標臨時表,先通過一部分限制條件單獨將執行日期執行人核對日期核對人查出如下
這個就是游標的一種用法,查出這樣的數據後,建立游標,使用forward-only進行順序讀取, 也就是將這兩行兩列的數據從左至右讀取並依次存入name2356中,這樣我們就可以為所欲為了,因為這樣我們可以安排name2356到任何地方,他們中一直都存著我之前給他們賦予的值,因為它們在一個臨時表中,這樣在下面放入數據庫信息時,我再給它們用as重新命名並且進行拼接,可以直接安放到另一個查詢語句中。 這樣就解決了將不同行的某些信息放入同一行中的問題。
表格中的信息部分我只能查到單獨的信息,比如執行人和執行日期,這兩個是兩列,如何拼起來讓他們變成一列。
查了一下,這個還是很好解決,使用+和as就可以解決。之前還以為多難。。。。
仔細看之前的表格需求,是分sheet的,是以變電站為一個sheet的形式,那麼,我們應當如何做呢。就是分數據源來進行查詢。
傳過來的參數只有guid一個字符串,但是我可以通過guid來查出這些guid中的信息都是哪幾個變電站的。
1 public List getSubName(String guiddd){ 2 StringBuffer sql = new StringBuffer(); 3 List list = new ArrayList(); 4 sql.append("SELECT DISTINCT CAST(SUBSTATION AS VARCHAR) AS SUBSTATION FROM US_APP.TB_DZD_INFORMATION "+"WHERE GUID IN ("+guiddd+")" ); 5 list = genericDao.getDataWithSQL(sql.toString()); 6 return list; 7 }
在這樣的數據庫查詢語句中,使用in是如何使用的呢,畢竟in'1,2,3'這樣的格式,和字符串格式還是有點差距。
那麼就是用 1 String guiddd = "'"+guid.replaceAll(",", "','")+"'";//轉換為能夠被數據查詢語句查詢的字符串 這樣,guiddd就能夠使用啦。
我這個邏輯比較亂,如下圖,這樣就完成了分數據源查詢,也就可以分sheet了。
具體數據庫查詢如下。
1 PlatformConfigUtil.getString("dbtype"); 2 StringBuffer sql = new StringBuffer(); 3 sql.append("DECLARE " 4 + "@NAME2 NVARCHAR (300)," 5 + "@NAME3 NVARCHAR (300)," 6 + "@NAME5 NVARCHAR (300)," 7 + "@NAME6 NVARCHAR (300)"); 8 sql.append("DECLARE CUR CURSOR" 9 + " forward_only " 10 + "FOR SELECT " 11 + "TASKACTOR,ENDTIME " 12 + "FROM US_SYS.TV_WF_TASKLOG " 13 + "WHERE PROCESSINSTANCE = ("); 14 sql.append("SELECT PROCESSINSTANCE_ " 15 + "FROM US_SYS.JBPM_VARIABLEINSTANCE " 16 + "WHERE STRINGVALUE_= ? "// 此處問號 17 + " AND NAME_ = 'orderNo')");//問號~~~ 18 sql.append("AND (TASKNAME LIKE '執行'" 19 + " OR TASKNAME LIKE '核對') " 20 + "AND ENDTIME IS NOT NULL "); 21 sql.append("OPEN CUR "); 22 sql.append("FETCH NEXT FROM CUR INTO" 23 + " @NAME2,@NAME3 "); 24 sql.append("FETCH NEXT FROM CUR INTO " 25 + " @NAME5,@NAME6 "); 26 sql.append("CLOSE CUR "); 27 sql.append(" DEALLOCATE CUR "); 28 sql.append(" SELECT "); 29 sql.append(" ROW_NUMBER() OVER (ORDER BY GUID) AS 'RowNumber',CAST(T1.SUBSTATION AS VARCHAR(500)) AS SUBSTATION, " 30 + "CAST(T1.EQUIPMENT AS VARCHAR(500)) AS EQUIPMENT, "//設備名稱 31 + "CAST(T1.EQUIPMENTVERSION AS VARCHAR(500)) AS EQUIPMENTVERSION, "//保護型號 32 + "CAST(T1.DZDINDEX AS VARCHAR(500)) AS DZDINDEX, " //定值單編號 33 + "CAST(T1.BRANCHID AS VARCHAR(500)) AS BRANCHID, "//版本 34 + "CAST(@NAME2 AS VARCHAR(500)) + " 35 + "CAST(@NAME3 AS VARCHAR(500)) AS ENDTIME1, " 36 + "CAST(@NAME5 AS VARCHAR(500)) + " 37 + "CAST(@NAME6 AS VARCHAR(500)) AS ENDTIME2 " ); 38 sql.append(" FROM "); 39 sql.append( " US_APP.TB_DZD_INFORMATION T1, "); 40 sql.append(" US_SYS.TV_WF_TASKLOG T, "); 41 sql.append(" US_SYS.JBPM_VARIABLEINSTANCE V "); 42 sql.append(" WHERE "); 43 sql.append("T1.ISDELETE = 0 "); 44 sql.append(" AND T1.GUID = V.STRINGVALUE_ "); 45 sql.append(" AND T.PROCESSINSTANCE = V.PROCESSINSTANCE_ "); 46 sql.append(" AND (T.TASKNAME = '執行' ) "); 47 sql.append(" AND T1.GUID = ? " ); 48 dataTablec = genericDao.getDataIntoDataTable(sql.toString(), new Object[]{guida[j],guida[j]}); 49 dataTable.appendRow(dataTablec.getRow(0));
2將信息導出為datatable格式(公司框架)
這樣查出了信息之後其實也順便將信息放入一個datatable中了,這個datatable好像是c#中的一種封裝好的, 公司平台也給它用java封裝了一個類。
這樣每個datatable中其實包含了一個sheet的信息,一會對這個對象進行上下的循環遍歷就能夠存入信息主體啦。
說的很輕松他媽的看這個datatable的源碼看了我好久,太菜了。
3將datatable格式轉化為workbook(循環遍歷)
這樣是一個sheet,使用poi 包可以通過建立一個workbook(一個完整的excel表格)
我是這樣做的,就是先在循環外圍建立一個workbook,然後在sub循環中建立sheet,guid循環,也就建立了sub.length個sheet,一個sheet中也包含了一個sub中的所有信息,這個work中包含了所有全部sheet。 (sheet的name就是查詢出的subname)
W
我是不是搞復雜了。。。
4workbook生成多SHEET以及合並單元格,單元格賦值,轉換style
到這裡就是一個比較繁瑣的事情了,因為在需求中有五種格式一上,還有單元格的樣式問題。
先說sheet導入時單個sheet其實是這個樣子(下面是樣式),有特別多不符合要求的地方,這裡還沒有分sheet,此刻就先讓整個數據信息向下平移兩個單元格留出標題以及序號的位置,然後向右平移留出一個序號位置。
具體工具類的設定就不說了,比較簡單。
重點說一下合並單元格以及合並單元格的賦值與設定cellstyle是如何操作的。
下面的代碼就是先使用這個合並單元格,
CellRangeAddress(起始行,結束行,起始列,結束列);
CellRangeAddress craa = new CellRangeAddress(rownumber,rownumber,0,5);
像我這樣創建的話,這個單元格就是rownumber的第一個單元格了,因為起始列是0.
但是現在其實sheet中並沒有改變這個單元格。
必須要用
sheet.addMergedRegion(craa);
這個語句來進行sheet單元格的添加。
添加後,需要
HSSFRow roww = sheet.createRow(rownumber);
HSSFCell cellw = roww.createCell((short)0);1 int rownumber = dataRows.size()+3 ; 2 HSSFRow roww = sheet.createRow(rownumber); 3 HSSFRow rowwq = sheet.createRow(rownumber+1); 4 roww.setHeight((short) 600);// 設定行的高度 5 roww.setRowStyle(cellStyle); 6 rowwq.setHeight((short) 600);// 設定行的高度 7 rowwq.setRowStyle(cellStyle); 8 CellRangeAddress craa = new CellRangeAddress(rownumber,rownumber,0,5); 9 CellRangeAddress craaa = new CellRangeAddress(rownumber,rownumber,6,12); 10 CellRangeAddress craab = new CellRangeAddress(rownumber+1,rownumber+1,0,5); 11 CellRangeAddress craabb = new CellRangeAddress(rownumber+1,rownumber+1,6,12); 12 sheet.addMergedRegion(craa); 13 HSSFCell cellw = roww.createCell((short)0); 14 cellw.setCellValue("繼保整定核對日期及核對人:"); 15 sheet.addMergedRegion(craaa); 16 HSSFCell celle = roww.createCell((short)6); 17 celle.setCellValue("變電運行核對日期及核對人:"); 18 sheet.addMergedRegion(craab); 19 HSSFCell cellr = rowwq.createCell((short)0); 20 cellr.setCellValue("調度核對日期及核對人:"); 21 sheet.addMergedRegion(craabb); 22 HSSFCell cellt = rowwq.createCell((short)6); 23 cellt.setCellValue("檢修繼保班核對日期及核對人:"); 24 int rowss = dataRows.size() + 5; //rowss為datatable行數 25 HSSFRow rowq = sheet.createRow(rowss);//sheet創建行 26 rowq.setHeight((short) 300);// 設定行的高度 27 rowq.setRowStyle(cellStyle); 28 CellRangeAddress cra=new CellRangeAddress(rowss,rowss+10,0,columns.size()-1);//合並單元格的首行、最後一行、首列、最後一列。 29 sheet.addMergedRegion(cra); 30 HSSFCell cellq = rowq.createCell((short)0); 31 cellq.setCellValue(Constants.CHECKMANAGEMENT_CHECKDZDSTANDARD); 32 cellq.setCellStyle(cellStyley); 33 cellw.setCellStyle(cellStyleq); 34 celle.setCellStyle(cellStyleq); 35 cellr.setCellStyle(cellStyleq); 36 cellt.setCellStyle(cellStyleq); 37 CellRangeAddress crm = new CellRangeAddress(0,0,0,columns.size()-1);//表頭大標題 38 HSSFRow rowm = sheet.createRow(0);//sheet創建行 39 rowm.setHeight((short) 1000);// 設定行的高度 40 rowm.setRowStyle(cellStylem); 41 sheet.addMergedRegion(crm); 42 HSSFCell cellm = rowm.createCell((short)0); 43 cellm.setCellValue("台州電網繼電保護及安全自動裝置整定單核對表"); 44 cellm.setCellStyle(cellStylem); 合並單元格賦值
在sheet中找到對應行以及對應單元格位置。以上。 這樣,單元格與合並單元格就對應啦。
就可以和正常單元格一樣給它賦值設定style或是干什麼了~~~。
下面代碼,沒有格式,我在下面會加上所有代碼。
1 int rownumber = dataRows.size()+3 ; 2 HSSFRow roww = sheet.createRow(rownumber); 3 HSSFRow rowwq = sheet.createRow(rownumber+1); 4 roww.setHeight((short) 600);// 設定行的高度 5 roww.setRowStyle(cellStyle); 6 rowwq.setHeight((short) 600);// 設定行的高度 7 rowwq.setRowStyle(cellStyle); 8 CellRangeAddress craa = new CellRangeAddress(rownumber,rownumber,0,5); 9 CellRangeAddress craaa = new CellRangeAddress(rownumber,rownumber,6,12); 10 CellRangeAddress craab = new CellRangeAddress(rownumber+1,rownumber+1,0,5); 11 CellRangeAddress craabb = new CellRangeAddress(rownumber+1,rownumber+1,6,12); 12 sheet.addMergedRegion(craa); 13 HSSFCell cellw = roww.createCell((short)0); 14 cellw.setCellValue("繼保整定核對日期及核對人:"); 15 sheet.addMergedRegion(craaa); 16 HSSFCell celle = roww.createCell((short)6); 17 celle.setCellValue("變電運行核對日期及核對人:"); 18 sheet.addMergedRegion(craab); 19 HSSFCell cellr = rowwq.createCell((short)0); 20 cellr.setCellValue("調度核對日期及核對人:"); 21 sheet.addMergedRegion(craabb); 22 HSSFCell cellt = rowwq.createCell((short)6); 23 cellt.setCellValue("檢修繼保班核對日期及核對人:"); 24 int rowss = dataRows.size() + 5; //rowss為datatable行數 25 HSSFRow rowq = sheet.createRow(rowss);//sheet創建行 26 rowq.setHeight((short) 300);// 設定行的高度 27 rowq.setRowStyle(cellStyle); 28 CellRangeAddress cra=new CellRangeAddress(rowss,rowss+10,0,columns.size()-1);//合並單元格的首行、最後一行、首列、最後一列。 29 sheet.addMergedRegion(cra); 30 HSSFCell cellq = rowq.createCell((short)0); 31 cellq.setCellValue(Constants.CHECKMANAGEMENT_CHECKDZDSTANDARD); 32 cellq.setCellStyle(cellStyley); 33 cellw.setCellStyle(cellStyleq); 34 celle.setCellStyle(cellStyleq); 35 cellr.setCellStyle(cellStyleq); 36 cellt.setCellStyle(cellStyleq); 37 CellRangeAddress crm = new CellRangeAddress(0,0,0,columns.size()-1);//表頭大標題 38 HSSFRow rowm = sheet.createRow(0);//sheet創建行 39 rowm.setHeight((short) 1000);// 設定行的高度 40 rowm.setRowStyle(cellStylem); 41 sheet.addMergedRegion(crm); 42 HSSFCell cellm = rowm.createCell((short)0); 43 cellm.setCellValue("台州電網繼電保護及安全自動裝置整定單核對表"); 44 cellm.setCellStyle(cellStylem);
然後序號問題我就做的比較蠢了,向下平移兩格後第二行我直接設置column.size()的個數遞增設置列序號。。。。。。。
豎向序號的話就直接在數據庫中加了點東西,因為用的是sql server,所以有現成的東西。
ROW_NUMBER() OVER (ORDER BY GUID) AS 'RowNumber'
這個可以增加行序號~
有關這個前後台傳遞參數的問題我搞了三天吧,從最開始傻了吧唧直接指定固定位置後台直接保存,到前台傳遞參數後台接受並操作,操作後response回前台彈出窗口並進行下載。問別人問到他煩哈哈哈哈哈媽的真是沒愛。
1 var openPostWindow = function(url,params){ 2 debugger 3 var form = $("<form>"); 4 form.attr("style","display:none"); // not success 5 form.attr("action", url); 6 form.attr("target","_blank"); // not success 7 form.attr("method","post"); 8 form.attr("action",url); 9 for(var param in params){ 10 var inputField = $("<input>"); 11 inputField.attr("type","text"); 12 inputField.attr("name",param); 13 inputField.attr("value",params[param]); 14 form.append(inputField); //把參數值以表單形式傳遞 !! 獲取參數值 15 } 16 $("body").append(form); 17 form.submit(); 18 form.remove(); 19 20 } 傳參
首先,所用框架決定,我要是想彈出下載的話,應該有固定的參數格式。我的參數格式是參照springweb傳遞參數的格式設定的。這裡就不是java的問題了,是js jq的問題,他們應當能夠給我後台傳回我所需要我能操作的參數。
這裡貼一段js代碼。前台單擊按鈕,首先將要獲取的東西一一獲取,然後設定url,然後設定參數,然後提交到openpostwindow中,在這個方法裡面,新建一個form表單,傳過來幾個參數,我就新建幾個inputfield ,不過這些都是隱藏著進行的,用戶看不到,然後使用for in 依次給inputfield賦值,name和value,皆對應相應的參數值,
比如我的,就是name就是我自己傳過來設定的那個名字,substationa
value則是我subtation實際傳過來的值,即"白雲變"
這樣 ,form中包含著三個inputfield,而這三個控件則擁有其自己的名字和值, 然後進行提交表單,就可以進入後台,後台中是這樣的定義的。
1 public String cdzdExcel(@RequestParam(value ="substationaa" , required = false) String substationaa, 2 @RequestParam(value ="voltageaa", required = false)String voltageaa, 3 @RequestParam(value ="guid", required = false) String guid 4 ) {
這樣,就ok啦,前台獲取的參數,通過提交表單,傳入後台參數,後台可以對這個進行操作了。required = false 是傳入的參數可以為空的意思~~~
這個應該算是注解模式吧,使用的時候必須debug慢慢看,前後台都要debug,不然不行。
調試這個時候總是要出現 error400的 ,不是你的url有問題,就是你的傳參有問題,一般我都是傳參有問題。
1 { 2 type:"button", 3 text :"生成", 4 iconCls : 'icon-plus-circle', 5 csstype : 'primary',//背景色 6 onClick:function(){ 7 var voltagea = F1WidgetMgr.get('voltage').getText();//獲取下拉框內電壓參數 8 var substationa = F1WidgetMgr.get('substation').getText();//獲取變電站參數 9 // $('#grid').bpgrid('exportExcel'); 10 var rows = $("#grid").bpgrid('getSelected');//bdz? 11 if(rows.length == 0){ 12 artDialog.alert("請選擇數據進行操作!"); 13 return; 14 } 15 var valueForme = []; 16 var i = 0; 17 for(i;i<=(rows.length-1);i++){ 18 valueForme.push(rows[i].GUID); 19 } 20 var valueFormm = valueForme.toString();//將valueform轉為字符串比較容易轉入後台 21 // alert(substationa); 要是有太多需要生成就直接把頁數調成 22 var url = "checkManagement/cdzdExcel/importsExcel.do"; 23 // var url = "ui/grid/export.do";把valueForm 24 // 25 // var options = $('#gridpanel').data().f1Searchgrid.options; 26 // var params = { 27 // service : options.service, 28 // filterStr : options.filterStr 29 // 30 // } 31 32 var params = { 33 substationaa : substationa, 34 voltageaa : voltagea, 35 guid : valueFormm 36 }; 37 openPostWindow(url,params); 38 39 // alert("11");
1 var openPostWindow = function(url,params){ 2 debugger 3 var form = $("<form>"); 4 form.attr("style","display:none"); // no success 5 form.attr("action", url); 6 form.attr("target","_blank"); // no success 7 form.attr("method","post"); 8 form.attr("action",url); 9 for(var param in params){ 10 var inputField = $("<input>"); 11 inputField.attr("type","text"); 12 inputField.attr("name",param); 13 inputField.attr("value",params[param]); 14 form.append(inputField); //把參數值以表單形式傳遞 !! 獲取參數值 15 } 16 $("body").append(form); 17 form.submit(); 18 form.remove(); 19 20 }
前後台傳參結束了,後台操作也結束了,現在生成的這個workbook放到哪裡呢。~~~
這麼放,重點看幾行,
OutputStream out = response.getOutputStream(); 20 response.setCharacterEncoding("UTF-8"); 21 response.setContentType("application/x-msdownload");//設置向浏覽器端傳送的文件格式 22 response.setHeader("Content-disposition", "attachment; filename=" 23 + URLEncoder.encode(fileName, "utf-8"));
22+23行代碼就是關鍵,以這個格式設置的話,便會彈出下載。 寫完記得關文件流。
這個代碼還存到了c盤,如果沒有c盤還會報錯。
不想存的話可以直接刪了。
1 /** 獲取excel數據 */ 2 HSSFWorkbook workbook = CdzdsuperImportExcelServiceImpl.getExcel(guidd,sub,userModel); 3 /** 輸出流文件 */ 4 HttpServletResponse response = (HttpServletResponse) ThreadLocalUtils 5 .getObjectFromThreadLocal("response"); 6 try { 7 // 表名 8 String tableName = "變電站定值單三核對表"; 9 String path = "c:\\"; 10 SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); 11 Date date = new Date(); 12 String formatDate = sdf.format(date); 13 // 文件名 14 String fileName = formatDate + "年"+voltageaa + substationaa + tableName 15 + ".xls"; 16 path += fileName; 17 FileOutputStream fileOut = new FileOutputStream(path); 18 response.reset(); 19 OutputStream out = response.getOutputStream(); 20 response.setCharacterEncoding("UTF-8"); 21 response.setContentType("application/x-msdownload");//設置向浏覽器端傳送的文件格式 22 response.setHeader("Content-disposition", "attachment; filename=" 23 + URLEncoder.encode(fileName, "utf-8")); 24 workbook.write(fileOut); 25 fileOut.flush(); 26 fileOut.close(); 27 workbook.write(out); 28 out.flush(); 29 out.close(); 30 } catch (Exception e) { 31 throw new MessageException("下載出現錯誤", e); 32 } 33 return json.toJson(new ValidateMessage(true, "111"));
這個是我自己做出來的效果。代碼會在下面。
現在是總結和吐槽時間。
這個功能其實想想不難,難住我的是剛接觸java直接用框架再加上公司平台,我直接懵逼,期間自我否定,有點怨天尤人,讓我耽誤了很多時間。
剛開始我是真的覺得自己做不出來,幾乎什麼都不懂,然後這個功能身邊一個組的同事也都不太懂。。。我問人都沒地方問。。。真的太折磨了。。。
數據庫由於應用不熟練不懂游標 ,一路查一路搞過來,數據庫應該注意的是在java語句中一定要注意空格,注意一些字符的長度,我被guid坑了好久,因為默認字符長度太短我的guid總是少了兩個字符,找了好久查詢不出來的問題。游標懂了一些,拼接懂了一點,表的聯合懂了一點。
前後台那裡問人加研究,debug太重要了,一步一步,de的我頭發嘩嘩掉。
poi操作excel ,我從聽都沒聽過到做出這麼一個比較規整美觀的表格我還是很有成就感的,多虧了博客園的諸多博客以及百度啦,需要改進的地方就是自己不太想去深入的理解,總是去試,因為這樣不用思考,這樣太蠢了,,100多個嘗試文檔。。也是智障。。。。
最重要的是,做事絕不可以敷衍了事了,工作不滿足用戶需求,就是你自己的鍋,活在手裡,決不能逃避,逃也是你的,不會做還是你的,沒有人會管你。
凡事先debug再問人,先把手裡信息弄懂,這樣問人,別人說的話你才懂,你問別人的問題,才有分量。
時間不等人,努力。。。。
以下為各層代碼
1 package com.jb.f1.checkManagement.taizhou.controller; 2 import java.io.FileOutputStream; 3 import java.io.OutputStream; 4 import java.net.URLEncoder; 5 import java.text.SimpleDateFormat; 6 import java.util.ArrayList; 7 import java.util.Date; 8 import java.util.List; 9 10 import javax.annotation.Resource; 11 import javax.servlet.http.HttpServletResponse; 12 import javax.servlet.http.HttpSession; 13 14 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 15 import org.springframework.stereotype.Controller; 16 import org.springframework.web.bind.annotation.RequestMapping; 17 import org.springframework.web.bind.annotation.RequestParam; 18 import org.springframework.web.bind.annotation.ResponseBody; 19 20 import com.jb.core.constant.ICnsView; 21 import com.jb.data.DataTable; 22 import com.jb.exception.MessageException; 23 import com.jb.f1.checkManagement.taizhou.service.impl.CdzdImportExcelServiceImpl; 24 import com.jb.f1.kernel.util.ThreadLocalUtils; 25 import com.jb.model.UserModel; 26 import com.jb.util.json.JsonBinder; 27 import com.jb.workflow.data.ValidateMessage; 28 /** 29 * 30 * @author zyb 31 *2016年8月25日 32 *com.jb.f1.checkManagement.taizhou.controller 33 */ 34 35 @Controller 36 @RequestMapping("/cdzdExcel") 37 public class CdzdsuperImportExcelController { 38 @Resource(name = "CdzdsuperImportExcelServiceImpl") 39 private com.jb.f1.checkManagement.taizhou.service.impl.CdzdsuperImportExcelServiceImpl CdzdsuperImportExcelServiceImpl ; 40 /** 轉換器 */ 41 protected JsonBinder json = JsonBinder.getJsonBinder(); 42 @RequestMapping("importsExcel.do") 43 @ResponseBody 44 public String cdzdExcel(@RequestParam(value ="substationaa" , required = false) String substationaa, 45 @RequestParam(value ="voltageaa", required = false)String voltageaa, 46 @RequestParam(value ="guid", required = false) String guid 47 ) { 48 HttpSession session = (HttpSession) ThreadLocalUtils.getObjectFromThreadLocal("session"); 49 UserModel userModel = (UserModel) session.getAttribute(ICnsView.LOGIN_USERMODEL); 50 String[] guidd =new String[]{}; 51 guidd = guid.split(","); //轉換為字符數組 52 String guiddd = "'"+guid.replaceAll(",", "','")+"'";//轉換為能夠被數據查詢語句查詢的字符串 53 List sublist = new ArrayList(); 54 String[] sub =new String[]{}; 55 //1 guid獲取sublist 56 sublist = CdzdsuperImportExcelServiceImpl.getSubName(guiddd); 57 String[] array =new String[sublist.size()]; 58 sub = (String[]) sublist.toArray(array);// 字符數組 59 //2 guidd sub 這兩個返回workbook 60 /** 獲取excel數據 */ 61 HSSFWorkbook workbook = CdzdsuperImportExcelServiceImpl.getExcel(guidd,sub,userModel); 62 /** 輸出流文件 */ 63 HttpServletResponse response = (HttpServletResponse) ThreadLocalUtils 64 .getObjectFromThreadLocal("response"); 65 try { 66 // 表名 67 String tableName = "變電站定值單三核對表"; 68 String path = "c:\\"; 69 SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); 70 Date date = new Date(); 71 String formatDate = sdf.format(date); 72 // 文件名 73 String fileName = formatDate + "年"+voltageaa + substationaa + tableName 74 + ".xls"; 75 path += fileName; 76 FileOutputStream fileOut = new FileOutputStream(path); 77 response.reset(); 78 OutputStream out = response.getOutputStream(); 79 response.setCharacterEncoding("UTF-8"); 80 response.setContentType("application/x-msdownload");//設置向浏覽器端傳送的文件格式 81 response.setHeader("Content-disposition", "attachment; filename=" 82 + URLEncoder.encode(fileName, "utf-8")); 83 workbook.write(fileOut); 84 fileOut.flush(); 85 fileOut.close(); 86 workbook.write(out); 87 out.flush(); 88 out.close(); 89 } catch (Exception e) { 90 throw new MessageException("下載出現錯誤", e); 91 } 92 return json.toJson(new ValidateMessage(true, "111")); 93 94 } 95 96 97 } 控制層 1 package com.jb.f1.checkManagement.taizhou.service.impl; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import javax.annotation.Resource; 7 8 import org.apache.commons.lang.StringUtils; 9 import org.apache.poi.hssf.usermodel.HSSFCell; 10 import org.apache.poi.hssf.usermodel.HSSFCellStyle; 11 import org.apache.poi.hssf.usermodel.HSSFFont; 12 import org.apache.poi.hssf.usermodel.HSSFRow; 13 import org.apache.poi.hssf.usermodel.HSSFSheet; 14 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 15 import org.apache.poi.hssf.util.CellRangeAddress; 16 import org.apache.poi.hssf.util.HSSFColor; 17 import org.springframework.stereotype.Service; 18 import org.springframework.transaction.annotation.Propagation; 19 import org.springframework.transaction.annotation.Transactional; 20 21 import com.jb.config.util.PlatformConfigUtil; 22 import com.jb.dao.GenericDao; 23 import com.jb.data.DataColumn; 24 import com.jb.data.DataColumnCollection; 25 import com.jb.data.DataRow; 26 import com.jb.data.DataRowCollection; 27 import com.jb.data.DataTable; 28 import com.jb.f1.checkManagement.util.Constants; 29 import com.jb.model.UserModel; 30 import com.jb.util.POIExcelUtil; 31 32 33 @Service("CdzdsuperImportExcelServiceImpl") 34 @Transactional 35 public class CdzdsuperImportExcelServiceImpl { 36 @Resource(name="genericDao") 37 private GenericDao genericDao; 38 @Transactional(value = "transactionManager", propagation = Propagation.REQUIRED) 39 @SuppressWarnings("deprecation") 40 public HSSFWorkbook getExcel(String[] guidd , String[] sub, UserModel userModel) { // 參數多加sub list 41 HSSFWorkbook workbook = POIExcelUtil.createNewHSSFWorkbook(); 42 String guid=StringUtils.join(guidd, ","); 43 String guiddd = "'"+guid.replaceAll(",", "','")+"'";//轉換為能夠被數據查詢語句查詢的字符串 44 for(int i=0;i<sub.length;i++){ 45 DataTable dataTablec=null; 46 DataTable dataTable = new DataTable(); 47 StringBuffer sql1 = new StringBuffer(); 48 List lista = new ArrayList(); 49 String[] guida =new String[]{}; 50 sql1.append("SELECT CAST(GUID AS VARCHAR(500)) AS GUID FROM US_APP.TB_DZD_INFORMATION WHERE SUBSTATION = ? AND GUID IN ("+guiddd+")" ); 51 lista = genericDao.getDataWithSQL(sql1.toString(),new Object[]{sub[i]}); 52 String[] array =new String[lista.size()]; 53 guida = (String[]) lista.toArray(array); 54 for(int j=0;j<guida.length;j++){ 55 PlatformConfigUtil.getString("dbtype"); 56 StringBuffer sql = new StringBuffer(); 57 sql.append("DECLARE " 58 + "@NAME2 NVARCHAR (300)," 59 + "@NAME3 NVARCHAR (300)," 60 + "@NAME5 NVARCHAR (300)," 61 + "@NAME6 NVARCHAR (300)"); 62 sql.append("DECLARE CUR CURSOR" 63 + " forward_only " 64 + "FOR SELECT " 65 + "TASKACTOR,ENDTIME " 66 + "FROM US_SYS.TV_WF_TASKLOG " 67 + "WHERE PROCESSINSTANCE = ("); 68 sql.append("SELECT PROCESSINSTANCE_ " 69 + "FROM US_SYS.JBPM_VARIABLEINSTANCE " 70 + "WHERE STRINGVALUE_= ? "// 此處問號 71 + " AND NAME_ = 'orderNo')");//問號~~~ 72 sql.append("AND (TASKNAME LIKE '執行'" 73 + " OR TASKNAME LIKE '核對') " 74 + "AND ENDTIME IS NOT NULL "); 75 sql.append("OPEN CUR "); 76 sql.append("FETCH NEXT FROM CUR INTO" 77 + " @NAME2,@NAME3 "); 78 sql.append("FETCH NEXT FROM CUR INTO " 79 + " @NAME5,@NAME6 "); 80 sql.append("CLOSE CUR "); 81 sql.append(" DEALLOCATE CUR "); 82 sql.append(" SELECT "); 83 sql.append(" ROW_NUMBER() OVER (ORDER BY GUID) AS 'RowNumber',CAST(T1.SUBSTATION AS VARCHAR(500)) AS SUBSTATION, " 84 + "CAST(T1.EQUIPMENT AS VARCHAR(500)) AS EQUIPMENT, "//設備名稱 85 + "CAST(T1.EQUIPMENTVERSION AS VARCHAR(500)) AS EQUIPMENTVERSION, "//保護型號 86 + "CAST(T1.DZDINDEX AS VARCHAR(500)) AS DZDINDEX, " //定值單編號 87 + "CAST(T1.BRANCHID AS VARCHAR(500)) AS BRANCHID, "//版本 88 + "CAST(@NAME2 AS VARCHAR(500)) + " 89 + "CAST(@NAME3 AS VARCHAR(500)) AS ENDTIME1, " 90 + "CAST(@NAME5 AS VARCHAR(500)) + " 91 + "CAST(@NAME6 AS VARCHAR(500)) AS ENDTIME2 " ); 92 sql.append(" FROM "); 93 sql.append( " US_APP.TB_DZD_INFORMATION T1, "); 94 sql.append(" US_SYS.TV_WF_TASKLOG T, "); 95 sql.append(" US_SYS.JBPM_VARIABLEINSTANCE V "); 96 sql.append(" WHERE "); 97 sql.append("T1.ISDELETE = 0 "); 98 sql.append(" AND T1.GUID = V.STRINGVALUE_ "); 99 sql.append(" AND T.PROCESSINSTANCE = V.PROCESSINSTANCE_ "); 100 sql.append(" AND (T.TASKNAME = '執行' ) "); 101 sql.append(" AND T1.GUID = ? " ); 102 dataTablec = genericDao.getDataIntoDataTable(sql.toString(), new Object[]{guida[j],guida[j]}); 103 dataTable.appendRow(dataTablec.getRow(0)); 104 } 105 dataTable.appendColumn("序號"); 106 dataTable.appendColumn("變電站"); 107 dataTable.appendColumn("設備名稱"); 108 dataTable.appendColumn("保護型號"); 109 dataTable.appendColumn("定值單編號"); 110 dataTable.appendColumn("版本號"); 111 dataTable.appendColumn("定值單執行日期及執行人"); 112 dataTable.appendColumn("定值單核對日期及核對人"); 113 dataTable.appendColumn("繼保整定核對"); 114 dataTable.appendColumn("調度核對"); 115 dataTable.appendColumn("變電運行核對"); 116 dataTable.appendColumn("檢修繼保核對"); 117 dataTable.appendColumn("備注(填寫出入情況)"); 118 // 這裡一個sub。length循環 119 HSSFSheet sheet = workbook.createSheet(sub[i]);//這裡creat參數為sub 120 121 sheet.setColumnWidth(0, 2500); 122 sheet.setColumnWidth(1, 3500); 123 sheet.setColumnWidth(2, 3500); 124 sheet.setColumnWidth(3, 2500); 125 sheet.setColumnWidth(4, 3500); 126 sheet.setColumnWidth(5, 3500); 127 sheet.setColumnWidth(6, 7500); 128 sheet.setColumnWidth(7, 7500); 129 sheet.setColumnWidth(8, 2500); 130 sheet.setColumnWidth(9, 2500); 131 sheet.setColumnWidth(10, 2500); 132 sheet.setColumnWidth(11, 2500); 133 sheet.setColumnWidth(12, 4500); 134 List<String> columnNames = new ArrayList<String>(); 135 /** 構造表頭 */ 136 DataColumnCollection columns = dataTable.getColumns();//dat 137 int s = 0; 138 for (int k = 0; k < columns.size(); k++) { 139 DataColumn dataColumn = columns.get(k); 140 String columnName = dataColumn.getCaption() == null ? dataColumn 141 .getColumnName() : dataColumn.getCaption(); 142 // 去掉不打印的和隱藏字段 143 if (dataColumn.getHidden() == true||"OBJ_CAPTION".equals(dataColumn 144 .getColumnName())||"GUID".equals(dataColumn 145 .getColumnName())) { 146 continue; 147 } else { 148 DataColumn raleColumn = columns.get(dataColumn.getColumnName() 149 + "_DSPVALUE"); 150 if (raleColumn != null) { 151 raleColumn.setCaption(dataColumn.getCaption()); 152 continue; 153 } 154 } 155 156 if (dataColumn.getColumnName().indexOf("_DSPVALUE") != -1) { 157 DataColumn raleColumn = columns.get(dataColumn.getColumnName() 158 .replace("_DSPVALUE", "")); 159 if (raleColumn != null && !raleColumn.isPrint()) { 160 continue; 161 } else { 162 columnName = columnName.replace("_DSPVALUE", ""); 163 } 164 } 165 HSSFFont font = workbook.createFont(); 166 font.setFontName("宋體"); 167 font.setFontHeightInPoints((short) 12);//設置字體大小 168 HSSFFont fontr = workbook.createFont();//字體樣式2 169 fontr.setFontName("宋體"); 170 fontr.setFontHeightInPoints((short) 12);//設置字體大小 171 fontr.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 172 HSSFCellStyle columnHeadStyle = workbook.createCellStyle(); 173 columnHeadStyle.setWrapText(true);//設置自動換行 174 columnHeadStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 175 columnHeadStyle.setFillForegroundColor(HSSFColor.LEMON_CHIFFON.index); 176 HSSFCellStyle setBorder = workbook.createCellStyle(); 177 setBorder.setAlignment(HSSFCellStyle.ALIGN_CENTER); 178 columnHeadStyle.setFont(fontr); 179 columnHeadStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中 180 columnHeadStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中 181 columnHeadStyle.setLocked(true); 182 columnHeadStyle.setWrapText(true); 183 columnHeadStyle.setLeftBorderColor(HSSFColor.BLACK.index);// 左邊框的顏色 184 columnHeadStyle.setBorderLeft((short) 1);// 邊框的大小 185 columnHeadStyle.setRightBorderColor(HSSFColor.BLACK.index);// 右邊框的顏色 186 columnHeadStyle.setBorderRight((short) 1);// 邊框的大小 187 columnHeadStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 設置單元格的邊框為粗體 188 columnHeadStyle.setBottomBorderColor(HSSFColor.BLACK.index); // 設置單元格的邊框顏色 189 DataRowCollection dataRowss = dataTable.getRows(); 190 POIExcelUtil.setCellValueDefaultNoSave(workbook, sheet.getSheetName(), 2, s++, 191 columnName, columnHeadStyle); //此處設置表頭位置 192 columnNames.add(dataColumn.getColumnName()); 193 194 } 195 /** 構造內容 */ 196 DataRowCollection dataRows = dataTable.getRows(); 197 HSSFCellStyle cellStyle = workbook.createCellStyle(); 198 HSSFFont font = workbook.createFont();//字體樣式1 199 font.setFontName("宋體"); 200 font.setFontHeightInPoints((short) 14);//設置字體大小 201 202 HSSFFont fontq = workbook.createFont();//字體樣式2 203 fontq.setFontName("宋體"); 204 fontq.setFontHeightInPoints((short) 12);//設置字體大小 205 fontq.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 206 207 HSSFFont fontm = workbook.createFont();//字體樣式3 208 fontm.setFontName("宋體"); 209 fontm.setFontHeightInPoints((short) 22);//設置字體大小 210 fontm.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 211 212 HSSFFont fonty = workbook.createFont();//字體樣式3 213 fonty.setFontName("宋體"); 214 fonty.setFontHeightInPoints((short) 12);//設置字體大小 215 216 cellStyle.setWrapText(true);//設置自動換行 217 cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 218 cellStyle.setFillForegroundColor(HSSFColor.WHITE.index); 219 HSSFCellStyle setBorder = workbook.createCellStyle(); 220 setBorder.setAlignment(HSSFCellStyle.ALIGN_CENTER); 221 cellStyle.setFont(font); 222 cellStyle.setWrapText(true);//設置自動換行 223 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中 224 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中 225 cellStyle.setLocked(true); 226 cellStyle.setWrapText(true); 227 cellStyle.setLeftBorderColor(HSSFColor.BLACK.index);// 左邊框的顏色 228 cellStyle.setBorderLeft((short) 1);// 邊框的大小 229 cellStyle.setRightBorderColor(HSSFColor.BLACK.index);// 右邊框的顏色 230 cellStyle.setBorderRight((short) 1);// 邊框的大小 231 cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 設置單元格的邊框為粗體 232 cellStyle.setBottomBorderColor(HSSFColor.BLACK.index); // 設置單元格的邊框顏色 233 234 HSSFCellStyle cellStyleq = workbook.createCellStyle(); 235 cellStyleq.setWrapText(true);//設置自動換行 236 cellStyleq.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 237 cellStyleq.setFillForegroundColor(HSSFColor.WHITE.index); 238 cellStyleq.setAlignment(HSSFCellStyle.ALIGN_LEFT);// 左右居左 239 cellStyleq.setFont(font); 240 cellStyleq.setWrapText(true);//設置自動換行 241 cellStyleq.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居 242 cellStyleq.setLocked(true); 243 cellStyleq.setWrapText(true); 244 cellStyleq.setLeftBorderColor(HSSFColor.BLACK.index);// 左邊框的顏色 245 cellStyleq.setBorderLeft((short) 1);// 邊框的大小 246 cellStyleq.setRightBorderColor(HSSFColor.BLACK.index);// 右邊框的顏色 247 cellStyleq.setBorderRight((short) 1);// 邊框的大小 248 cellStyleq.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 設置單元格的邊框為粗體 249 cellStyleq.setBottomBorderColor(HSSFColor.BLACK.index); // 設置單元格的邊框顏色 250 cellStyleq.setFont(fontq); //字體 251 252 HSSFCellStyle cellStyley = workbook.createCellStyle(); 253 cellStyley.setWrapText(true);//設置自動換行 254 cellStyley.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 255 cellStyley.setFillForegroundColor(HSSFColor.WHITE.index); 256 cellStyley.setAlignment(HSSFCellStyle.ALIGN_LEFT);// 左右居左 257 cellStyley.setWrapText(true);//設置自動換行 258 cellStyley.setVerticalAlignment(HSSFCellStyle.ALIGN_LEFT);// 上下居 259 cellStyley.setLocked(true); 260 cellStyley.setWrapText(true); 261 cellStyley.setLeftBorderColor(HSSFColor.BLACK.index);// 左邊框的顏色 262 cellStyley.setBorderLeft((short) 1);// 邊框的大小 263 cellStyley.setRightBorderColor(HSSFColor.BLACK.index);// 右邊框的顏色 264 cellStyley.setBorderRight((short) 1);// 邊框的大小 265 cellStyley.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 設置單元格的邊框為粗體 266 cellStyley.setBottomBorderColor(HSSFColor.BLACK.index); // 設置單元格的邊框顏色 267 cellStyley.setFont(fonty); //字體 268 269 HSSFCellStyle cellStylem = workbook.createCellStyle();//第三個樣式 270 271 cellStylem.setWrapText(true);//設置自動換行 272 cellStylem.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 273 cellStylem.setFillForegroundColor(HSSFColor.WHITE.index); 274 cellStylem.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中 275 cellStylem.setFont(font); 276 cellStylem.setWrapText(true);//設置自動換行 277 cellStylem.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中 278 cellStylem.setLocked(true); 279 cellStylem.setWrapText(true); 280 cellStylem.setLeftBorderColor(HSSFColor.BLACK.index);// 左邊框的顏色 281 cellStylem.setBorderLeft((short) 1);// 邊框的大小 282 cellStylem.setRightBorderColor(HSSFColor.BLACK.index);// 右邊框的顏色 283 cellStylem.setBorderRight((short) 1);// 邊框的大小 284 cellStylem.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 設置單元格的邊框為粗體 285 cellStylem.setBottomBorderColor(HSSFColor.BLACK.index); // 設置單元格的邊框顏色 286 cellStylem.setFont(fontm); //字體 287 HSSFRow rowy = sheet.createRow(1);//sheet創建行 288 rowy.setHeight((short) 500);// 設定行的高度 289 rowy.setRowStyle(cellStyle); 290 for(int y=0;y<columns.size();y++){ 291 HSSFCell celly = rowy.createCell((short)y); 292 celly.setCellValue(y+1); 293 celly.setCellStyle(cellStyle); 294 } 295 296 for (int p = 0; p < dataRows.size(); p++) { 297 DataRow dataRow = dataRows.get(p); 298 for (int l = 0; l < columnNames.size(); l++) { 299 if (dataRow.getValue(columnNames.get(l)) != null) { 300 301 POIExcelUtil.setCellValueDefaultNoSave(workbook, sheet.getSheetName(), 302 p+3 , l, dataRow.getValue(columnNames.get(l)) 303 .toString(), cellStyle);//l+1可以向右平移一個單位 304 } else { 305 POIExcelUtil.setCellValueDefaultNoSave(workbook,sheet.getSheetName(), 306 p+3 , l, "", cellStyle); 307 } 308 } 309 } 310 311 312 int rownumber = dataRows.size()+3 ; 313 HSSFRow roww = sheet.createRow(rownumber); 314 HSSFRow rowwq = sheet.createRow(rownumber+1); 315 roww.setHeight((short) 600);// 設定行的高度 316 roww.setRowStyle(cellStyle); 317 rowwq.setHeight((short) 600);// 設定行的高度 318 rowwq.setRowStyle(cellStyle); 319 CellRangeAddress craa = new CellRangeAddress(rownumber,rownumber,0,5); 320 CellRangeAddress craaa = new CellRangeAddress(rownumber,rownumber,6,12); 321 CellRangeAddress craab = new CellRangeAddress(rownumber+1,rownumber+1,0,5); 322 CellRangeAddress craabb = new CellRangeAddress(rownumber+1,rownumber+1,6,12); 323 sheet.addMergedRegion(craa); 324 HSSFCell cellw = roww.createCell((short)0); 325 cellw.setCellValue("繼保整定核對日期及核對人:"); 326 sheet.addMergedRegion(craaa); 327 HSSFCell celle = roww.createCell((short)6); 328 celle.setCellValue("變電運行核對日期及核對人:"); 329 sheet.addMergedRegion(craab); 330 HSSFCell cellr = rowwq.createCell((short)0); 331 cellr.setCellValue("調度核對日期及核對人:"); 332 sheet.addMergedRegion(craabb); 333 HSSFCell cellt = rowwq.createCell((short)6); 334 cellt.setCellValue("檢修繼保班核對日期及核對人:"); 335 int rowss = dataRows.size() + 5; //rowss為datatable行數 336 HSSFRow rowq = sheet.createRow(rowss);//sheet創建行 337 rowq.setHeight((short) 300);// 設定行的高度 338 rowq.setRowStyle(cellStyle); 339 CellRangeAddress cra=new CellRangeAddress(rowss,rowss+10,0,columns.size()-1);//合並單元格的首行、最後一行、首列、最後一列。 340 sheet.addMergedRegion(cra); 341 HSSFCell cellq = rowq.createCell((short)0); 342 cellq.setCellValue(Constants.CHECKMANAGEMENT_CHECKDZDSTANDARD); 343 cellq.setCellStyle(cellStyley); 344 cellw.setCellStyle(cellStyleq); 345 celle.setCellStyle(cellStyleq); 346 cellr.setCellStyle(cellStyleq); 347 cellt.setCellStyle(cellStyleq); 348 CellRangeAddress crm = new CellRangeAddress(0,0,0,columns.size()-1);//表頭大標題 349 HSSFRow rowm = sheet.createRow(0);//sheet創建行 350 rowm.setHeight((short) 1000);// 設定行的高度 351 rowm.setRowStyle(cellStylem); 352 sheet.addMergedRegion(crm); 353 HSSFCell cellm = rowm.createCell((short)0); 354 cellm.setCellValue("台州電網繼電保護及安全自動裝置整定單核對表"); 355 cellm.setCellStyle(cellStylem); 356 // for(int m=0;m<=12;m++ ){ 357 // 358 // 359 // } 360 361 362 363 } 364 return workbook; 365 } 366 @Transactional(value = "transactionManager", propagation = Propagation.REQUIRED) 367 public List getSubName(String guiddd){ 368 StringBuffer sql = new StringBuffer(); 369 List list = new ArrayList(); 370 sql.append("SELECT DISTINCT CAST(SUBSTATION AS VARCHAR) AS SUBSTATION FROM US_APP.TB_DZD_INFORMATION "+"WHERE GUID IN ("+guiddd+")" ); 371 list = genericDao.getDataWithSQL(sql.toString()); 372 return list; 373 } 374 375 376 377 378 } serviceview層在前面拉,我就不重復了~~
希望有人給我留言指點一下~~謝謝謝~