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

       本文以输入输出流的方式导入导出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文件,如此将不会占用磁盘空间。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值