字节跳动技术总监自爆:java实现excel导入导出(jxl

  * @param inputStream

 * @return

 */

@Override

public List importExcel(String type, InputStream inputStream) {

    List list = new ArrayList();

    if (type.equals("xls")) {

        list = JxlUtil.xlsContent(inputStream);

    } else {

        list = JxlUtil.csvContent(inputStream);

    }

    return list;

}

}




jxl工具类



package com.mycompany.myapp.util;

import jxl.Sheet;

import jxl.Workbook;

import jxl.format.Alignment;

import jxl.format.Border;

import jxl.format.BorderLineStyle;

import jxl.format.VerticalAlignment;

import jxl.read.biff.BiffException;

import jxl.write.*;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.io.*;

import java.lang.reflect.Field;

import java.math.BigDecimal;

import java.text.DecimalFormat;

import java.util.ArrayList;

import java.util.List;

/**

  • @description:

  • @author: alan

  • @time: 2021/7/23 18:26

*/

public class JxlUtil {

/**

 * 导出Excel

 *

 * @param fileName 文件地址名称

 * @param Title 导出excel的标题

 * @param listContent 导出的list

 * @return

 */

public final static boolean exportExcel(String fileName, String[] Title, List<?> listContent) {

    final Logger logger = LoggerFactory.getLogger(JxlUtil.class);

    WritableWorkbook workbook = null;

    // 以下开始输出到EXCEL

    try {

        String filePathName = fileName.substring(0,fileName.lastIndexOf("/"));

        File f = new File(filePathName);

        if(!f.exists()){

            f.mkdirs();//创建目录

        }

        // 创建可写入的Excel工作簿

        File file = new File(fileName);

        if (!file.exists()) {

            boolean bool = file.createNewFile();

            logger.info("创建Excel工作簿结果",bool);

        }

        /** **********创建工作簿************ */

        workbook = Workbook.createWorkbook(file);

        /** **********创建工作表************ */

        WritableSheet sheet = workbook.createSheet("Sheet1", 0);

        /** **********设置纵横打印(默认为纵打)、打印纸***************** */

        jxl.SheetSettings sheetset = sheet.getSettings();

        sheetset.setProtected(false);

        /** ************设置单元格字体************** */

        WritableFont NormalFont = new WritableFont(WritableFont.ARIAL, 10);

        WritableFont BoldFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD);

        /** ************以下设置三种单元格样式,灵活备用************ */

        // 用于标题居中

        WritableCellFormat wcf_center = new WritableCellFormat(BoldFont);

        wcf_center.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条

        wcf_center.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐

        wcf_center.setAlignment(Alignment.CENTRE); // 文字水平对齐

        wcf_center.setWrap(false); // 文字是否换行

        // 用于正文居左

        WritableCellFormat wcf_left = new WritableCellFormat(NormalFont);

        wcf_left.setBorder(Border.NONE, BorderLineStyle.THIN); // 线条

        wcf_left.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐

        wcf_left.setAlignment(Alignment.LEFT); // 文字水平对齐

        wcf_left.setWrap(false); // 文字是否换行



        /** ***************以下是EXCEL开头大标题,暂时省略********************* */

        // sheet.mergeCells(0, 0, colWidth, 0);

        // sheet.addCell(new Label(0, 0, "XX报表", wcf_center));

        /** ***************以下是EXCEL第一行列标题********************* */

        for (int i = 0; i < Title.length; i++) {

            sheet.addCell(new Label(i, 0, Title[i], wcf_center));

        }

        /** ***************以下是EXCEL正文数据********************* */

        Field[] fields = null;

        int i = 1;

        for (Object obj : listContent) {

            fields = obj.getClass().getDeclaredFields();

            int j = 0;

            for (Field v : fields) {

                v.setAccessible(true);

                Object va = v.get(obj);

                if (va == null) {

                    va = "";

                }

                if (va.getClass().getSimpleName().equals("Double")) {

                    sheet.addCell(new Label(j, i, BigDecimal.valueOf((Double) va) + "", wcf_left));

                } else if (va.getClass().getSimpleName().equals("Float")) {

                    Double vDouble = ((Float) va).doubleValue();



                    sheet.addCell(new Label(j, i, new BigDecimal(new DecimalFormat("#.00").format(vDouble)) + "",

                        wcf_left));

                } else {

                    sheet.addCell(new Label(j, i, va.toString() + "", wcf_left));

                }

                j++;

            }

            i++;

        }

        /** **********将以上缓存中的内容写到EXCEL文件中******** */

        workbook.write();



    } catch (Throwable t) {

        logger.error("系统提示:Excel文件导出失败,原因:",t.getMessage());

        t.printStackTrace();

    }finally {

        try {

            /** *********关闭文件************* */

            workbook.close();

        }catch (Exception e){

            logger.error("系统提示:关闭文件失败,原因:",e.getMessage());

        }

    }

    return true;

}

/**

 * 获取CSV文件中的内容

 *

 * @param inputStream

 * @return

 */

public static List<String> csvContent(InputStream inputStream) {

    List<String> allString = new ArrayList<>();



    if (inputStream != null) {

        InputStreamReader inputStreamReader;

        BufferedReader br = null;

        //FileInputStream fins = new FileInputStream(csv);

        try {

            inputStreamReader = new InputStreamReader(inputStream, "GBK");

            br = new BufferedReader(inputStreamReader);

            String line = "";

            String everyLine = "";

            while ((line = br.readLine()) != null) { // 读取到的内容给line变量

                everyLine = line + " ,";

                allString.add(everyLine);

            }



        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            try {

                br.close();

            }catch (Exception e){

                e.printStackTrace();

            }

        }

    }

    return allString;

}



