1. 程式人生 > >java匯出Excel之前臺後臺

java匯出Excel之前臺後臺

今天就介紹下之前在任務中遇到的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裡的資料對應。

以上這行就是匯出的方法,望對你們有幫助。

本文出自 “迎風飄來” 部落格,請務必保留此出處