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( (short) 0x249);
/* 创建cells */
HSSFCell cellTitle = rowTitle.createCell( (short) 0);
cellTitle.setEncoding(HSSFCell.ENCODING_UTF_16);
sheet.addMergedRegion(new Region(0, (short) 0, 0, (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( (short) 18);
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( (short) 0x190);
}
else {
row.setHeight( (short) 0x100);
}
/* */
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;
}
}
}
}
/**
* 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;
}

浙公网安备 33010602011771号