要下载并导入jxl.jar 包 和 poi.jar 包
package com.test.pub;
/*
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;*/
import java.util.List;
import java.util.StringTokenizer;
import jxl.HeaderFooter;
import jxl.SheetSettings;
import jxl.Workbook;
import jxl.HeaderFooter.Contents;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.PageOrientation;
import jxl.format.VerticalAlignment;
import jxl.write.WritableFont;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
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.poifs.filesystem.POIFSFileSystem;
import com.test.bean.PrintOutBean;
import com.test.dao.PrintOutDao;
import java.awt.*;
import java.io.*;
/**
* 输出报表
* @author Saindy
* @since 2008-5
*
*/
public class PrintOut {
/** 日期段*/
private String date2;
/** 当前为第state张表格*/
private int tableState;
/** 开始的时间和日期*/
private String d1;
/** 结束的时间和日期*/
private String d2;
/** Execl文件名和标题名称*/
private String titles;
String address;
private final int CHAR3_LENGTH=9; //三个字的长度
private final int CHAR4_LENGTH=11; //四个字的长度
private final int CHAR5_LENGTH=13; //五个字的长度
private final int CHAR6_LENGTH=15; //六个字的长度
private final int CHAR7_LENGTH=17; //七个字的长度
public PrintOut(int state,String sql,String starDate,String endDate,String excelName){
tableState=state;
titles=excelName;
//System.out.println(tableState);
// String excelName="";//Excel表名和标题
// if(tableState==1)excelName="各部门";
d1=starDate;
d2=endDate;
//System.out.println(d1+" "+d2);
//截取日期部分
StringTokenizer st = new StringTokenizer(starDate);
String sj=st.nextToken();
//System.out.println(sj);
StringTokenizer st2 = new StringTokenizer(endDate);
String sj2=st2.nextToken();
//System.out.println(sj2);
date2=sj+"到"+sj2;
//System.out.println("日期段: "+date2);
address=System.getProperty("user.dir");//文件路径
address=address+"//temp"; //把所形成的统计报表放在临时文件夹temp内
//要生成几列的报表,从数据库查询,并以一个List 返回
List list=null;
PrintOutDao printOutDao=new PrintOutDao();
if(tableState==3){
list=printOutDao.getgetPrintOut3(sql);
}else if(tableState==4){
list=printOutDao.getPrintOut3(sql);
}else if(tableState==5){
list=printOutDao.getPrintOut5(sql);
}else if(tableState==6){
list=printOutDao.getPrintOut6(sql);
}
//System.out.println(sql);
//以不同的文件标题为文件名称
//writeExcelBo(address+"//"+titles+"("+date2+").xls",list);
//文件名更改为同一个名称
writeExcelBo(address+"//"+excelName+".xls",list);
//直接打开文件
/*
*
try {
//Runtime.getRuntime().exec("cmd /c start "+address+"//"+titles+"("+date2+").xls");
Runtime.getRuntime().exec("cmd /c start "+address+"//"+excelName+".xls");
} catch (IOException e) {
e.printStackTrace();
}
*/
if (!Desktop.isDesktopSupported()){
System.err.println("Desktop not supported!");
System.exit(-1);
}
else{
try{
Desktop desktop = Desktop.getDesktop();
File f=new File(address+"//"+excelName+".xls");
desktop.open(f);
}catch(Exception e){
e.printStackTrace();
}
}
}
public static void exportExcelFile(String inputFile,String outputFile,List dataList) throws Exception{
//用模板文件构造poi
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(inputFile));
//创建模板工作表
HSSFWorkbook templatewb = new HSSFWorkbook(fs);
//直接取模板第一个sheet对象
HSSFSheet templateSheet = templatewb.getSheetAt(1);
//得到模板的第一个sheet的第一行对象 为了得到模板样式
HSSFRow templateRow = templateSheet.getRow(0);
//HSSFSheet timplateSheet = templatewb.getSheetAt(1);
//取得Excel文件的总列数
int columns = templateSheet.getRow((short) 0).getPhysicalNumberOfCells();
// Debug.println("columns is : " + columns); //=========================
//创建样式数组
HSSFCellStyle styleArray[] = new HSSFCellStyle[columns];
//一次性创建所有列的样式放在数组里
for (int s = 0; s < columns; s++) {
//得到数组实例
styleArray[s] = templatewb.createCellStyle();
}
//循环对每一个单元格进行赋值
//定位行
for (int rowId = 1; rowId < dataList.size(); rowId++) {
//依次取第rowId行数据 每一个数据是valueList
List valueList = (List) dataList.get(rowId - 1);
//定位列
for (int columnId = 0; columnId < columns; columnId++) {
//依次取出对应与colunmId列的值
//每一个单元格的值
String dataValue = (String) valueList.get(columnId);
//取出colunmId列的的style
//模板每一列的样式
HSSFCellStyle style = styleArray[columnId];
//取模板第colunmId列的单元格对象
//模板单元格对象
HSSFCell templateCell = templateRow.getCell((short) columnId);
//创建一个新的rowId行 行对象
//新建的行对象
HSSFRow hssfRow = templateSheet.createRow(rowId);
//创建新的rowId行 columnId列 单元格对象
//新建的单元格对象
HSSFCell cell = hssfRow.createCell((short) columnId);
//如果对应的模板单元格 样式为非锁定
if (templateCell.getCellStyle().getLocked() == false) {
//设置此列style为非锁定
style.setLocked(false);
//设置到新的单元格上
cell.setCellStyle(style);
}
//否则样式为锁定
else {
//设置此列style为锁定
style.setLocked(true);
//设置到新单元格上
cell.setCellStyle(style);
}
//设置编码
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
//Debug.println("dataValue : " + dataValue);
//设置值 统一为String
cell.setCellValue(dataValue);
}
}
//设置输入流
FileOutputStream fOut = new FileOutputStream(outputFile);
//将模板的内容写到输出文件上
templatewb.write(fOut);
fOut.flush();
//操作结束,关闭文件
fOut.close();
}
/**
* 导出数据为XLS格式
* @param filePath 生成Excel文件Path
* @param bo 要导入的数据
*/
public void writeExcelBo(String filePath, java.util.List ve)
{
jxl.write.WritableWorkbook wwb;
try
{
wwb= Workbook.createWorkbook(new File(filePath));
jxl.write.WritableSheet ws= wwb.createSheet(titles, 30);
//设置居中打印
SheetSettings sheetSettings= ws.getSettings();
sheetSettings.setHorizontalCentre(true);
int charTitle = 12;// 标题字体大小
jxl.write.WritableFont titleFont = new jxl.write.WritableFont(
WritableFont.createFont("宋体"), charTitle, WritableFont.BOLD);
//设置标题格式
jxl.write.WritableCellFormat titleFormat = new jxl.write.WritableCellFormat(titleFont);
titleFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
titleFormat.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐
titleFormat.setAlignment(Alignment.CENTRE); // 水平对齐
int charContent = 12;// 正文内容字体大小
jxl.write.WritableFont contentFont = new jxl.write.WritableFont(
WritableFont.createFont("宋体"), charContent, WritableFont.NO_BOLD);
//设置正文内容格式
jxl.write.WritableCellFormat contentFormat = new jxl.write.WritableCellFormat(contentFont);
contentFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
contentFormat.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐
contentFormat.setAlignment(Alignment.CENTRE); // 水平对齐
ws.addCell(new jxl.write.Label(0, 0, titles+"("+date2+")",titleFormat));//写标题
ws.setRowView(0,500);// 设置报表标题行高,第1列500毫米
ws.setRowView(1,440);//设置行高,第i+1行的高度
if(tableState==3){//三列单元格的报表
ws.mergeCells(0, 0, 3, 0); // 合并单元格,
ws.setColumnView(0, CHAR3_LENGTH); // 设置列宽,第1列
ws.setColumnView(1, CHAR5_LENGTH); // 设置列宽,第2列
ws.setColumnView(2, CHAR7_LENGTH); // 设置列宽,第3列
ws.addCell(new jxl.write.Label(0, 1, "第一列标题名称",titleFormat)); //列位置,行位置,名称
ws.addCell(new jxl.write.Label(1, 1, "第二列标题名称",titleFormat));
ws.addCell(new jxl.write.Label(2, 1, "第三列标题名称",titleFormat));
}else if(tableState==4){//四列单元格的报表
ws.mergeCells(0, 0, 3, 0); // 合并单元格,
ws.setColumnView(0, CHAR3_LENGTH); // 设置列宽,第1列
ws.setColumnView(1, CHAR5_LENGTH); // 设置列宽,第2列
ws.setColumnView(2, CHAR7_LENGTH); // 设置列宽,第3列
ws.setColumnView(3, CHAR4_LENGTH); // 设置列宽,第4列
ws.addCell(new jxl.write.Label(0, 1, "第一列标题名称",titleFormat)); //列位置,行位置,名称
ws.addCell(new jxl.write.Label(1, 1, "第二列标题名称",titleFormat));
ws.addCell(new jxl.write.Label(2, 1, "第三列标题名称",titleFormat));
ws.addCell(new jxl.write.Label(3, 1, "第四列标题名称",titleFormat));
}else if(tableState==5){//各人申请人表
ws.mergeCells(0, 0, 3, 0); // 合并单元格,
ws.setColumnView(0, CHAR3_LENGTH); // 设置列宽,第1列
ws.setColumnView(1, CHAR5_LENGTH); // 设置列宽,第2列
ws.setColumnView(2, CHAR7_LENGTH); // 设置列宽,第3列
ws.setColumnView(3, CHAR4_LENGTH); // 设置列宽,第4列
ws.setColumnView(4, CHAR6_LENGTH); // 设置列宽,第5列
ws.addCell(new jxl.write.Label(0, 1, "第一列标题名称",titleFormat)); //列位置,行位置,名称
ws.addCell(new jxl.write.Label(1, 1, "第二列标题名称",titleFormat));
ws.addCell(new jxl.write.Label(2, 1, "第三列标题名称",titleFormat));
ws.addCell(new jxl.write.Label(3, 1, "第四列标题名称",titleFormat));
ws.addCell(new jxl.write.Label(4, 1, "第五列标题名称",titleFormat));
}else if(tableState==6){//各个申请文件表
ws.mergeCells(0, 0, 3, 0); // 合并单元格,
ws.setColumnView(0, CHAR3_LENGTH); // 设置列宽,第1列
ws.setColumnView(1, CHAR5_LENGTH); // 设置列宽,第2列
ws.setColumnView(2, CHAR7_LENGTH); // 设置列宽,第3列
ws.setColumnView(3, CHAR4_LENGTH); // 设置列宽,第4列
ws.setColumnView(4, CHAR6_LENGTH); // 设置列宽,第5列
ws.setColumnView(5, CHAR6_LENGTH); // 设置列宽,第5列
ws.addCell(new jxl.write.Label(0, 1, "第一列标题名称",titleFormat)); //列位置,行位置,名称
ws.addCell(new jxl.write.Label(1, 1, "第二列标题名称",titleFormat));
ws.addCell(new jxl.write.Label(2, 1, "第三列标题名称",titleFormat));
ws.addCell(new jxl.write.Label(3, 1, "第四列标题名称",titleFormat));
ws.addCell(new jxl.write.Label(4, 1, "第五列标题名称",titleFormat));
ws.addCell(new jxl.write.Label(5, 1, "第五列标题名称",titleFormat));
sheetSettings.setOrientation(PageOrientation.LANDSCAPE); //设置打印方向为纵向打印
}
int size=ve.size();
PrintOutBean printOutBean = new PrintOutBean();
//System.out.println(size);
if(tableState==3){ //对非裁判文书的总量进行合计统计
/**总的输出文件数合计 */
long allTimes=0;
/**总的输出文件总份数合计 */
long allTimes2=0;
/**总的输出文件总页数合计 */
long allTimes3=0;
for (int i= 0; i < size; i++)
{
printOutBean= (PrintOutBean)ve.get(i);
ws.setRowView(i + 2,440);//设置行高,第i+1行的高度
ws.addCell(new jxl.write.Label(0, i + 2, printOutBean.getPrintOutA(),contentFormat));
ws.addCell(new jxl.write.Label(1, i + 2, printOutBean.getPrintOutB(),contentFormat));
ws.addCell(new jxl.write.Label(2, i + 2, printOutBean.getPrintOutC(),contentFormat));
//System.out.println(printOutBean.getPrintOutB());
allTimes=allTimes+Integer.parseInt(printOutBean.getPrintOutB());//总的申请次数合计累加
allTimes2=allTimes2+Integer.parseInt(printOutBean.getPrintOutC());
//当输出文件总页数为空值时输出修改为“0”,否则进行合计累加
/*if(printOutBean.getPrintOutD()==null){
ws.addCell(new jxl.write.Label(3, i + 2, ""+0,contentFormat));
//allTimes3=allTimes3+0;
}else{
ws.addCell(new jxl.write.Label(3, i + 2, printOutBean.getPrintOutD(),contentFormat));
allTimes3=allTimes3+Integer.parseInt(printOutBean.getPrintOutD());
}*/
//allTimese=(int) (allTimes+Integer.parseInt(printOutBean.getPrintOutE()));
}
//输出合计的结果值
ws.addCell(new jxl.write.Label(0, size + 2, "合计:",contentFormat));
ws.addCell(new jxl.write.Label(1, size + 2, ""+allTimes,contentFormat));
ws.addCell(new jxl.write.Label(2, size + 2, ""+allTimes2,contentFormat));
ws.setRowView(size + 2,440);//设置合计行高,第size行的高度
}else if(tableState==4){
for (int i= 0; i < size; i++)
{ ws.setRowView(i + 2,440);//设置行高,第i+1行的高度
printOutBean= (PrintOutBean)ve.get(i);
ws.addCell(new jxl.write.Label(0, i + 2, printOutBean.getPrintOutA(),contentFormat));
ws.addCell(new jxl.write.Label(1, i + 2, printOutBean.getPrintOutB(),contentFormat));
ws.addCell(new jxl.write.Label(2, i + 2, printOutBean.getPrintOutC(),contentFormat));
ws.addCell(new jxl.write.Label(3, i + 2, printOutBean.getPrintOutD(),contentFormat));
}
}
else if(tableState==5){
for (int i= 0; i < size; i++)
{ ws.setRowView(i + 2,440);//设置行高,第i+1行的高度
printOutBean= (PrintOutBean)ve.get(i);
ws.addCell(new jxl.write.Label(0, i + 2, printOutBean.getPrintOutA(),contentFormat));
ws.addCell(new jxl.write.Label(1, i + 2, printOutBean.getPrintOutB(),contentFormat));
ws.addCell(new jxl.write.Label(2, i + 2, printOutBean.getPrintOutC(),contentFormat));
ws.addCell(new jxl.write.Label(3, i + 2, printOutBean.getPrintOutD(),contentFormat));
ws.addCell(new jxl.write.Label(4, i + 2, printOutBean.getPrintOutE(),contentFormat));
}
}else if(tableState==6){
for (int i= 0; i < size; i++)
{ ws.setRowView(i + 2,440);//设置行高,第i+1行的高度
printOutBean= (PrintOutBean)ve.get(i);
ws.addCell(new jxl.write.Label(0, i + 2, printOutBean.getPrintOutA(),contentFormat));
ws.addCell(new jxl.write.Label(1, i + 2, printOutBean.getPrintOutB(),contentFormat));
ws.addCell(new jxl.write.Label(2, i + 2, printOutBean.getPrintOutC(),contentFormat));
ws.addCell(new jxl.write.Label(3, i + 2, printOutBean.getPrintOutD(),contentFormat));
ws.addCell(new jxl.write.Label(4, i + 2, printOutBean.getPrintOutE(),contentFormat));
ws.addCell(new jxl.write.Label(5, i + 2, printOutBean.getPrintOutF(),contentFormat));
}
}
wwb.write();
//关闭Excel工作薄对象
wwb.close();
} catch (IOException e){
} catch (RowsExceededException e){
} catch (WriteException e){
}
}
}