Web输出Excel的总结

1.js实现

 

<HTML>
    
<HEAD>
        
<title>WEB页面导出为EXCEL文档的方法
        
</title>
    
</HEAD>
    
<body>
        
<BR>
        
<table id = "PrintA" width="100%" border="1" cellspacing="0" cellpadding="0" bgcolor = "#61FF13">
            
<TR style="text-align : center;">
                
<TD>单元格A</TD>
                
<TD>单元格A</TD>
                
<TD>单元格A</TD>
                
<TD>单元格A</TD>
            
</TR>
            
<TR>
                
<TD colSpan=4 style="text-align : center;"><font color="BLUE" face="Verdana">单元格合并行A</FONT></TD>
            
</TR>
        
</TABLE>
        
<BR>
        
<table id = "PrintB" width="100%" border="1" cellspacing="0" cellpadding="0">
            
<TR style="text-align : center;">
                
<TD>单元格B</TD>
                
<TD>单元格B</TD>
                
<TD>单元格B</TD>
                
<TD>单元格B</TD>
            
</TR>
            
<TR>
                
<TD colSpan=4 style="text-align : center;">单元格合并行B</TD>
            
</TR>
        
</TABLE>
        
<br><br><br>
        
<input type="button" onclick="javascript:AllAreaWord();" value="导出页面指定区域内容到Word">
        
<input type="button" onclick="javascript:AllAreaExcel();" value="导出页面指定区域内容到Excel">
        
<input type="button" onclick="javascript:CellAreaExcel();" value="导出表单单元格内容到Excel">
        
<SCRIPT LANGUAGE="javascript">
            
//指定页面区域内容导入Excel
            function AllAreaExcel()
            
{
                
var oXL = new ActiveXObject("Excel.Application");
                
var oWB = oXL.Workbooks.Add();
                
var oSheet = oWB.ActiveSheet;
                
var sel=document.body.createTextRange();
                sel.moveToElementText(PrintB);
                sel.select();
                sel.execCommand(
"Copy");
                oSheet.Paste();
                oXL.Visible 
= true;
            }

            
//指定页面区域“单元格”内容导入Excel
            function CellAreaExcel()
            
{
                
var oXL = new ActiveXObject("Excel.Application");
                
var oWB = oXL.Workbooks.Add();
                
var oSheet = oWB.ActiveSheet;
                
var Lenr = PrintA.rows.length;
                
for (i=0;i<Lenr;i++)
                
{
                    
var Lenc = PrintA.rows(i).cells.length;
                    
for (j=0;j<Lenc;j++)
                    
{
                        oSheet.Cells(i
+1,j+1).value = PrintA.rows(i).cells(j).innerText;
                    }

                }

                oXL.Visible 
= true;
            }

            
//指定页面区域内容导入Word
            function AllAreaWord()
            
{
                
var oWD = new ActiveXObject("Word.Application");
                
var oDC = oWD.Documents.Add("",0,1);
                
var oRange =oDC.Range(0,1);
                
var sel = document.body.createTextRange();
                sel.moveToElementText(PrintA);
                sel.select();
                sel.execCommand(
"Copy");
                oRange.Paste();
                oWD.Application.Visible 
= true;
                
//window.close();
            }

        
</SCRIPT>
    
</body></html>

这种设置有两个缺点就是:
一.它要要求下载关于Excel的ActiveX的控件,如果你阻止了该控件的下载,那么你的Excel将不会打开成功;
二.它的输出格式无法控制,对于一般的数据表格,它能很完美的完成。但是对于复杂的单元格长度,宽度需要人工的去调整(它输出的单元格宽度就是Excel身为默认的宽度;如果数据超长,那么它会在高度上增加);

2.页面设置实现
还有一种办法挺简单,不过要多查一次,做一个和你要打印的页面一样的页面
按按钮的时候重复一次打开页面的操作就行了,虽然多操作了一次,不过连样式什么的都可以带进excel里去,页面什么样就什么样了,呵呵
<%@ page contentType="application/vnd.ms-excel; charset=GBK"%>
加一句
response.setHeader("Content-disposition","attachment; filename="+name+".xls");  

至于POI的方式比较复杂 ,我写了一个共通的函数,大家可以参考一下:

package com.hsoft.business.common;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

import org.apache.log4j.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.*;

/**
 * <p>
 * Title: ExcelOut
 * </p>
 * <p>
 * Description: Excel输出
 * </p>
 * <p>
 * Copyright:  2006
 * </p>
 * <p>
 * Company: SCLH
 * </p>
 * @ author fhwei
 * @ 2006-07-20 version 1.0
 
*/

public class ExcelOut
    
