您的位置:首页 > 编程语言 > Java开发

Java 使用jxl类库以流的方式实现Excel导入导出

2016-12-07 14:20 956 查看
       本文以输入输出流的方式导入导出Excel文件。框架背景为SpringMVC,Excel表格的工具类库用的是jxl-2.6.12.jar,非常好用,本文非常简单得示例了如何使用该类库。

package com.hxj.excel.controller;

import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@Controller
@RequestMapping("/aaa")
public class ImportExcelController {
private static Logger logger = LoggerFactory.getLogger(ImportExcelController.class);

@ResponseBody
@RequestMapping("/bbb")
public void importExcelMethod(@RequestParam(value = "file")MultipartFile file){
Long fileSize = file.getSize();
if(fileSize > 1024*1024){
logger.error("文件大小不能超过1M");
}
String suffix= file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
if (!suffix.equals(".xls") && !suffix.equals(".xlsx")){
logger.error("文件类型错误");
}
try {
//以输入流创建一个excel工作簿
Workbook workbook = Workbook.getWorkbook(file.getInputStream());
//取第一个工作表,getRows取到工作表的行数
Sheet sheet = workbook.getSheet(0);
for(int i = 0;i<sheet.getRows();i++){
//取第i行第1列的内容
String firstCell = sheet.getCell(0,i).getContents();
//取第i行第2列的内容
String secondCell = sheet.getCell(1,i).getContents();
logger.info(firstCell+"   "+secondCell);
}
} catch (IOException e) {
e.printStackTrace();
} catch (BiffException e) {
e.printStackTrace();
}
}
}

package com.hxj.excel.controller;

import jxl.Workbook;
import jxl.format.Alignment;
import jxl.write.*;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;

@Controller
@RequestMapping("/xxx")
public class ExportExcelController {

@ResponseBody
@RequestMapping("/yyy")
public void exportExcelMethod(HttpServletRequest request,HttpServletResponse response){
//创建输出流
ServletOutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
//创建excel工作簿
WritableWorkbook workbook = Workbook.createWorkbook(outputStream);
//创建一个工作表
WritableSheet sheet = workbook.createSheet("工作表一",0);
//设置字体
WritableFont font = new WritableFont(WritableFont.createFont("宋体"),13,WritableFont.NO_BOLD,false);
//设置样式
WritableCellFormat format = new WritableCellFormat(font);
format.setAlignment(Alignment.CENTRE);//居中对齐
//设置表头(第一行第一第二列)
sheet.setColumnView(0,25);
sheet.addCell(new Label(0,0,"姓名",format));
sheet.addCell(new Label(1,0,"部门",format));
//插入内容(第二,三行第一第二列)
sheet.addCell(new Label(0,1,"张三",format));
sheet.addCell(new Label(1,1,"人事部",format));
sheet.addCell(new Label(0,2,"李四",format));
sheet.addCell(new Label(1,2,"财务部",format));
//导出文件名
String filename = "WorkersList.xls";
//解决中文编码问题
String agent = request.getHeader("User-Agent").toLowerCase();
if(agent.indexOf("chrome")>0 || agent.indexOf("firefox")>0){
filename = new String(filename.getBytes("UTF-8"),"ISO-8859-1");
}else{
filename = URLEncoder.encode(filename,"UTF-8");
}
//设置响应
response.setContentType("text/xls;charset=utf-8");
response.setHeader("Pragma","public");
response.setHeader("Cache-Control","max-age=30");
response.setHeader("Content-disposition","attachment;filename="+filename);

//写入工作簿,关闭工作簿
workbook.write();
workbook.close();
outputStream.flush();
} catch (Exception e) {
e.printStackTrace();
}finally {
if(null != outputStream){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}
}


       Workbook.createWorkbook()参数可以是一个输出流,也可以是一个IO的File对象。当参数为File对象时,即在本地路径创建Excel文件,然后写入文件内容,实现导出。

       Workbook.getWorkbook()参数可以是一个输入流,也可以是一个IO的File对象。当参数为File对象时,即读取本地Excel文件,实现导入。

        以上例子都是通过流的方式实现导入导出,无需在服务器创建或保留Excel文件,如此将不会占用磁盘空间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: