package cn.ccb.elms.common;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* <p>功能说明:用于文件下载的相关操作</p>
* @author gjg
* @version 1.0 2006-04-27
*/
public class DownloadUtil
{
/**
* 用二维数组的格式生成Excel文件
* @param dataList String[][]
*/
public static void genericExcel(String dataList[][])
{
String strFileName = "";
try
{
// 生成Excel文件并保存在服务器上
SSConfig ssc = new SSConfig();
String strZFileName = "Query_" + ssc.getSysTimeStamp(); // 主文件名
strFileName = strZFileName + ".xls"; // 文件全名
FileOutputStream fileOut = new FileOutputStream(strFileName);
HSSFWorkbook wb = new HSSFWorkbook();
HSSFCellStyle cs = wb.createCellStyle(); // 格式对象
HSSFFont fCol = wb.createFont(); // 字体对象,表头
fCol.setFontHeightInPoints( (short) 10);
fCol.setBoldweight(fCol.BOLDWEIGHT_BOLD);
// 工作表
HSSFSheet sheet = wb.createSheet(0 + "");
wb.setSheetName(0, strZFileName, (short) 1);
// 第一行,放表头
HSSFRow row = null;
int nRowNum = 0;
for (int nh = 0; nh < dataList.length; nh++)
{
row = sheet.createRow(nRowNum); // 创建行
for (int nk = 0; nk < dataList[0].length; nk++)
{
HSSFCell cell = row.createCell( (short) (nk));
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(dataList[nh][nk]); // 写入单元格
//将表头设为粗体居中
if (nRowNum == 0)
{
cs.setFont(fCol);
cs.setAlignment(HSSFCellStyle.ALIGN_CENTER);
cell.setCellStyle(cs);
}
}
nRowNum++;
}
wb.write(fileOut);
fileOut.close();
}
catch (Exception e)
{
e.printStackTrace();
}
//根据提供的文件名下载文件
downloadFile(strFileName);
}
/**
* 用List格式生成Excel文件
* @deprecated
* @param ColName_zh List
* @param data List
*/
public static void genericExcel2(List ColName_zh, List data)
{
String strFileName = "";
try
{
if (ColName_zh == null || data == null)
{
throw new Exception("表头列数或数据列数为空!");
}
// 生成Excel文件并保存在服务器上
SSConfig ssc = new SSConfig();
String strZFileName = "Query_" + ssc.getSysTimeStamp(); // 主文件名
strFileName = strZFileName + ".xls"; // 文件全名
FileOutputStream fileOut = new FileOutputStream(strFileName);
HSSFWorkbook wb = new HSSFWorkbook();
HSSFCellStyle cs = wb.createCellStyle(); // 格式对象
HSSFFont fCol = wb.createFont(); // 字体对象,表头
fCol.setFontHeightInPoints( (short) 10);
fCol.setBoldweight(fCol.BOLDWEIGHT_BOLD);
// 工作表
HSSFSheet sheet = wb.createSheet(0 + "");
wb.setSheetName(0, strZFileName, (short) 1);
// 第一行,放表头
HSSFRow row = null;
row = sheet.createRow( (short) 0);
int ny = 0;
for (Iterator iter = ColName_zh.iterator(); iter.hasNext(); )
{
HSSFCell cell = row.createCell( (short) ny);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cs.setFont(fCol);
cs.setAlignment(HSSFCellStyle.ALIGN_CENTER);
cell.setCellStyle(cs);
cell.setCellValue(iter.next() + "");
ny++;
}
// x代表数据的起始行数
// y代表数据从第哪一列开始填充
int nx = 1; // 数据从第一行开始
for (Iterator itert = data.iterator(); itert.hasNext(); )
{
ny = 0;
row = sheet.createRow( (short) nx);
ArrayList al2 = (ArrayList) itert.next();
for (Iterator iter2 = al2.iterator(); iter2.hasNext(); )
{
HSSFCell cell = row.createCell( (short) ny);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
// cs.setFont(fCol);
cs.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// cell.setCellStyle(cs);
cell.setCellValue(iter2.next() + "");
ny++;
}
nx++;
}
wb.write(fileOut);
fileOut.close();
}
catch (Exception e)
{
e.printStackTrace();
}
//根据提供的文件名下载文件
downloadFile(strFileName);
}
/**
* <p>功能说明:根据提供的文件名下载文件</p>
* @param strfileName String
* @return void
*/
private static void downloadFile(String strfileName)
{
try
{
File exportFile = new File(strfileName);
HttpServletResponse httpServletResponse = (HttpServletResponse)
FacesContext.getCurrentInstance().
getExternalContext().getResponse();
ServletOutputStream servletOutputStream = httpServletResponse.
getOutputStream();
httpServletResponse.setHeader("Content-disposition",
"attachment; filename=" + strfileName);
httpServletResponse.setContentLength( (int) exportFile.length());
httpServletResponse.setContentType("application/x-download");
byte[] b = new byte[1024];
int i = 0;
FileInputStream fis = new java.io.FileInputStream(exportFile);
while ( (i = fis.read(b)) > 0)
{
servletOutputStream.write(b, 0, i);
}
}
catch (IOException e)
{
e.printStackTrace();
}
FacesContext.getCurrentInstance().responseComplete();
}
public static void main(String[] args)
{
//genericExcel()用法
String s[][] = new String[][]
{
{
"列1", "列2", "列3", "列4"},
{
"A", "22", "33", "44"}
};
genericExcel(s);
//genericExcel2()用法
//al代表表头
ArrayList al = new ArrayList();
al.add("a");
al.add("b");
al.add("c");
// al2代表多行数据
ArrayList al2 = new ArrayList();
// al3代表一行数据
ArrayList al3 = new ArrayList();
al3.add("1");
al3.add("2");
al3.add("3");
al2.add(al3);
al3 = new ArrayList(); // 此处必须new一个新的ArrayList对象
al3.add("11");
al3.add("22");
al3.add("33");
al2.add(al3);
genericExcel2(al, al2);
}
}