JFinal excel导入导出

[size=medium]
@Before({Tx.class})
public void addCustoms() {
List<UploadFile> customExcel=getFiles();
if (customExcel == null || customExcel.size()==0) {
setAttr("title", "不能导入!");
setAttr("message", "请选择一个要导入的excel文件!");
render(consts.templateErr);
return;
}
UploadFile flie=customExcel.get(0);
String filename=flie.getFileName();
int index=filename.lastIndexOf(".");
if(!".xls".equals(filename.substring(index))){
setAttr("title", "不能导入!");
setAttr("message", "请选择execl类型文件!");
render(consts.templateErr);
return;
}
Long size = flie.getFile().length();//拿到上传文件的长度
if (size > 1024 * 1024 * 5) {
setAttr("title", "不能导入!");
setAttr("message", "请选择小于5M的文件!");
render(consts.templateErr);
return;
} else {
try {
String result = this.customByExcel(flie.getFile());
String[] results = result.split(":");//返回哪行哪列格式有误
if("5000Y1".equals(result)){
setAttr("title", "不能导入!");
setAttr("message", "请下载新模板!");
render(consts.templateErr);
return;
}
if (results.length == 1) {//导入文件操作提示
setAttr("title","添加成功");
setAttr("message", "共添加"+results[0]+"条记录!");
setAttr("goName", "常旅客列表");
setAttr("goUrl", "trip/customs");
render(consts.templateSuccess);

} else {
setAttr("title", "报错!");
setAttr("message", "第" + results[0] + "位常旅客,"+results[1]);
render(consts.templateErr);
}
} catch (Exception e) {
System.out.println(e);
setAttr("title","添加错误");
setAttr("message", "对不起,添加错误!");
render(consts.templateErr);
}

}
}

@Before({Tx.class})
public String customByExcel(File customExcel) {
Member _member = getSessionAttr(consts.tmcSessionKey);
Workbook wb = null;
List<FrequenFlyer> customs=new ArrayList<FrequenFlyer>();
int rowNum = 0;//总行数
String sgin="succeed";//表示导入表格当中的每一行都符合模板要求
String errorRow="",errorCol="",result="文件没有内容!";//标记错误数据在第几行 和那个字段 最终返回结果
try {
wb=Workbook.getWorkbook(customExcel);
} catch (Exception e) {
System.out.println(e);
setAttr("title", "提交报错!");
setAttr("message", "初始化Workbook报错!");
render(consts.templateErr);
}
if(wb!=null){
Sheet[] sheet=wb.getSheets();
if(sheet != null && sheet.length > 0){
rowNum = sheet[0].getRows()-1;//拿到总行数
Cell[] cells2 = sheet[0].getRow(1);
//查看必填列 列名字是否和模板一致
if(!cells2[0].getContents().contains("姓名") ||
!cells2[1].getContents().contains("部门")
){
return "5000Y1";//模板格式不正确
}
List<Department> departs=Department.dao.find("select * from T_DEPARTMENT where com_id=? and state=0 ", _member.getNumber("comid"));
Map<String, String> departsMap=new HashMap<String, String>();
for (Department department : departs) {
departsMap.put(department.getNumber("id").toString(), department.getStr("dname"));
}
for(int i=2;i<rowNum+1;i++){
Cell[] cells = sheet[0].getRow(i);//拿到第一个表空间的第i列的数据
if(cells!=null && cells.length>0){

FrequenFlyer custom=new FrequenFlyer()
.set("id", "T_FREQUENTFLYER_ID.nextval")
.set("passname", cells[0].getContents().replace(" ", ""))//姓名
.set("departmentid", cells[1].getContents().replace(" ", ""))//部门
.set("cardtype", cells[2].getContents().replace(" ", ""))//证件类型
.set("cardnumber", cells[3].getContents().replace(" ", ""))//证件号码
customs.add(custom);
}else{
errorCol=colIsNotEmpty(cells);
errorRow=(i-1)+"";
sgin="failure";
break;
}
}
}

if(sgin.equals("succeed")){//如果模板正确并且数据格式也符合要求就添加本次导入的数据
for(FrequenFlyer c:customs){
c.save();
}
result=customs.size()+"";//返回成功添加条数
}else {
result=errorRow+":"+errorCol;//返回错误行和列信息
}
}
}

return result;
}
//验证必填字段是否都符合要求,如果不符合要求则返回字段名称