implements java.io.Serializable {

  
/* WorkBook申明 */
  HSSFWorkbook wb 
= null;
  HSSFSheet sheet 
= null;

  
private static final String CONTENT_TYPE = "APPLICATION/OCTET-STREAM";
  
private static Logger zc_logger = Logger.getLogger(ExcelOut.class);

  
public ExcelOut() {
    
this.wb = new HSSFWorkbook();
  }


  
/**
   * 创建Excel文件
   * 
@param fileName Excel文件名
   * 
@param shtName  sheet名
   * 
@param contents 内容数据
   
*/

  
public void createExcel(String fileName, String shtName, String titleName,
                          
int count, Collection contents) throws Exception {

    zc_logger.debug(
"*** createExcel ***");
    
/* Sheet创建 */
    
this.sheet = wb.createSheet(shtName);

    HSSFRow rowTitle 
= wb.getSheet(shtName).createRow(0);
    rowTitle.setHeight( (
short0x249);

    
/* 创建cells */
    HSSFCell cellTitle 
= rowTitle.createCell( (short0);
    cellTitle.setEncoding(HSSFCell.ENCODING_UTF_16);
    sheet.addMergedRegion(
new Region(0, (short00, (short) count));
    
if (titleName == null{
      cellTitle.setCellValue(
"");
    }

    
else {
      cellTitle.setCellValue(titleName);
    }

    HSSFCellStyle cellStyle 
= wb.createCellStyle();
    HSSFFont bigFont 
= wb.createFont();
    cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    cellTitle.setCellStyle(cellStyle);
    
//        bigFont.setFontName("");
    bigFont.setFontHeightInPoints( (short18);
    bigFont.setItalic(
true);
    bigFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    cellStyle.setFont(bigFont);

    Iterator it 
= contents.iterator();

    
for (int i = 1; it.hasNext(); i++{
      Collection rowContent 
= (Collection) it.next();
      Iterator rowIt 
= rowContent.iterator();

      
/* Row的产生 */
      HSSFRow row 
= wb.getSheet(shtName).createRow(i);
      
if (i == 1{
        row.setHeight( (
short0x190);
      }

      
else {
        row.setHeight( (
short0x100);
      }

      
/*  */
      
for (short j = 0; rowIt.hasNext(); j++{
        
/* Cell */
        HSSFCellStyle dataCellStyle 
= wb.createCellStyle();
        dataCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        
if (i == 1{
          dataCellStyle
              .setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
          dataCellStyle
              .setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        }

        HSSFCell cell 
= row.createCell(j);
        cell.setEncoding(HSSFCell.ENCODING_UTF_16);
        
if (i == 1{
          dataCellStyle.setBorderTop(HSSFCellStyle.BORDER_THICK);
        }

        
else {
          dataCellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
        }

        dataCellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        dataCellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        
if (i == contents.size()) {
          dataCellStyle.setBorderBottom(HSSFCellStyle.BORDER_THICK);
        }

        
else {
          dataCellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        }

        cell.setCellStyle(dataCellStyle);
        Object obj 
= rowIt.next();
        
/*  */
        
if (obj != null{
          cell.setCellValue(obj.toString());
        }

        
else {
          cell.setCellValue(
"");
        }

      }

    }

    
/* 文件输出 */
    FileOutputStream fileOut 
= new FileOutputStream(fileName);
    wb.write(fileOut);
    fileOut.close();
  }


  
public void downExcleFile(HttpServletResponse response, String fileName,
                            String filePath) 
throws ServletException,
      IOException 
{
    response.setContentType(CONTENT_TYPE);
    response.reset();

    ServletOutputStream outputStream 
= response.getOutputStream();
    InputStream inputStream 
= null;
    filePath 
= ChineseString.chineseStr(filePath + fileName);

    
if (fileName != null && filePath != null{
      response.setHeader(
"Content-Disposition""attachment; filename=""
                         
+ fileName + """);
      File file 
= new File(filePath);
      inputStream 
= new FileInputStream(file);
      
int chunk = inputStream.available();
      
if (chunk == 0 || chunk == 1024 * 1024 * 60{
        chunk 
= 1024 * 1024;
      }

      
byte[] buffer = new byte[chunk];
      
int length = -1;
      
try {
        
if (inputStream == null{
          zc_logger.error(
"Download Data is Null!");
        }

        
else {
          
while ( (length = inputStream.read(buffer)) != -1{
            outputStream.write(buffer, 
0, length);
          }

        }

        inputStream.close();
        outputStream.flush();
        outputStream.close();
      }

      
catch (IOException ex) {
        
throw ex;
      }

    }

  }

}

大体思路是把要输出的数据按行的模式存入一个Collection;可以看到我们可以在该函数里面自己定义String fileName(文件名), String shtName(sheet名), String titleName(表格的title名)还有不要忘记int count这个行记录数的参数。我们在调用的时候使用这样的实例代码
  /**
   * Description: 设定Excle输出的内容
   *
   * 
@param StaTableInfo[]
   *            staTableInfo
   * 
@return Collection contents
   * 
@author fhwei 2006-07-21
   
*/

  
public Collection excleContents(StaTableInfo[] staTableInfo) {
    Collection contents 
= new ArrayList();
    Collection row 
= new ArrayList();
    
/* 表头 */
    row.add(
"记录编号");
    row.add(
"注册数据库名称");
    row.add(
"数据表中文名");
    row.add(
"数据表类型");
    row.add(
"数据量");
    row.add(
"最后更新时间");
    contents.add(row);
    
/* 表内容 */
    
for (int i = 0, j = staTableInfo.length; i < j; i++{
      row 
= new ArrayList();
      row.add(
new Integer(staTableInfo[i].getRID()));
      row.add(staTableInfo[i].getDatabaseCName());
      row.add(staTableInfo[i].getTableCName());
      row.add(staTableInfo[i].getTypeCName());
      row.add(
new Integer(staTableInfo[i].getCount()));
      row.add(staTableInfo[i].getSystemTime());
      contents.add(row);
    }

    
return contents;
  }

呵呵!当作备忘录吧!
posted @ 2006-11-23 10:03  fhway  阅读(279)  评论(0)    收藏  举报