1. 程式人生 > >JS及POI將頁面資料匯出EXCLE檔案的幾種方法

JS及POI將頁面資料匯出EXCLE檔案的幾種方法

JS實現的三種方法如下:

1、js檔案:exportExcel.js

//匯出方法1:把表格中的內容提取出來,利用IE的另存為.csv的格式。
 function getXlsFromTbl(inTblId, inTblContainerId, title, rownumbers) {
     try {
         var allStr = "";
         var curStr = "";
         //alert("getXlsFromTbl");
         if (inTblId != null && inTblId != "" && inTblId != "null") {
             curStr = getTblData($('#' + inTblId), $('#' + inTblContainerId), rownumbers);
         }
         if (curStr != null) {
             allStr += curStr;
         }
         else {
             alert("你要匯出的表不存在!");
             return;
         }
         var fileName = getExcelFileName(title);
         doFileExport(fileName, allStr);
     }
     catch (e) {
         alert("匯出發生異常:" + e.name + "->" + e.description + "!");
     }
 }
 function getTblData(curTbl, curTblContainer, rownumbers) {

     var outStr = "";
     if (curTbl != null) {
         var rowdata = curTbl.getRowData();
         var Lenr = 1;

         for (i = 0; i < Lenr; i++) {
             //var Lenc = curTbl.rows(i).cells.length;
             var th;
             if (rownumbers == true) {
                 th = curTblContainer.find('TH:not(:first-child)');
             }
             else {
                 th = curTblContainer.find('TH');
             }
             th.each(function(index, element) {
                 //alert($(element).text());
                 //取得每行的列數
                 var j = index + 1;
                 var content = $(element).text();
                 //alert(j + "|" + content);
                 outStr += content+ "\t";
                 //賦值

             });
             outStr += "\r\n";
         }
         var tmp = "";
         for (i = 0; i < rowdata.length; i++) {
             var row = eval(rowdata[i]);
            
             for (each in row) {
             //此程式需將科學計數法的單元格弄成文字格式--沒辦法
              if(row[each].length > 14){
               outStr += "'"+row[each]+"'" + "\t";
              }
              else outStr += row[each] + "\t";
              
                
             }
             outStr += "\r\n";
         }


     }
     else {
         outStr = null;
         alert(inTbl + "不存在!");
     }
     return outStr;
 }
 function getExcelFileName(title) {
     var d = new Date();
     var curYear = d.getYear();
     var curMonth = "" + (d.getMonth() + 1);
     var curDate = "" + d.getDate();
     var curHour = "" + d.getHours();
     var curMinute = "" + d.getMinutes();
     var curSecond = "" + d.getSeconds();
     if (curMonth.length == 1) {
         curMonth = "0" + curMonth;
     }
     if (curDate.length == 1) {
         curDate = "0" + curDate;
     }
     if (curHour.length == 1) {
         curHour = "0" + curHour;
     }
     if (curMinute.length == 1) {
         curMinute = "0" + curMinute;
     }
     if (curSecond.length == 1) {
         curSecond = "0" + curSecond;
     }
     var fileName = title + "_" + curYear + curMonth + curDate + "_"
             + curHour + curMinute + curSecond + ".html";
     //alert(fileName);
     return fileName;
 }
 function doFileExport(inName, inStr) {
     var xlsWin = null;
     if (!!document.all("HideFrm")) {
         xlsWin = HideFrm;
     }
     else {
         var width = 60;
         var height = 40;
         var openPara = "left=" + (window.screen.width / 2 - width / 2)
                 + ",top=" + (window.screen.height / 2 - height / 2)
                 + ",scrollbars=no,width=" + width + ",height=" + height;
         xlsWin = window.open("", "_blank", openPara);
     }
     xlsWin.document.write(inStr);
     xlsWin.document.close();
     xlsWin.document.execCommand('Saveas', true, inName);
     alert("匯出成功!");
     xlsWin.close();
 }
 