public String colIsNotEmpty(Cell[] cells){
if(StringUtils.isEmpty(cells[0].getContents().replace(" ", ""))){
return "姓名,数据格式有问题,检查是否存在空格!";
}
if(StringUtils.isEmpty(cells[1].getContents().replace(" ", ""))){
return "部门,数据格式有问题,检查是否存在空格!";
}
return "pass";
}
[color=darkred] /**
*
* @Description 下载常旅客导入模板
* 使用场景:常旅客EXECL导入
* @author luoq
*
* @throws
*/[/color]
public void execl(){
try {
String sCurrPath = System.getProperty("java.io.tmpdir") + "\\xlsx"+ (new java.util.Date().getTime())+".xls";
DownloadExecl.createExcel(sCurrPath);
File xls=new File(sCurrPath);
renderFile(xls);

} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
renderText("导出数据报错!");
}
}
public class DownloadExecl {

public static void createExcel(String sCurrPath){

try {
//** **********创建工作簿************ *//*
WritableWorkbook workbook = Workbook.createWorkbook(new File(sCurrPath));
//** **********创建工作表************ *//*
WritableSheet sheet = workbook.createSheet("常旅客导入模板", 0);
//** **********设置页眉、页脚***************** *//*
sheet.setHeader("页眉", "", "第 &P 页,共 &N 页"); // 设置页眉
sheet.setFooter("", "", "&D &T"); // 设置页脚
//** ****注:以上这些&P、&D等参数可以从EXCEL的宏录制取得******* *//*
//** *********设置列宽**************** *//*
sheet.setColumnView(0, 20); //姓名
sheet.setColumnView(1, 15);//部门
sheet.setColumnView(2, 25);//证件类型
//** ************设置单元格字体************** *//*
WritableFont NormalFont = new WritableFont(WritableFont.ARIAL, 10);
WritableFont BoldFont12 = new WritableFont(WritableFont.ARIAL, 12,WritableFont.BOLD);//加粗12号字体
WritableFont BoldFont20 = new WritableFont(WritableFont.ARIAL, 20,WritableFont.BOLD);加粗18号字体

//** ************以下设置几种格式的单元格************ *//*
//用于台头
WritableCellFormat wcf_heading = new WritableCellFormat(BoldFont20);
wcf_heading.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
wcf_heading.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐
wcf_heading.setAlignment(Alignment.CENTRE); // 水平对齐
wcf_heading.setWrap(false); // 是否换行

// 用于标题
WritableCellFormat wcf_title = new WritableCellFormat(BoldFont12);
wcf_title.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
wcf_title.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐
wcf_title.setAlignment(Alignment.CENTRE); // 水平对齐
wcf_title.setWrap(false); // 是否换行

// 用于正文
WritableCellFormat wcf_text = new WritableCellFormat(NormalFont);
wcf_text.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
wcf_text.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐
wcf_text.setAlignment(Alignment.CENTRE); // 水平对齐
wcf_text.setWrap(true); // 是否换行
// 用于跨行
WritableCellFormat wcf_merge = new WritableCellFormat(NormalFont);
wcf_merge.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
wcf_merge.setVerticalAlignment(VerticalAlignment.TOP); // 垂直对齐
wcf_merge.setAlignment(Alignment.LEFT);
wcf_merge.setWrap(true); // 是否换行
// 用于正文
NumberFormat nf = new jxl.write.NumberFormat("0.00"); //设定带小数点数字格式
WritableCellFormat wcfN = new jxl.write.WritableCellFormat(NormalFont,nf);//设定带小数数字单元格格式
wcfN.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
wcfN.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐
wcfN.setAlignment(Alignment.CENTRE); // 水平对齐
wcf_merge.setWrap(false); // 是否换行
//** ************单元格格式设置完成****************** *//*

//** ***************以下是标题************************** *//*
sheet.setRowView(0, 800); // 设置行高
sheet.setRowView(1, 500); // 设置行高
sheet.addCell(new Label(0, 0, "常旅客导入模板", wcf_heading));
sheet.mergeCells(0,0,6,0);//合并第一行的第1列到第一行15列
sheet.addCell(new Label(0, 1, "姓名(必填)", wcf_title));
sheet.addCell(new Label(1, 1, "部门(必填)", wcf_title));
sheet.addCell(new Label(2, 1, "证件类型(必填)",
//** ***************以下是内容************************** *//*
WritableFont wcf_font=(WritableFont) wcf_text.getFont();
WritableCellFormat wcf_numberfomart = new WritableCellFormat(wcf_font,NumberFormats.TEXT);//设置数字格式类型按照文本格式输出
wcf_numberfomart.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
wcf_numberfomart.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐
wcf_numberfomart.setAlignment(Alignment.LEFT); // 水平对齐
wcf_numberfomart.setWrap(true); // 是否换行
sheet.addCell(new Label(0, 2,"张三", wcf_text));//姓名
sheet.addCell(new Label(1, 2,"1", wcf_text));//部门
sheet.addCell(new Label(2, 2,"1", wcf_text));//证件类型
//--------------------------
sheet.addCell(new Label(0, 3,"李四", wcf_text));//姓名
sheet.addCell(new Label(1, 3,"1", wcf_text));//部门
sheet.addCell(new Label(2, 3,"2", wcf_text));//证件类型
/** **********以上所写的内容都是写在缓存中的,下一句将缓存的内容写到文件中******** */
workbook.write();
/** *********关闭文件************* */

workbook.close();
} catch (RowsExceededException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (WriteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}[/size]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值