java使用poi操作Excel导入导出

需要依赖:

    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.14</version>
    </dependency>
    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.14</version>
    </dependency>

工具类:

/**
 * 导出excel
 *
 * @param response
 * @param header
 * @param dataList
 * @throws Exception
 */
public static void exportExcel(HttpServletResponse response, List<String> header, List<List<String>> dataList) throws Exception {
    exportExcel(response, "主标题", "副标题", header, dataList);
}

/**
 * 导出excel
 *
 * @param response
 * @param title
 * @param subheading
 * @param header
 * @param dataList
 * @throws Exception
 */
public static void exportExcel(HttpServletResponse response, String title, String subheading, List<String> header, List<List<String>> dataList) throws Exception {
    //获取一个HSSFWorkbook对象
    HSSFWorkbook workbook = new HSSFWorkbook();
    HSSFCellStyle style = getHSSFCellStyle(workbook);
    //创建一个sheet
    HSSFSheet sheet = workbook.createSheet("Sheet1");
    //创建一个标题行
    CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 0, header.size());
    //创建一个副标题行
    CellRangeAddress cellRangeAddress2 = new CellRangeAddress(1, 1, 0, header.size());
    sheet.addMergedRegion(cellRangeAddress);
    sheet.addMergedRegion(cellRangeAddress2);

    //标题,居中
    HSSFRow row0 = sheet.createRow(0);
    HSSFCell cell0 = row0.createCell(0);
    cell0.setCellValue(title);
    cell0.setCellStyle(style);
    // 第一行
    HSSFRow row1 = sheet.createRow(1);
    HSSFCell cell1 = row1.createCell(0);
    //副标题
    cell1.setCellValue(subheading);
    cell1.setCellStyle(style);

    //表头
    HSSFRow row = sheet.createRow(2);

    HSSFCell cell = null;
    for (int i = 0; i < header.size(); i++) {
        cell = row.createCell(i);
        cell.setCellValue(header.get(i));
        cell.setCellStyle(style);
    }

    //数据
    for (int i = 0; i < dataList.size(); i++) {
        row = sheet.createRow(i + 3);
        for (int j = 0; j < dataList.get(i).size(); j++) {
            row.createCell(j).setCellValue(dataList.get(i).get(j));
        }
    }

    OutputStream outputStream = response.getOutputStream();
    //设置页面不缓存
    response.reset();
    String filename = title;
    //设置返回文件名的编码格式
    response.setCharacterEncoding("utf-8");
    filename = URLEncoder.encode(filename, "utf-8");
    response.setHeader("Content-disposition", "attachment;filename=" + filename + ".xls");
    response.setContentType("application/msexcel");
    workbook.write(outputStream);
    outputStream.close();
}

/**
 * 导入数据(单页)
 *
 * @param file        文件
 * @param sheetIndex  页名的索引(从0开始,-1代表全部页)
 * @param headerIndex 表头的索引(用于获取共多少列以及第几行开始读数据)
 * @return
 * @throws IOException
 */
public static List<List<Object>> importExcel(MultipartFile file, int sheetIndex, int headerIndex) throws Exception {
    Workbook workbook = null;
    //返回的data
    List<List<Object>> data = new ArrayList<>();
    workbook = getWorkbook(file);
    //导入某一页
    if (sheetIndex != -1 && sheetIndex > -1) {
        Sheet sheet = workbook.getSheetAt(sheetIndex);
        List<List<Object>> lists = importOneSheet(sheet, headerIndex);
        data.addAll(lists);
    } else {
        //导入全部
        for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
            Sheet sheet = workbook.getSheetAt(i);
            if (sheet == null) {
                continue;
            }
            List<List<Object>> lists = importOneSheet(sheet, headerIndex);
            data.addAll(lists);
        }
    }
    return data;
}

/**
 * 导入数据(所有页)
 *
 * @param file        文件
 * @param headerIndex 表头的索引(用于获取共多少列以及第几行开始读数据)
 * @return
 * @throws IOException
 */
public static List<List<Object>> importExcel(MultipartFile file, int headerIndex) throws Exception {
    return importExcel(file, -1, headerIndex);
}

/**
 * 创建一个style
 *
 * @param workbook
 * @return
 */
private static HSSFCellStyle getHSSFCellStyle(HSSFWorkbook workbook) {
    HSSFCellStyle style = workbook.createCellStyle();
    //居中
    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    return style;
}


/**
 * 获取一个sheet里的数据
 *
 * @param sheet
 * @param headerIndex
 * @return
 * @throws Exception
 */
private static List<List<Object>> importOneSheet(Sheet sheet, int headerIndex) throws Exception {
    List<List<Object>> data = new ArrayList<>();
    int row = sheet.getLastRowNum();
    //row = -1 表格中没有数据
    //row = headerIndex 表格中表头以下没有数据(指没有有用数据)
    if (row == -1 || row == headerIndex) {
        throw new Exception("表格中没有有用数据!");
    }
    //通过表头获取共多少列
    int coloumNum = sheet.getRow(headerIndex).getPhysicalNumberOfCells();
    //从表头下一行开始取数据
    for (int i = headerIndex + 1; i <= row; i++) {
        Row row1 = sheet.getRow(i);
        List<Object> list = new ArrayList<>();
        if (row1 != null) {
            for (int j = 0; j < coloumNum; j++) {
                list.add(getCellValue(row1.getCell(j)));
            }
        }
        data.add(list);
    }
    return data;
}

/**
 * 获取workbook
 *
 * @return
 */
private static Workbook getWorkbook(MultipartFile file) throws Exception {
    Workbook workbook = null;
    //获取文件名
    String fileName = file.getOriginalFilename();
    //判断文件格式
    if (fileName.endsWith(XLS)) {
        workbook = new HSSFWorkbook(file.getInputStream());
    } else if (fileName.endsWith(XLSX)) {
        workbook = new XSSFWorkbook(file.getInputStream());
    } else {
        throw new Exception("文件格式有误!");
    }
    return workbook;
}


/**
 * 获取单元格的值
 *
 * @param cell
 * @return
 */
private static String getCellValue(Cell cell) {
    String cellValue = "";
    DecimalFormat df = new DecimalFormat("#");
    switch (cell.getCellType()) {
        case HSSFCell.CELL_TYPE_STRING:
            cellValue = cell.getRichStringCellValue().getString().trim();
            break;
        case HSSFCell.CELL_TYPE_NUMERIC:
            cellValue = df.format(cell.getNumericCellValue()).toString();
            break;
        case HSSFCell.CELL_TYPE_BOOLEAN:
            cellValue = String.valueOf(cell.getBooleanCellValue()).trim();
            break;
        case HSSFCell.CELL_TYPE_FORMULA:
            cellValue = cell.getCellFormula();
            break;
        default:
            cellValue = "";
    }
    return cellValue.trim();
}

1、导入excel
(1)新建测试controller

@RequestMapping(value = "/import", method = RequestMethod.POST)
@ResponseBody
public Object importExcel(MultipartFile file) {
    List<List<Object>> test = null;
    try {
        test = ExcelUtil.importExcel(file, 0);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return successView("", test);
}

在controller中是用excel工具类,参数file为excel文件,参数0为表头的索引(注意是索引,实际位置-1),工具类中还有一个参数sheetIndex为导入的是excel文件中的哪一个sheet,如果不传则为导入全部的sheet(当然要保证格式一样),下面来测试一下;
测试excel文件:

有两个sheet:
image.png

image.png

导入后返回的list:
image.png

然后将这个list存到数据库就行了。

(2)导出:

    List<String> header = new ArrayList<>();
    header.add("评论Id");
    header.add("被评论人Id");
    header.add("内容");
    List<List<String>> dataList = new ArrayList<>();
    for (int i = 0; i < commentList.size(); i++) {
        List<String> data = new ArrayList<>();
        data.add(commentList.get(i).getCommentid());
        data.add(commentList.get(i).getBecommented());
        data.add(commentList.get(i).getContent());
        dataList.add(data);
    }
    try {
        ExcelUtil.exportExcel(response, "测试", "副标题", header, dataList);
    } catch (Exception e) {
        e.printStackTrace();
    }

导出方法共5个参数,第一个response:HttpServletResponse,第二个title:表的主标题,第三个subheading:副标题,第四个header:表头list,第五个dataList:数据list;

链接:https://wmelon.cn/126.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容