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 裡的欄位。如果是從資料取資料,可以同資料庫欄位。