package com.opensource.util.excel;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
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;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.util.Region;
import org.apache.struts.action.Action;
public class CreateSimpleExcelToDisk extends Action
{
public static void ExportExcel(List<List> allList,String inWeek, HttpServletResponse response) throws Exception
{
// 第一步,创建一个webbook,对应一个Excel文件
HSSFWorkbook wb = new HSSFWorkbook();
// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = wb.createSheet();
// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
HSSFRow rowT = sheet.createRow(0);
rowT.setHeight((short)450);
// 第四步,创建单元格,并设置值表头 设置表头居中
//style表格主体使用
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
//style1日期星期列使用中中对其
HSSFCellStyle style1 = wb.createCellStyle();
style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//标题专用style2
HSSFCellStyle style2 = wb.createCellStyle();
style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//列标题用style3
HSSFCellStyle style3 = wb.createCellStyle();
style3.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
style3.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
//第几周用style
HSSFCellStyle style4 = wb.createCellStyle();
style4.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
style4.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
//添加边框
style.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
// style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
style1.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
style1.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
style1.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
style1.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
style3.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
style3.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
style3.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
style3.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
/**字体start*/
//生成一个字体
HSSFFont font=wb.createFont();
font.setFontName("仿宋_GB2312");
//font.setColor(HSSFColor.BLACK.index);//HSSFColor.VIOLET.index //字体颜色
font.setFontHeightInPoints((short)12);
//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //字体增粗
//把字体应用到当前的样式
style.setFont(font);
/**字体end*/
/**字体start*/
//生成一个字体日期星期用
HSSFFont font1=wb.createFont();
font1.setFontName("仿宋");
//font.setColor(HSSFColor.BLACK.index);//HSSFColor.VIOLET.index //字体颜色
font1.setFontHeightInPoints((short)12);
font1.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //字体增粗
//把字体应用到当前的样式
style1.setFont(font1);
/**字体end*/
/**字体start*/
//生成一个字体标题用
HSSFFont font2=wb.createFont();
font2.setFontName("仿宋");
//font.setColor(HSSFColor.BLACK.index);//HSSFColor.VIOLET.index //字体颜色
font2.setFontHeightInPoints((short)16);
font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //字体增粗
//把字体应用到当前的样式
style2.setFont(font2);
/**字体end*/
/**字体start*/
//生成一个字体列标题
HSSFFont font3=wb.createFont();
font3.setFontName("仿宋");
//font.setColor(HSSFColor.BLACK.index);//HSSFColor.VIOLET.index //字体颜色
font3.setFontHeightInPoints((short)14);
font3.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //字体增粗
//把字体应用到当前的样式
style3.setFont(font3);
/**字体end*/
/**字体start*/
//生成一个字体列标题
HSSFFont font4=wb.createFont();
font4.setFontName("仿宋");
//font.setColor(HSSFColor.BLACK.index);//HSSFColor.VIOLET.index //字体颜色
font4.setFontHeightInPoints((short)11);
// font4.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //字体增粗
//把字体应用到当前的样式
style4.setFont(font4);
/**字体end*/
//合并单元格 ,四个参数分别是:起始行,起始列,结束行,结束列
sheet.addMergedRegion(new Region(0,(short)0,0,(short)5));
HSSFCell cellT = rowT.createCell((short)0);
cellT.setCellValue(" 公 司 领 导 周 安 排");
cellT.setCellStyle(style2);
HSSFRow row2 = sheet.createRow((int) 1);
row2.setHeight((short)435);
sheet.addMergedRegion(new Region(1,(short)0,1,(short)5));
HSSFCell cell2 = row2.createCell((short)0);//参数是此行的第一列
cell2.setCellValue(inWeek);
cell2.setCellStyle(style4);
HSSFRow row3 = sheet.createRow((int) 2);
//自动调整列宽
// sheet.autoSizeColumn((short)0); //调整第一列宽度
// sheet.autoSizeColumn((short)1); //调整第二列宽度
// sheet.autoSizeColumn((short)2); //调整第三列宽度
// sheet.autoSizeColumn((short)3); //调整第四列宽度
// sheet.autoSizeColumn((short)4); //调整第五列宽度
// sheet.autoSizeColumn((short)5); //调整第六列宽度
HSSFCell cell = row3.createCell((short) 0);
row3.setHeight((short)500);
sheet.setColumnWidth((short) 0, (short) 3500);//设置宽度
cell.setCellValue("日期");
cell.setCellStyle(style3);
cell = row3.createCell((short) 1);
cell.setCellValue("星期");
cell.setCellStyle(style3);
cell = row3.createCell((short) 2);
sheet.setColumnWidth((short) 2, (short) 3500);//设置宽度
cell.setCellValue("时间");
cell.setCellStyle(style3);
cell = row3.createCell((short) 3);
cell.setCellValue("地点");
cell.setCellStyle(style3);
cell = row3.createCell((short) 4);
sheet.setColumnWidth((short) 4, (short) 23000);//设置宽度
cell.setCellValue("参加领导");
cell.setCellStyle(style3);
cell = row3.createCell((short) 5);
sheet.setColumnWidth((short) 5, (short) 5000);//设置宽度
cell.setCellValue("工作事项");
cell.setCellStyle(style3);
// 第五步,写入实体数据 实际应用中这些数据从数据库得到,
int lineNum = 3;
for(List list : allList)
{
for (int j = 0; j < list.size(); j++)
{
sheet.addMergedRegion(new Region(lineNum,(short)0, lineNum+(list.size()-1),(short)0));
sheet.addMergedRegion(new Region(lineNum,(short)1, lineNum+(list.size()-1),(short)1));
row3 = sheet.createRow(lineNum+j);
//从list中获取对象
row3.setHeight((short) 420);
Map map = (Map)list.get(j);
// 第四步,创建单元格,并设置值
HSSFCell cell4 =row3.createCell((short) 0);
cell4.setCellValue(map.get("riqi").toString());
cell4.setCellStyle(style1);
cell4=row3.createCell((short) 1);
cell4.setCellValue(dayForWeek(map.get("riqi").toString()));
cell4.setCellStyle(style1);
cell4=row3.createCell((short) 2);
cell4.setCellValue( map.get("shijian").toString());
cell4.setCellStyle(style);
cell4= row3.createCell((short) 3);
cell4.setCellValue( map.get("didian").toString());
cell4.setCellStyle(style);
cell4=row3.createCell((short) 4);
cell4.setCellValue( map.get("renyuan").toString());
cell4.setCellStyle(style);
cell4=row3.createCell((short) 5);
cell4.setCellValue(map.get("neirong").toString());
cell4.setCellStyle(style);
}
lineNum = lineNum + list.size();
}
// 第六步,将文件存到指定位置
try
{
// FileOutputStream fout = new FileOutputStream("E:/students.xls");
// wb.write(fout);
// fout.close();
ByteArrayOutputStream os = new ByteArrayOutputStream();
wb.write(os);
byte[] content = os.toByteArray();
InputStream is = new ByteArrayInputStream(content);
response.reset();
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename="
+ new String(("京投公司领导周工作安排"+inWeek+".xls")
.getBytes(), "iso-8859-1"));
ServletOutputStream out = response.getOutputStream();
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(is);
bos = new BufferedOutputStream(out);
byte[] buff = new byte[2048];
int bytesRead;
// Simple read/write loop.
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
} catch (Exception e) {
throw e;
} finally {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
//根据日期判断星期几
public static String dayForWeek(String pTime) throws Exception {
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
Calendar c = Calendar.getInstance();
c.setTime(format.parse(pTime));
int dayForWeek = 0;
if (c.get(Calendar.DAY_OF_WEEK) == 1) {
dayForWeek = 7;
} else {
dayForWeek = c.get(Calendar.DAY_OF_WEEK) - 1;
}
String week = "星期一";
switch(dayForWeek)
{
case 1: week = "星期一"; break;
case 2: week = "星期二"; break;
case 3: week = "星期三"; break;
case 4: week = "星期四"; break;
case 5: week = "星期五"; break;
case 6: week = "星期六"; break;
default: week = "星期日"; break;
}
return week;
}
}