java匯出Excel之前臺後臺
阿新 • • 發佈:2019-01-09
今天就介紹下之前在任務中遇到的Excel匯出的問題,剛做的時候查了很多資料,發現都不太全,今天就介紹下前臺和後臺。
1.前臺
優點:在windows和linux環境下都可執行,但是需要拼接。
table2Excel.js
var tableId; var excelTitle; function exportExcel(tableId,excelTitle,datesource){ this.tableId=tableId; this.excelTitle=excelTitle; try { var xls = new ActiveXObject ( "Excel.Application" ); } catch(e) { alert( "要列印該表,您必須安裝Excel電子表格軟體,同時瀏覽器須使用“ActiveX 控制元件”,您的瀏覽器須允許執行控制元件。 "); return ""; } xls.visible =true; // 設定excel為可見 var xlBook = xls.Workbooks.Add; var xlsheet = xlBook.Worksheets(1); //--合併-- var oTable=document.all[this.tableId]; xlsheet.Rows(1).Font.Name="黑體"; //--設定顯示字元而不是數字-- xlsheet.Columns(2).NumberFormatLocal="@"; xlsheet.Columns(3).NumberFormatLocal="@"; xlsheet.Columns(4).NumberFormatLocal="@"; xlsheet.Columns(5).NumberFormatLocal="@"; xlsheet.Columns(6).NumberFormatLocal="@"; xlsheet.Columns(7).NumberFormatLocal="@"; xlsheet.Columns(8).NumberFormatLocal="@"; xlsheet.Columns(9).NumberFormatLocal="@"; xlsheet.Columns(10).NumberFormatLocal="@"; // 設定單元格內容自動換行 range.WrapText = true ; // 設定單元格內容水平對齊方式 // range.HorizontalAlignment =Excel.XlHAlign.xlHAlignCenter;//設定單元格內容豎直堆砌方式 // range.VerticalAlignment=Excel.XlVAlign.xlVAlignCenter; // range.WrapText = true; xlsheet.Rows(3).WrapText=true; //自動換行 // 設定標題欄 xlsheet.Cells(1,1).Value=""; xlsheet.Cells(1,2).Value="xx";//標題欄題目 xlsheet.Cells(1,3).Value="xx"; xlsheet.Cells(1,4).Value="xx"; xlsheet.Cells(1,5).Value="xx"; xlsheet.Cells(1,6).Value="xx"; xlsheet.Cells(1,7).Value="xx"; xlsheet.Cells(1,8).Value="xx"; xlsheet.Cells(1,9).Value="xx"; xlsheet.Cells(1,10).Value="xx"; xlsheet.Cells(1,11).Value="xx"; xlsheet.Cells(1,12).Value="xx"; xlsheet.Cells(1,13).Value="xx"; date = eval(datesource); for(var da=0; da<date.length; da++) { xlsheet.Cells(da+2,1).Value=date[da].ID; xlsheet.Cells(da+2,2).Value=date[da].COLLA_CODE; xlsheet.Cells(da+2,3).Value=date[da].OCOLLA_ID; xlsheet.Cells(da+2,4).Value=date[da].WARRANT_ID; xlsheet.Cells(da+2,5).Value=date[da].IOU_ID; xlsheet.Cells(da+2,6).Value=date[da].LOAN_PER; xlsheet.Cells(da+2,7).Value=date[da].COL_TYPE; xlsheet.Cells(da+2,8).Value=date[da].EST_TIME; xlsheet.Cells(da+2,9).Value=date[da].ACCORG_ID; xlsheet.Cells(da+2,10).Value=date[da].STOORG_ID; xlsheet.Cells(da+2,11).Value=date[da].CURRENCY; xlsheet.Cells(da+2,12).Value=date[da].LOAN_AMT; xlsheet.Cells(da+2,13).Value=date[da].STATUS; } xlsheet.Columns.AutoFit; // xlsheet.Range( xlsheet.Cells(1,1),xlsheet.Cells(rowNum+1,cellNum)).HorizontalAlignment =-4108;// 居中 // xlsheet.Range( xlsheet.Cells(1,1),xlsheet.Cells(1,7)).VerticalAlignment =-4108; // xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,cellNum)).Font.Size=10; // xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,cellNum)).Borders(3).Weight = 2; // 設定左邊距 // xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,cellNum)).Borders(4).Weight = 2;// 設定右邊距 // xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,cellNum)).Borders(1).Weight = 2;// 設定頂邊距 // xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,cellNum)).Borders(2).Weight = 2;// 設定底邊距 xls.UserControl = true; // 很重要,不能省略,不然會出問題 意思是excel交由使用者控制 xls=null; xlBook=null; xlsheet=null; }
其中要匯出資料的話,直接呼叫exportExcel(tableId,excelTitle,msg);方法。tableId指的是table的代號(可有可無),excelTitle指的的表格的標題,msg指的是資料,可以用ajax後臺傳輸,另外要注意的是執行成功後,要安裝Excel ,不要用wps,之前試過,wps不支援。
2.後臺
優點:可以彈出框體,讓你自己選擇路徑和格式
缺點:部分彈出框體的方法在linux中不支援,所以只能在window的環境下執行。
PrintService.java
package com.rfid.service.print; /** * 匯出excel類 * */ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.JTextField; import javax.swing.filechooser.FileFilter; import org.apache.poi2.hssf.usermodel.HSSFCell; import org.apache.poi2.hssf.usermodel.HSSFClientAnchor; import org.apache.poi2.hssf.usermodel.HSSFFont; import org.apache.poi2.hssf.usermodel.HSSFRichTextString; import org.apache.poi2.hssf.usermodel.HSSFRow; import org.apache.poi2.hssf.usermodel.HSSFSheet; import org.apache.poi2.hssf.usermodel.HSSFWorkbook; import org.apache.poi2.hssf.util.HSSFColor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import com.rfid.entity.print.P_05010110; @Component public class PrintService { Logger log = LoggerFactory.getLogger(PrintService.class); public void resultSetToExcel(String[] headers, List list, String sheetName) throws Exception { HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet(); workbook.setSheetName(0, sheetName, HSSFWorkbook.ENCODING_UTF_16); HSSFRow row = sheet.createRow((short) 0); HSSFCell cell; String adr = selectSavePath(); // 產生表格標題行 row = sheet.createRow(0); for (short i = 0; i < headers.length; i++) { cell = row.createCell(i); HSSFRichTextString text = new HSSFRichTextString(headers[i]); cell.setCellValue(text); } // 遍歷集合資料,產生資料行 Iterator<P_05010110> it = list.iterator(); int index = 0; while (it.hasNext()) { index++; row = sheet.createRow(index); P_05010110 t = (P_05010110) it.next(); // 利用反射,根據javabean屬性的先後順序,動態呼叫getXxx()方法得到屬性值 Field[] fields = t.getClass().getDeclaredFields(); for (short i = 0; i < headers.length; i++) { cell = row.createCell(i); Field field = fields[i]; String fieldName = field.getName(); String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); try { Class tCls = t.getClass(); Method getMethod = tCls.getMethod(getMethodName, new Class[] {}); Object value = getMethod.invoke(t, new Object[] {}); // 判斷值的型別後進行強制型別轉換 String textValue = null; // 其它資料型別都當作字串簡單處理 textValue = value.toString(); // 如果不是圖片資料,就利用正則表示式判斷textValue是否全部由數字組成 if (textValue != null) { Pattern p = Pattern.compile("^//d+(//.//d+)?$"); Matcher matcher = p.matcher(textValue); if (matcher.matches()) { // 是數字當作double處理 cell.setCellValue(Double.parseDouble(textValue)); } else { HSSFRichTextString richString = new HSSFRichTextString( textValue); HSSFFont font3 = workbook.createFont(); font3.setColor(HSSFColor.BLUE.index); richString.applyFont(font3); cell.setCellValue(richString); } } } catch (SecurityException e) { log.info("excel export error:"+e.getMessage()); } catch (NoSuchMethodException e) { log.info("excel export error:"+e.getMessage()); } catch (IllegalArgumentException e) { log.info("excel export error:"+e.getMessage()); } catch (IllegalAccessException e) { log.info("excel export error:"+e.getMessage()); } catch (InvocationTargetException e) { log.info("excel export error:"+e.getMessage()); } finally { // 清理資源 } } } //String adr = "d:\\"+xlsName+".xls"; FileOutputStream fOut = new FileOutputStream(adr); workbook.write(fOut); fOut.flush(); fOut.close(); //path = D:\\Backup\\我的文件\\2013-6-26_110848.xls String fileName = adr.replace('\\', '/'); StringTokenizer st = new StringTokenizer(fileName, "/"); while (st.hasMoreTokens()) { String sub = st.nextToken(); if ((sub.indexOf(' ') != -1) || (sub.indexOf('&') != -1) || (sub.indexOf('(') != -1) || (sub.indexOf(')') != -1) || (sub.indexOf('[') != -1) || (sub.indexOf(']') != -1) || (sub.indexOf('{') != -1) || (sub.indexOf('}') != -1) || (sub.indexOf('^') != -1) || (sub.indexOf('=') != -1) || (sub.indexOf(';') != -1) || (sub.indexOf('!') != -1) || (sub.indexOf('\'') != -1) || (sub.indexOf('+') != -1) || (sub.indexOf(',') != -1) || (sub.indexOf('`') != -1) || (sub.indexOf('~') != -1)) //過濾掉特殊字元 { fileName = fileName.replaceFirst(sub, "\"" + sub + "\""); } } // fileName = D:/Backup/我的文件/2013-6s-09_110848.xls Runtime.getRuntime().exec("cmd /E:ON /c start " + fileName); JOptionPane.showMessageDialog(null, "匯出資料成功!"); } //獲得框圖 public String selectSavePath(){ SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd_HHmmss"); String name = dateformat.format(new Date()); name = name + ".xls"; //構造檔案儲存對話方塊 JFileChooser chooser = new JFileChooser(); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.setDialogType(JFileChooser.SAVE_DIALOG); chooser.setMultiSelectionEnabled(false); chooser.setAcceptAllFileFilterUsed(false); chooser.setDialogTitle("儲存單位資料檔案"); // //取得檔名輸入框設定指定格式 // JTextField fileNameField = getTextField(chooser); // fileNameField.setText(name); //替代方法 chooser.setSelectedFile(new File(name)); // 生成預設 //新增檔案過濾器 chooser.addChoosableFileFilter(new FileFilter(){ public boolean accept(File f) { return true; } public String getDescription() { return "所有檔案(*.*)"; } }); chooser.addChoosableFileFilter(new FileFilter(){ public boolean accept(File f) { if (f.getName().endsWith("xls") || f.isDirectory()) { return true; }else{ return false; } } public String getDescription() { return "Excel檔案(*.xls)"; } }); //開啟對話方塊 int result = chooser.showSaveDialog(null);//null //檔案確定 if(result==JFileChooser.APPROVE_OPTION) { File file = chooser.getSelectedFile(); if (!file.getName().toLowerCase().endsWith(".xls")) { file = new File(file.getParent(), file.getName() + ".xls"); } String outPath = file.getAbsolutePath(); if(new File(outPath).exists()){ JOptionPane.showMessageDialog(null, "檔案已經存在,請重新命名?"); return null; } return outPath; } return null; } }
後臺的匯出其實是最直接的,但是有一定的侷限性,這裡同樣是呼叫方法resultSetToExcel(String[] headers, List list,
String sheetName) head是頭部的集合,list自然是對應的資料,這裡的heads應該與list裡的資料對應。
以上這行就是匯出的方法,望對你們有幫助。
本文出自 “迎風飄來” 部落格,請務必保留此出處