//匯出方法2:通過遍歷表格,給EXCEL中相應的單元格賦值。
 function method2(tableid) //讀取表格中每個單元到EXCEL中
 {
     var curTbl = document.getElementById(tableid);
     var oXL = new ActiveXObject("Excel.Application");
      //建立AX物件excel
     var oWB = oXL.Workbooks.Add();
     //獲取workbook物件
     var oSheet = oWB.ActiveSheet;
     //啟用當前sheet
     var Lenr = curTbl.rows.length;
     //取得表格行數
    
     var k=1;
     var rownumbers=true;
     for (i = 0; i < Lenr; i++)
     {
         var Lenc = curTbl.rows(i).cells.length;
        
         //////////////////////////////////////////
         if(i==0){
          var inTblContainerId='ordersId';
          var curTblContainer=$('#' + inTblContainerId);
          var th;
          if (rownumbers == true) {
                 th = curTblContainer.find('TH:not(:first-child)');
             }
             else {
                 th = curTblContainer.find('TH');
             }
            
             th.each(function(index, element) {
                 //alert($(element).text());
                 //取得每行的列數
                 var j = index + 1;
                 var content = $(element).text();
                 //alert(j + "|" + content);
                 oSheet.Cells(i + 1, j + 1).value = $(element).text();

             });
         
         }else{
        
         //取得每行的列數
          for (j = 0; j < Lenc; j++)
          {
           oSheet.Columns(k).NumberFormatLocal="@";
     k=k+1;
              oSheet.Cells(i + 1, j + 1).value = curTbl.rows(i).cells(j).innerText;
               //賦值
              
           }
          }
     }
    
     oXL.Visible = true;
     //設定excel可見屬性
 }
 
/******匯出方法3:直接拷貝整個表格到EXCEL中******/
 var idTmr;
        function method1(tableid) {//整個表格拷貝到EXCEL中

            var curTbl = document.getElementById(tableid);
            var oXL = new ActiveXObject("Excel.Application");
            //建立AX物件excel
            var oWB = oXL.Workbooks.Add();
            //獲取workbook物件
            var xlsheet = oWB.Worksheets(1);
            //啟用當前sheet
            var sel = document.body.createTextRange();
            sel.moveToElementText(curTbl);
            //把表格中的內容移到TextRange中
            sel.select();
            //全選TextRange中內容
            sel.execCommand("Copy");
            //複製TextRange中內容 
            xlsheet.Paste();
            //貼上到活動的EXCEL中      
            oXL.Visible = true;
            //設定excel可見屬性
            var company = "HL";
            if (company == "Baidu") {
                company = "百度";
            }
            else if (company == "Google") {
                 company = "谷歌";
            }
            else {
                company = "孫悟空";
            }

            try {
                var fname = oXL.Application.GetSaveAsFilename(company+"將當前頁面的資料匯出到Excel.xls", "Excel Spreadsheets (*.xls), *.xls");
            } catch (e) {
                print("Nested catch caught " + e);
            } finally {
                oWB.SaveAs(fname);

                oWB.Close(savechanges = false);
                //xls.visible = false;
                oXL.Quit();
                oXL = null;
                //結束excel程序,退出完成
                //window.setInterval("Cleanup();",1);
                idTmr = window.setInterval("Cleanup();", 1);

            }
        }
       
        function Cleanup() {
            window.clearInterval(idTmr);
            CollectGarbage();
        }

 2、Jsp頁面片段:queryorders.jsp

...

<li><input type="button" id="exportBtn" value="匯出EXCEL"/></li>

...

<div id="ordersId"><table id="orderListTable"></table></div> 

...

3、操作JS 程式碼片段:queryorders.js

 $('#exportBtn').click(function() {
 
       //方法1:提取前臺表格的資料,拼成串後。另存為csv格式檔案
       //getXlsFromTbl('orderListTable', 'ordersId', title, true);
      
       //方法2:直接copy當前頁面TABLE資料,另存XLS格式檔案。
       // method1('orderListTable');
      
       //方法3:提取頁面TABLE 的資料,將資料一一賦值到EXCLE 檔案。前提:客戶端裝有EXCEL ,且開放Axtive控制元件
       method2('orderListTable');
        
       }); 

------------------------以下是通過POI將資料生成EXCEL檔案放到伺服器的指定目錄------------------------

package com.longshine.util;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JOptionPane;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;

import com.longshine.demo.po.Orders;

