今天想整理一下自己前段時間遇到的一個導出的問題。
因為項目的需求,要做一部分導出功能。開始的時候用的公司的導出,但是很奇怪有部分模塊導出的時候就是會報500錯誤,發現在刪減一些字段后就恢復了正常,當時因為項目緊張,也就臨時刪減了一些,但也不是長久之計,之后自己在原本的基礎上重新修改整理了一下,目前運行還算穩定,就此和大家分享一下。
導出需要三個部分,js,公共方法,后臺方法。
js代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
function exportData() { //前臺接收的參數 rwmc = $( "#txt_rwmc" ).val(); rwlb = $( "#com_rwlb" ).combobox( "getValues" ).join( "," ); //調用后臺導出功能 var service = new Service( "cx.RybjcxBndService.exprotExcel" ); var str= "<RWMC>" + rwmc + "</RWMC><RWLB>" + rwlb + "</RWLB>" ; var res = service.doService(str); var oDoc = loadXml(res); if (service.getCode() != "2000" ) { showMessage( "查詢失敗:" +service.getMessage()); return ; } var nodata = oDoc.selectSingleNode( "ROOT/NODATA" ).text; if (nodata == "nodata" ) { showMessage( "無數據!" ); return ; } // 獲取導出信息 var titleName = oDoc.selectSingleNode( "ROOT/TITLE_NAME" ).text; var fileName = oDoc.selectSingleNode( "ROOT/FILE_NAME" ).text; var outPutInfo = oDoc.selectSingleNode( "ROOT/OUTPUTINFO" ).text; var download_path = oDoc.selectSingleNode( "ROOT/DOWNLOAD_PATH" ).text; if (outPutInfo != "" ) { showMessage(outPutInfo); return ; } if (confirm( "導出成功!確認下載文件嗎?\n文件名稱為:" +fileName)) { var file = fileName; var showfile = titleName + ".xls" ; showfile = decodeURIComponent(showfile); var idx = document.URL.indexOf( "/adp" ); if (idx == - 1 ) { alert( "無法識別主機地址:" + document.URL); return ; } var host = document.URL.substring( 0 , idx); var width = screen.width; var height = screen.height; debugger; // 打開下載頁面 var param = "toolbar=no,location=no,status=yes,resizable=no,scrollbars=yes,top=" + height + ",left=" + width + ",width=100,height=100" ; // ---------------------------------------------------------- // 此代碼塊為解決ie6下導出excel失敗問題,原因是ie6對window.open(url)支持度不好, // 當瀏覽器為ie6時改用window.location.href var isIE=!!window.ActiveXObject; var isIE6=isIE&&!window.XMLHttpRequest; if (isIE6) { window.location.href=host + "/adp/work/gzkp/common/js/download_new.jsp?file=" + file + "&showfile=" + showfile + "&download_path=" + download_path; } else { window.open(host + "/adp/work/gzkp/common/js/download_new.jsp?file=" + file + "&showfile=" + showfile + "&download_path=" + download_path, "_blank" , param); } } } |
公共類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
|
package ctais.business.gzkp.common; import java.io.File; import java.io.FileInputStream; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.poi2.hssf.usermodel.HSSFCell; import org.apache.poi2.hssf.usermodel.HSSFCellStyle; import org.apache.poi2.hssf.usermodel.HSSFFont; import org.apache.poi2.hssf.usermodel.HSSFRow; import org.apache.poi2.hssf.usermodel.HSSFSheet; import org.apache.poi2.hssf.usermodel.HSSFWorkbook; import ctais.business.dashboard.service.ExportExcel; import ctais.config.Config; import ctais.services.data.DataWindow; import ctais.services.xml.XMLDataObject; import ctais.services.xml.XMLParser; import ctais.util.StringEx; import jxl.Workbook; import jxl.format.Alignment; import jxl.write.Label; import jxl.write.WritableCellFormat; import jxl.write.WritableFont; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; /** * <p>Title: 生成EXCEL文件</p> * <p>Description: 轉換String字符串為EXCEL文檔</p> * <p>Copyright: Copyright (c) 2004</p> * <p>Company: DC</p> * @author FENGZG * @version 1.0 * 時間:2015-12-28 */ public class CreateExcel { private final static String CONFIG_FILE_PATH = Config.CTAIS_HOME; WritableWorkbook wwb = null ; XMLDataObject xdo = null ; public CreateExcel(){ } /** * 生成EXCEL * @param sql 查詢SQL * @param czryDm 操作人員代碼 * @param titles 導出列標題 * @param exlTitle excel表頭 * @return * @throws Exception */ public String newToExcel(String sql,String czryDm,String[] titles,String exlTitle) throws Exception { try { HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); ExportExcel exportExcel = new ExportExcel(wb, sheet); StringBuffer sffer = new StringBuffer(); //int colNum = 30; DataWindow dw = DataWindow.dynamicCreate(sql.toString()); dw.setConnectionName(Icomm.GZKPJNDI); long dwRet = dw.retrieve(); if (dwRet <= 0 ) { sffer.append( "<NODATA>nodata</NODATA>" ); return sffer.toString(); } else { sffer.append( "<NODATA></NODATA>" ); } int colNum = dw.getColumnCount(); // 給工作表列定義列寬(實際應用自己更改列數) for ( short i = 0 ; i <= colNum; i++) { sheet.setColumnWidth(i, ( short ) 4000 ); } // 創建單元格樣式 HSSFCellStyle cellHeadStyle = wb.createCellStyle(); // 指定單元格居中對齊 cellHeadStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格垂直居中對齊 cellHeadStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 指定當單元格內容顯示不下時自動換行 cellHeadStyle.setWrapText( true ); // 設置單元格字體 HSSFFont headFont = wb.createFont(); headFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); headFont.setFontName( "宋體" ); headFont.setFontHeight(( short ) 200 ); cellHeadStyle.setFont(headFont); // 創建報表頭部 Date dt= new Date(); SimpleDateFormat sdt= new SimpleDateFormat( "yyyyMMddhhmmssS" ); String sfm = czryDm + "_" + sdt.format(dt); // 設置列頭 exportExcel.createNormalHead(exlTitle, colNum- 1 ); HSSFRow row1 = sheet.createRow( 1 ); for ( int i = 0 ; i < titles.length; i ++) { HSSFCell cell = row1.createCell(( short )i); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellStyle(cellHeadStyle); cell.setCellValue(titles[i]); } Object value = "" ; //設置表格樣式 HSSFCellStyle cellStyle = wb.createCellStyle(); // 指定單元格居中對齊 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格垂直居中對齊 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 指定當單元格內容顯示不下時自動換行 cellStyle.setWrapText( true ); // 設置單元格字體 HSSFFont font = wb.createFont(); font.setBoldweight(HSSFFont.SS_NONE); font.setFontName( "宋體" ); font.setFontHeight(( short ) 200 ); cellStyle.setFont(font); for ( int i = 0 ; i < dw.getRowCount(); i++) { HSSFRow row = sheet.createRow(i + 2 ); for ( int j = 1 ; j <= dw.getColumnCount(); j++) { HSSFCell cell = row.createCell(( short )(j- 1 )); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellStyle(cellStyle); value = dw.getItemAny(i, j- 1 ); if (value == null ) { cell.setCellValue( "" ); } else { cell.setCellValue(value.toString()); } } } //設置導出路徑,此處需要注意如果是Linux系統需要手動建路徑,(此處的原因有人比較清楚的話還請指教)引用新建的文件路徑 String path = "/export/" ; File file = new File(path); if (!file.exists()) { file.mkdirs(); } String fileName = sfm+ ".xls" ; //String pth = path.trim() + File.separator + fileName; String pth = path.trim() + fileName; pth = pth.trim(); String outPutInfo = exportExcel.outputExcel(pth); sffer.append( "<TITLE_NAME>" + sfm + "</TITLE_NAME>" ); sffer.append( "<DOWNLOAD_PATH>" + path + "</DOWNLOAD_PATH>" ); sffer.append( "<FILE_NAME>" + fileName + "</FILE_NAME>" ); sffer.append( "<OUTPUTINFO>" + outPutInfo + "</OUTPUTINFO>" ); return sffer.toString(); } catch (Exception e) { e.printStackTrace(); throw new Exception(e.getMessage()); } } } |
后臺代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
/** * 導出功能 * @param xdo 前臺傳參 * @param czryDm 操作人員代碼 * @return 生成的XLS信息 * @throws Exception 異常說明 */ public String exportExcel(XMLDataObject args,String czryDm) throws Exception { //接收前臺傳遞的查詢參數 String rwmc = StringEx.sNull(args.getItemValue( "RWMC" )); String rwlb = StringEx.sNull(args.getItemValue( "RWLB" )); if ( null != rwmc && ! "" .equals(rwmc)) { sqlWhere.append( " AND A.RWMC LIKE '%" +rwmc+ "%' " ); } if ( null != rwlb && ! "" .equals(rwlb)) { sqlWhere.append( " AND A.RWLB_DM = '" +rwlb+ "' " ); } StringBuilder sql = new StringBuilder(); //拼接查詢SQL sql.append( "SELECT RWXH,RWMC FROM RWXX" ) .append(sqlWhere).append( " ORDER BY RWXH ) " ).append(sqlisWhere); //導出的列標題 String[] titles = { "任務序號" , "任務名稱" }; //實例化公共類 CreateExcel excel = new CreateExcel(); return excel.newToExcel(sql.toString(), czryDm,titles, "Exlcel表頭" ); } |
以上這篇Java程序實現導出Excel的方法(支持IE低版本)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。