这里是通过jxl实现对excel的导入导出的,可以动态创建本地excel,读取本地excel,写入excel。
只需导入jxl.jar包即可;
基本操作:
一:创建本地excel:
//创建EXECEL,添加数据,通过输出流输出到客户端下载
public static void createExecel(HttpServletRequest request,HttpServletResponse response,String fileName){
OutputStream os=null;
try {
os=response.getOutputStream();
response.reset();
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
response.setContentType("application/msexcel");
//创建工作薄
WritableWorkbook wwb=Workbook.createWorkbook(os);
//创建新的一页
WritableSheet sheet=wwb.createSheet("First sheet", 0);
//创建要显示的内容,第一个参数为列,第二个参数为行,第三个参数为内容
Label xuexiao=new Label(0,0,"学校");
sheet.addCell(xuexiao);
Label zhuanye=new Label(1,0,"专业");
sheet.addCell(zhuanye);
Label xuexiao1=new Label(0,1,"清华大学");
sheet.addCell(xuexiao1);
Label zhuanye1=new Label(1,1,"软件工程");
sheet.addCell(zhuanye1);
//把创建的内容写入输出流,并关闭
wwb.write();
wwb.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
二:创建带有 样式的EXECEL
//创建带有 样式的EXECEL,添加数据,通过输出流输出到客户端下载
public static void createStyleExecel(HttpServletRequest request,HttpServletResponse response,String fileName){
OutputStream os=null;
try {
os=response.getOutputStream();
response.reset();
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
response.setContentType("application/msexcel");
//创建工作薄
WritableWorkbook wwb=Workbook.createWorkbook(os);
//创建新的一页
WritableSheet sheet=wwb.createSheet("First sheet", 0);
//构造表头,合并单元格,第一个参数是起始列,第二个参数是起始行,第三个参数是终止列,第四个参数是终止行
sheet.mergeCells(0, 0, 1, 0);
//设置字体为Arial,字号为10,黑体显示
WritableFont wf=new WritableFont(WritableFont.ARIAL,10,WritableFont.BOLD);
//生成一个单元格样式控制对象
WritableCellFormat wcf=new WritableCellFormat(wf);
//单元格的内容水平方向上居中
wcf.setAlignment(jxl.format.Alignment.CENTRE);
//单元格的内容垂直方向上居中
wcf.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
//创建要显示的内容,第一个参数为列,第二个参数为行,第三个参数为内容
Label title=new Label(0,0,"学校专业信息表",wcf);
//设置第一行的高度
sheet.setRowView(0,600,false);
sheet.addCell(title);
WritableFont wf1=new WritableFont(WritableFont.ARIAL);
wf1.setColour(Colour.GOLD);//设置字体颜色
WritableCellFormat wcf1=new WritableCellFormat(wf1);
Label fd=new Label(0,1,"学校",wcf1);
sheet.addCell(fd);
Label be=new Label(1,1,"专业",wcf1);
sheet.addCell(be);
Label rq=new Label(0,2,"清华大学");
sheet.addCell(rq);
Label rq1=new Label(1,2,"软件工程");
sheet.addCell(rq1);
//把创建的内容写入输出流,并关闭
wwb.write();
wwb.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
三:创建excel,从数据库读取数据写入excel
//创建EXECEL,从数据库导入数据,输出到客户端下载
public static void createExecelData(HttpServletRequest request,HttpServletResponse response,StudentService studentService,String fileName){
OutputStream os=null;
try {
os=response.getOutputStream();
response.reset();
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
response.setContentType("application/msexcel");
//创建工作薄
WritableWorkbook wwb=Workbook.createWorkbook(os);
//创建新的一页
WritableSheet sheet=wwb.createSheet("First sheet", 0);
//创建要显示的内容,第一个参数为列,第二个参数为行,第三个参数为内容
Label studentId=new Label(0,0,"ID");
sheet.addCell(studentId);
Label studentName=new Label(1,0,"姓名");
sheet.addCell(studentName);
List<Student> students=studentService.findByHq("from Student s", null);
for(int i=0;i<students.size();i++){
studentId=new Label(0,i+1,students.get(i).getStudentId()+"");
studentName=new Label(1,i+1,students.get(i).getStudentName());
sheet.addCell(studentId);
sheet.addCell(studentName);
}
//把创建的内容写入输出流,并关闭
wwb.write();
wwb.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
四:读取本地EXECEL文件数据
//读取本地EXECEL文件数据
public static void readExcel(StudentService studentService,String filePath){
//创建只读Workbook对象
Workbook wb=null;
try {
InputStream is=new FileInputStream(filePath);
wb=Workbook.getWorkbook(is);
//创建sheet表,sheet下标从0开始
Sheet sheet=wb.getSheet(0);
//获取sheet表的总列数
int cols=sheet.getColumns();
System.out.println("列数:"+cols);
//获取sheet表的总行数
int rows=sheet.getRows();
System.out.println("行数:"+rows);
//遍历每个单元格
List<Student> students=new ArrayList<Student>();
for(int i=1;i<rows;i++){
Student s=new Student();
for(int j=0;j<cols;j++){
Cell cell=sheet.getCell(j,i);
System.out.println((i+","+j+":")+cell.getContents());
if(j==0){
s.setStudentId(Integer.valueOf(cell.getContents()));
}else{
s.setStudentName(cell.getContents());
}
}
students.add(s);
}
studentService.saveBatch(students);
System.out.println("batch ok");
} catch (Exception e) {
e.printStackTrace();
}
}
五 :实现通过jsp导入数据,到数据库:
分两步实现,先把文件上传到服务器本地,再读取本地excel文件
<form action="impExcel" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="导入">
</form>
public String executeImport(){
HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
//首先将文件上传至服务器 f:\\temp目录
InputStream is=null;
OutputStream os=null;
try {
System.out.println("in upload");
is=new FileInputStream(file);
path="F:\\temp\\"+fileFileName;
os=new FileOutputStream(new File(path));
byte[] b=new byte[1024];
int num;
while((num=is.read(b))!=-1){
os.write(b, 0, num);
os.flush();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
os.close();
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//从服务器读取Execel
ExcelUtil.readExcel(studentService,"F:\\temp\\"+fileFileName);
System.out.println("导入 execel ok");
return "all";
}
六 导出excel
<a href="expExcel">导出</a>
public String executeExport(){
HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
// ExcelUtil.createExecel(request, response,fileName);
ExcelUtil.createExecelData(request, response,studentService,fileName);
// ExcelUtil.createStyleExecel(request, response,fileName);
System.out.println("导出 execel ok");
return null;
}