/**
 * 利用開源元件POI3.0.2動態匯出EXCEL文件 轉載時請保留以下資訊,註明出處!
 *
 * @author leno
 * @version v1.0
 * @param <T>
 *            應用泛型,代表任意一個符合javabean風格的類
 *            注意這裡為了簡單起見,boolean型的屬性xxx的get器方式為getXxx(),而不是isXxx()
 *            byte[]表jpg格式的圖片資料
 */
public class ExportExcel<T>
{
 public void exportExcel(Collection<T> dataset, OutputStream out)
 {
  exportExcel("測試POI匯出EXCEL文件", null, dataset, out, "yyyy-MM-dd");
 }

 public void exportExcel(String[] headers, Collection<T> dataset,
   OutputStream out)
 {
  exportExcel("超人POI匯出的EXCEL文件", headers, dataset, out, "yyyy-MM-dd");
 }

 public void exportExcel(String[] headers, Collection<T> dataset,
   OutputStream out, String pattern)
 {
  exportExcel("測試POI匯出EXCEL文件", headers, dataset, out, pattern);
 }

 /**
  * 這是一個通用的方法,利用了JAVA的反射機制,可以將放置在JAVA集合中並且符號一定條件的資料以EXCEL 的形式輸出到指定IO裝置上
  *
  * @param title
  *            表格標題名
  * @param headers
  *            表格屬性列名陣列
  * @param dataset
  *            需要顯示的資料集合,集合中一定要放置符合javabean風格的類的物件。此方法支援的
  *            javabean屬性的資料型別有基本資料型別及String,Date,byte[](圖片資料)
  * @param out
  *            與輸出裝置關聯的流物件,可以將EXCEL文件匯出到本地檔案或者網路中
  * @param pattern
  *            如果有時間資料,設定輸出格式。預設為"yyy-MM-dd"
  */
 @SuppressWarnings("unchecked")
 public void exportExcel(String title, String[] headers,
   Collection<T> dataset, OutputStream out, String pattern)
 {
  // 宣告一個工作薄
  HSSFWorkbook workbook = new HSSFWorkbook();
  // 生成一個表格
  HSSFSheet sheet = workbook.createSheet(title);
  // 設定表格預設列寬度為15個位元組
  sheet.setDefaultColumnWidth((short) 15);
  // 生成一個樣式
  HSSFCellStyle style = workbook.createCellStyle();
  // 設定這些樣式
  style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
  style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  style.setBorderRight(HSSFCellStyle.BORDER_THIN);
  style.setBorderTop(HSSFCellStyle.BORDER_THIN);
  style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  // 生成一個字型
  HSSFFont font = workbook.createFont();
  font.setColor(HSSFColor.VIOLET.index);
  font.setFontHeightInPoints((short) 12);
  font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  // 把字型應用到當前的樣式
  style.setFont(font);
  // 生成並設定另一個樣式
  HSSFCellStyle style2 = workbook.createCellStyle();
  style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
  style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
  style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
  style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
  // 生成另一個字型
  HSSFFont font2 = workbook.createFont();
  font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
  // 把字型應用到當前的樣式
  style2.setFont(font2);

  // 宣告一個畫圖的頂級管理器
  HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
  // 定義註釋的大小和位置,詳見文件
  HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,
    0, 0, 0, (short) 4, 2, (short) 6, 5));
  // 設定註釋內容
  comment.setString(new HSSFRichTextString("可以在POI中添加註釋!"));
  // 設定註釋作者,當滑鼠移動到單元格上是可以在狀態列中看到該內容.
  comment.setAuthor("leno");

  // 產生表格標題行
  HSSFRow row = sheet.createRow(0);
  for (short i = 0; i < headers.length; i++)
  {
   HSSFCell cell = row.createCell(i);
   cell.setCellStyle(style);
   HSSFRichTextString text = new HSSFRichTextString(headers[i]);
   cell.setCellValue(text);
  }

  // 遍歷集合資料,產生資料行
  Iterator<T> it = dataset.iterator();
  int index = 0;
  while (it.hasNext())
  {
   index++;
   row = sheet.createRow(index);
   T t = (T) it.next();
   System.out.println(t.getClass());
   // 利用反射,根據javabean屬性的先後順序,動態呼叫getXxx()方法得到屬性值
   Field[] fields = t.getClass().getDeclaredFields();
   System.out.println("fields.length="+fields.length);
   for (short i = 0; i < fields.length; i++)
   {
    HSSFCell cell = row.createCell(i);
    cell.setCellStyle(style2);
    Field field = fields[i];
    String fieldName = field.getName();
    String getMethodName = "get"
      + fieldName.substring(0, 1).toUpperCase()
      + fieldName.substring(1);
    System.out.println("getMethodName="+getMethodName);
    try
    {
     Class tCls = t.getClass();
     Method getMethod = tCls.getMethod(getMethodName,
       new Class[]
       {});
     Object value = getMethod.invoke(t, new Object[]
     {});
     // 判斷值的型別後進行強制型別轉換
     String textValue = null;
     // if (value instanceof Integer) {
     // int intValue = (Integer) value;
     // cell.setCellValue(intValue);
     // } else if (value instanceof Float) {
     // float fValue = (Float) value;
     // textValue = new HSSFRichTextString(
     // String.valueOf(fValue));
     // cell.setCellValue(textValue);
     // } else if (value instanceof Double) {
     // double dValue = (Double) value;
     // textValue = new HSSFRichTextString(
     // String.valueOf(dValue));
     // cell.setCellValue(textValue);
     // } else if (value instanceof Long) {
     // long longValue = (Long) value;
     // cell.setCellValue(longValue);
     // }
     if (value instanceof Boolean)
     {
      boolean bValue = (Boolean) value;
      textValue = "男";
      if (!bValue)
      {
       textValue = "女";
      }
     }
     else if (value instanceof Date)
     {
      Date date = (Date) value;
      SimpleDateFormat sdf = new SimpleDateFormat(pattern);
      textValue = sdf.format(date);
     }
     else if (value instanceof byte[])
     {
      // 有圖片時,設定行高為60px;
      row.setHeightInPoints(60);
      // 設定圖片所在列寬度為80px,注意這裡單位的一個換算
      sheet.setColumnWidth(i, (short) (35.7 * 80));
      // sheet.autoSizeColumn(i);
      byte[] bsValue = (byte[]) value;
      HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,
        1023, 255, (short) 6, index, (short) 6, index);
      anchor.setAnchorType(2);
      patriarch.createPicture(anchor, workbook.addPicture(
        bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
     }
     else
     {
      // 其它資料型別都當作字串簡單處理
      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)
    {
     e.printStackTrace();
    }
    catch (NoSuchMethodException e)
    {
     e.printStackTrace();
    }
    catch (IllegalArgumentException e)
    {
     e.printStackTrace();
    }
    catch (IllegalAccessException e)
    {
     e.printStackTrace();
    }
    catch (InvocationTargetException e)
    {
     e.printStackTrace();
    }
    finally
    {
     // 清理資源
    }
   }
  }
  try
  {
   workbook.write(out);
  }
  catch (IOException e)
  {
   e.printStackTrace();
  }
 }
 public static void main(String[] args)
 {
  //測試工單查詢
  ExportExcel<Orders> ex = new ExportExcel<Orders>();
  String[] headers =
  { "訂單流失號", "業務型別", "客戶名稱", "客戶地址", "服務號碼" ,"證件型別","證件號碼","聯絡電話","繳費專案","繳費金額","套餐ID","套餐名稱",
    "服務列表","工單狀態","工位資源資訊","局向","測量室"};
  List<Orders> dataset = new ArrayList<Orders>();
  dataset.add(new Orders("111111","aaa","bbb","ccc","111" ,"111","證件號碼","聯絡電話","繳費專案","繳費金額","套餐ID","套餐名稱",
      "服務列表","工單狀態","工位資源資訊","局向","測量室"));
  try
  {
   OutputStream out = new FileOutputStream("c://a.xls");
   ex.exportExcel(headers, dataset, out);
   out.close();
   JOptionPane.showMessageDialog(null, "匯出成功!");
   System.out.println("excel匯出成功!");
  }
  catch (FileNotFoundException e)
  {
   e.printStackTrace();
  }
  catch (IOException e)
  {
   e.printStackTrace();
  }
 }
 }

 當然上頭的程式碼要能完全執行還需要一個實體類:Orders 。get/set 變數即使headers 裡的欄位。如果是從資料取資料,可以同資料庫欄位。