工作中用到了,然后用点时间就做下笔记,下面是用到的:让我尽快做完,做的比较赶进度
例子:
1.在jsp页面加一个到处按钮
2.写一个js的方法:来用触发导出事件
function importExcel(){
var row = $('#plandatagrid').datagrid('getSelected');
if (row){
this.location="../tempFile/importExcel.jsp?serialNo="+row.taskno;
}else{
alert("请选一行");
}
}
提示:serialNo导出是根据这个来导出的,也就是它要根据这个属性去数据库获取一条记录。
3.跳转到处理的jsp:代码如下一堆:
<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%
Date d=new Date();
String fileName=d.toLocaleString().replace("-","").replace(":","").replace(" ","")+d.getTime();
//fileName用时间来拼接一个下载文件的名字,这样长啊,看起来是不是像那么回事
ByteArrayOutputStream bo =null;//创建一个数组流,这里可能有人会先写到服务器端然后再写到客户端,本人觉得直接放到服务器端内存写入客户端不是更省事么?
try{
//就这个方法罪重要
bo=new WorkPlanManageOpper().importExecl(request.getParameter("serialNo"));
//用来告诉客户端,我是一个要下载的东西,为什么这样写?龟腚!
response.addHeader("Content-Disposition","attachment;filename="+fileName+".xls");
//获取输出流
OutputStream os = response.getOutputStream();
//转换byte数组
byte[]b2=bo.toByteArray();
InputStream fis = new ByteArrayInputStream(b2);
//学过流的都懂下面的不解释
byte[] b = new byte[1024*1024];
int temp = -1;
while((temp=fis.read(b))!=-1){
os.write(b, 0, temp);
}
os.flush();
os.close();
bo.close();
fis.close();
}catch(Exception e){
}finally{
//这里需要说下,如果你不加这2句,后台报异常。为什么?同时打开2个流,jsp页面的out和response.getOutputStream();所以加这个可以让其安静
out.clear();
out = pageContext.pushBody();
}
%>
4.下面谈谈那个“重要的方法”:
提示:这里用到的是jxl.jar,反正网上能找到,就是一个对中文处理excl支持比较好的,说是韩国人写的。
public ByteArrayOutputStream importExecl(String serialNo){
ByteArrayOutputStream bo=new ByteArrayOutputStream();
WritableWorkbook book=null;
Workbook wb=null;
//ibatis查询数据库,返回一条记录,可能为null
WorkPlanManageSchema w=this.queryWorkPlanManageByserialNo(serialNo);
if(w.getDateStart()!=null&&w.getEtimeQuantum()!=null&&w.getDateEnd().getTime()-w.getDateStart().getTime()>=0){
//星期几,给定1990-12-08这样的日期格式,告诉你,星期几
int i=DateUtil.decideDayWeekly(DateUtil.formatDate2String(w.getDateStart()));
//用来计算的临时变量
int m=0;
//相差天数,给定2个日期,告诉你,这2个日期相差的天数
long quot = w.getDateEnd().getTime()-w.getDateStart().getTime();
quot = quot / 1000 / 60 / 60 / 24;
//用来控制循环的次数和输出的计算,因为是周计划,所以按一个星期5天处理
if(6-i<(int)quot-i){
m=6;
}else{
m=(int)quot+i+1;
}
//下面的表格逻辑自己去鼓捣吧,本人一下午就想这个问题了,反正就是自己想办法把数填进去,有好的方法请分享
// Excel获得文件
try {
//d:/1.xls这是一个模板文件,就安这个模板的格式插入数据
wb = Workbook.getWorkbook(new File("d:/1.xls"));
book = Workbook.createWorkbook(bo, wb);
// 打开一个文件的副本,并且指定数据写回到原文件
WritableSheet sheet1 = book.getSheet(0);
//备注
WritableSheet sheet1 = book.getSheet(0);
//备注
sheet1.addCell( new Label( 7 , 2 ,w.getRemarks()));
int n=i;
for(;i<m;i++){
//时间
//DateTime labelDT = new DateTime(3, 2,new java.util.Date());
//sheet1.addCell(labelDT);
if(n==i&&w.getStimeQuantum().equals("am")){
this.inputToExcel(sheet1,w,2*i,"09:00-12:00");
if(quot>0||w.getEtimeQuantum().equals("pm")){
this.inputToExcel(sheet1,w,2*i+1,"13:30-18:00");
}
continue;
}
if(n==i&&w.getStimeQuantum().equals("pm")){
this.inputToExcel(sheet1,w,2*i+1,"13:30-18:00");
continue;
}
if(n!=i&&i!=m-1){
this.inputToExcel(sheet1,w,2*i,"09:00-12:00");
this.inputToExcel(sheet1,w,2*i+1,"13:30-18:00");
continue;
}
if(i==m-1&&w.getEtimeQuantum().equals("am")){
this.inputToExcel(sheet1,w,2*i,"09:00-12:00");
if(quot-n>6-n){
this.inputToExcel(sheet1,w,2*i+1,"13:30-18:00");
}
continue;
}
if(i==m-1&&w.getEtimeQuantum().equals("pm")){
this.inputToExcel(sheet1,w,2*i,"09:00-12:00");
this.inputToExcel(sheet1,w,2*i+1,"13:30-18:00");
continue;
}
}
book.write();
book.close();
} catch (Exception e) {
this.buildError("importExecl","importExecl失败");
e.printStackTrace();
}
return bo;
}else{
try {
//
File file=new File("d:/2.xls");
InputStream in=new FileInputStream(file);
byte[] buff=new byte[1024];
int len=0;
while(-1!=(len=in.read(buff))){
bo.write(buff,0,len);
}
bo.flush();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
return bo;
}
}
private void inputToExcel(WritableSheet sheet1,WorkPlanManageSchema w,int n,String str) throws Exception{
System.out.println("execl正在插入第"+n+"行,所属时间是:"+str);
sheet1.addCell( new Label( 3 , n ,str ));
sheet1.addCell( new Label( 4 , n,w.getWorkArrangement() ));
sheet1.addCell( new Label( 5 , n ,w.getParticipantName()));
sheet1.addCell( new Label( 6 , n,w.getAddress()));
}
//查询数据库的方法,上面用到了
public WorkPlanManageSchema queryWorkPlanManageByserialNo(String serialNo){
List<WorkPlanManageSchema> list = null;
this.init();
try {
list= (List<WorkPlanManageSchema>) sqlMap.queryForList("queryWorkPlanManageByserialNo",serialNo);
} catch (SQLException e) {
this.buildError("query","查询SQl执行失败");
e.printStackTrace();
}
return list.get(0);
}
//给一个日期,告诉你星期几的方法:上面也用到了
public static int decideDayWeekly(String paramStrDate) {
int flag = -1;
if (paramStrDate == null || paramStrDate.trim().length() == 0) {
return flag;
}
boolean isCurrent = false;
long minusDay = 0;
// 定义基准日期:2010-07-04是星期日
Date baseDate =
constructDateByString("2010-07-04 00:00:00");
Date paramDate =constructDateByString(paramStrDate
+ " 00:00:00");
if (paramDate == null) {
System.err.println("The Date Format Is Not Available.");
return flag;
}
// 基准日期之前的日期
if (!isCurrent && paramDate.before(baseDate)) {
minusDay = (baseDate.getTime() - paramDate.getTime())
/ (24 * 60 * 60 * 1000);
// 注意:往前推算的算法
flag = Integer.parseInt("" + ((7 - minusDay % 7)) % 7);
// System.out.println("=minusDay of 1 is:=" + minusDay + "=end=");
isCurrent = true;
}
// 基准日期之后的日期
if (!isCurrent && paramDate.after(baseDate)) {
minusDay = (paramDate.getTime() - baseDate.getTime())
/ (24 * 60 * 60 * 1000);
// 注意:往后推算的算法
flag = Integer.parseInt("" + minusDay % 7);
// System.out.println("=minusDay of 2 is:=" + minusDay + "=end=");
isCurrent = true;
}
return flag;
}
/**
* 将日期格式的字符串转化为日期类型,要求格式为:yyyy-mm-dd hh24:mi:ss,如:2010-07-05
*
* @param paramStr
* String 源字符串,要求格式为:yyyy-mm-dd hh24:mi:ss,如:2010-07-05
* 00:00:05或者:2010-7-5 00:00:05
* @return Date
* @since modify on 2010-07-05
*/
public static Date constructDateByString(String paramStr) {
if (paramStr == null || paramStr.trim().length() == 0) {
return null;
}
Date retDate = null;
try {
retDate = DateFormat.getDateTimeInstance().parse(paramStr);
} catch (ParseException ex) {
ex.printStackTrace();
}
return retDate;
}
//ibatis配置如下:
<select id="queryWorkPlanManageByserialNo" resultClass="WorkPlanManageSchema" parameterClass="java.lang.String">
select * from Work where serialNo=#serialNo#
</select>
下面看看提前准备好的模板:d:/1.xls
差不多就长下面这样,模板2.xls就不用展示了吧,如果他非法操作,你会让他下载个什么?看你心情把。
插入表的逻辑是什么?
如果你是在(周四2014-1-9上午到2014-1-9上午)有工作,那么你应该在周四的上午插入数据,那如果我2014-1-9下午到2014-1-10上午,那你插入的数据应该是在周四下午和周五上午显示,也就是瞄那打那。
看看数据库表的我测试的一条数据:
也就是说6号下午开始11号上午结束,记得是周计划,多余的删掉,如果根据你的业务,可以修改,这个很简单。
输出结果:下面的一样
我修改数据库数据如下:
输出结果:
记得下载jxl,jar包,还有,下载的excl有点瑕疵,自己看吧。我觉得如果用mvc框架来处理的话,会更方便。