/**

 * 获取xls文件中的内容

 *

 * @param inputStream

 * @return

 */

public static List<String> xlsContent(InputStream inputStream) {

    List<String> allString = new ArrayList<String>();

    try {

        // 创建输入流,读取Excel

        //InputStream is = new FileInputStream(xls.getAbsolutePath());

        // jxl提供的Workbook类

        Workbook wb = Workbook.getWorkbook(inputStream);

        // Excel的页签数量

        int sheet_size = wb.getNumberOfSheets();

        for (int index = 0; index < sheet_size; index++) {

            // 每个页签创建一个Sheet对象

            Sheet sheet = wb.getSheet(index);

            // sheet.getRows()返回该页的总行数

            for (int i = 0; i < sheet.getRows(); i++) {

                // sheet.getColumns()返回该页的总列数

                StringBuffer sb = new StringBuffer();

                for (int j = 0; j < sheet.getColumns(); j++) {

                    String cellinfo = sheet.getCell(j, i).getContents();

                    sb.append(cellinfo + ";");

                }

                allString.add(sb.toString().substring(0, sb.length() - 1));

            }

        }

    } catch (Exception e) {

        e.printStackTrace();

    }



    return allString;

}

}




下载工具类



package com.mycompany.myapp.util;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.*;

/**

  • @description:

  • @author: alan

  • @time: 2020/9/27 18:01

*/

public class DownloadFileUtil {

/**

 * 下载文件

 *

 * @param response

 * @param request

 * @param filePath 文件地址

 * @throws Exception

 */

public static void downloadFile(HttpServletResponse response, HttpServletRequest request, String filePath) {

    try {

        //获取文件

        File file = new File(filePath);

        String fileName = file.getName();

        response.reset();

        ServletOutputStream out = response.getOutputStream();

        request.setCharacterEncoding("UTF-8");

        int BUFFER = 1024 * 10;

        byte data[] = new byte[BUFFER];

        BufferedInputStream bis = null;

        //获取文件输入流

        InputStream inputStream = new BufferedInputStream(new FileInputStream(filePath));

        // 以流的形式下载文件。

        DataInputStream fis = new DataInputStream(inputStream);

        int read;

        bis = new BufferedInputStream(fis, BUFFER);

        response.setContentType("application/OCTET-STREAM");

        response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

        while ((read = bis.read(data)) != -1) {

            out.write(data, 0, read);

        }

        fis.close();

        bis.close();

    } catch (Exception e) {

        e.printStackTrace();

    } finally {

        File file = new File(filePath);

        //删除临时文件

        if (file.exists()) {

            file.delete();

        }

    }

}

}




[](https://gitee.com/vip204888/java-p7)运行结果

=======================================================================



调用导出,直接调用浏览器下载  

![在这里插入图片描述](https://img-blog.csdnimg.cn/8a507ba98a0f48f19f32585ea80d3035.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTM1MzA4Mw==,size_16,color_FFFFFF,t_70)  

导出的文件  

![在这里插入图片描述](https://img-blog.csdnimg.cn/d2f85a0b7a924b7eb3476876f83c7fec.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTM1MzA4Mw==,size_16,color_FFFFFF,t_70)  

导入刚刚导出的文件  
### 最后

俗话说,好学者临池学书,不过网络时代,对于大多数的我们来说,我倒是觉得学习意识的觉醒很重要,这是开始学习的转折点,比如看到对自己方向发展有用的信息,先收藏一波是一波,比如如果你觉得我这篇文章ok,先点赞收藏一波。这样,等真的沉下心来学习,不至于被找资料分散了心神。慢慢来,先从点赞收藏做起,加油吧!

> **好啦,由于文章篇幅限制,面试题答案详解我就不在这里展示出来了,[如果你需要这份完整版的面试题答案详解资料点击这里免费领取](https://gitee.com/vip204888/java-p7)**

另外,给大家安排了一波学习面试资料:

![image](https://img-blog.csdnimg.cn/img_convert/dfed946b0ad01ac159b0c42e9b4d96d7.png)

![image](https://img-blog.csdnimg.cn/img_convert/7146069726333cd0031603988742a83f.png)

f85a0b7a924b7eb3476876f83c7fec.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTM1MzA4Mw==,size_16,color_FFFFFF,t_70)  

导入刚刚导出的文件  
### 最后

俗话说,好学者临池学书,不过网络时代,对于大多数的我们来说,我倒是觉得学习意识的觉醒很重要,这是开始学习的转折点,比如看到对自己方向发展有用的信息,先收藏一波是一波,比如如果你觉得我这篇文章ok,先点赞收藏一波。这样,等真的沉下心来学习,不至于被找资料分散了心神。慢慢来,先从点赞收藏做起,加油吧!

> **好啦,由于文章篇幅限制,面试题答案详解我就不在这里展示出来了,[如果你需要这份完整版的面试题答案详解资料点击这里免费领取](https://gitee.com/vip204888/java-p7)**

另外,给大家安排了一波学习面试资料:

[外链图片转存中...(img-ZT58jZ5B-1628093608609)]

[外链图片转存中...(img-Wy6ktXFq-1628093608611)]

以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值