POI excel导出

******************************************************************************************

excel表格导出,使用POI实现

******************************************************************************************

实现导出步骤

——配置导出excel模板,推荐使用03版xls格式,可以兼容高级版本

——处理导出数据List<Map<String, String>>

private List<Map<String, String>> getData(){
    List<Map<String, String>> data = new ArrayList<>();
    Map<String, String> map = null;
    for (int i = 0; i < 5; i++) {
        map = new HashMap<String, String>();
        map.put("listNo", i + "");
        map.put("userName", "name" + i);
        map.put("userAge", "" + (i + 20));
        data.add(map);
    }
    return data;
}

——获取模板xls文件,通过输入流读到HSSFWorkbook 对象中

private HSSFWorkbook workbookTemplate() {
    File file = new File("f:/etom/pmms/src/test/resources/bdRoute.xls");
    InputStream is = null;
    HSSFWorkbook workbook = null;
    try {
        is = new FileInputStream(file);
        workbook = new HSSFWorkbook(is);
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        if (null != is) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
    return workbook;
}

——通过页签名获取页签

private HSSFSheet getSheet(HSSFWorkbook workbook) {
    String sheetName = "用户信息";
    HSSFSheet sheet = workbook.getSheet(sheetName);
    if (null != sheet) {
        return sheet;
    }
    return null;
}

——获取规则,如${userName}

private String getValue(HSSFCell cell){
    int type = cell.getCellType();
    switch (type) {
        case Cell.CELL_TYPE_NUMERIC:
            return Double.toString(cell.getNumericCellValue());
        case Cell.CELL_TYPE_BOOLEAN:
            return Boolean.toString(cell.getBooleanCellValue());
        case Cell.CELL_TYPE_STRING:
            return cell.getStringCellValue();
        default:
            return "";
    }
}

——设置规则,如${userName}

private void setCellRule(HSSFRow firstDataRow, HSSFRow newRow) {
    HSSFCell cellInRule = null;
    HSSFCell newCell = null;
    for (int i = 0, cellNum = firstDataRow.getLastCellNum(); i < cellNum; i++) {
        cellInRule = firstDataRow.getCell(i);
        newCell = newRow.createCell(i);
        HSSFCellStyle style = cellInRule.getCellStyle();
        newCell.setCellStyle(style);
        String rule = getValue(cellInRule);
        newCell.setCellValue(rule);
    }
}

——设置页签模板,将内容行复制,行数与数据data的条数一致

// loop复制行的根据,rowCount复制多少行,上面截图中,复制行是从行号为4开始private void setSheet(HSSFSheet sheet, int loop, int rowCount) {    HSSFRow newRow = null;    HSSFRow firstDataRow = sheet.getRow(loop - 1);    for (int i = loop, maxRow = loop + rowCount; i < maxRow - 1; i++) {        newRow = sheet.createRow(i);        setCellRule(firstDataRow, newRow);    }}

——具体设置单元格内容

private void setCellValue(HSSFRow row, Map<String, String> rowData) {
    for (int i = 0, cellNum = row.getLastCellNum(); i < cellNum; i++) {

        HSSFCell cell = row.getCell(i);
        if (null == cell) {
            continue;
        }
        String oldValue = getValue(cell);
        Pattern pattern = Pattern.compile(patternRule);
        Matcher matcher = pattern.matcher(oldValue);
        if (matcher.find()) {
            String key = matcher.group(1);
            String value = rowData.getOrDefault(key, "");
            cell.setCellValue(value);
        }
    }
}

——设置行内容(通过设置单元格内容)

// 设置内容,单元的范围是从第loop行开始,到第loop+data.size()行结束private void setValue(HSSFSheet sheet, int loop, List<Map<String, String>> data) {    HSSFRow row = null;    for (int i = loop - 1, rowNum = loop + data.size(), index = 0; i < rowNum - 1; i++) {        row = sheet.getRow(i);        setCellValue(row, data.get(index++));    }}

——生成excel文件,格式为xls

private void createExcel(HSSFWorkbook workbook,String targetPath){
    File excelFile = new File(targetPath);
    OutputStream os = null;
    try {
        os = new FileOutputStream(excelFile);
        workbook.write(os);
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        if (null != os) {
            try {
                os.flush();
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

——测试

@Test
public void test(){
    List<Map<String, String>> data = getData();
    String templatePath = "f:/etom/pmms/src/test/resources/user.xls";
    HSSFWorkbook workbook = workbookTemplate(templatePath);
    HSSFSheet sheet = getSheet(workbook);
    setSheet(sheet, 5, data.size());
    setValue(sheet, 5, data);
    Long timeMillis = System.currentTimeMillis();
    String targetPath = String.format("f:/etom/pmms/src/test/resources/%s.xls", Long.toString(timeMillis));
    createExcel(workbook, targetPath);
}

——结果展示

原文地址:https://www.cnblogs.com/antlord/p/8318010.html

时间: 2024-11-06 09:36:41

POI excel导出的相关文章

poi excel导出,下载

poi.jar包 public void downExcel(HttpServletResponse response,Page<ShopApply> page) throws Exception{ // 第一步,创建一个webbook,对应一个Excel文件 HSSFWorkbook wb = new HSSFWorkbook(); // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet HSSFSheet sheet = wb.createSheet(&quo

java POI excel 导出复合样式(一个单元格两个字体)

前言:java poi 导出 excel 时,需要设置一个单元格有多个字体样式,有点类似于富文本. 想要达到的效果(一个单元格里): 我使用的 poi 版本是 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> 具体实现: 工具类方法:

Java POI Excel导出文件名中文乱码

在导出前对名称根据浏览器做下处理 // 判断浏览器类型,firefox浏览器做特殊处理,否则下载文件名乱码 public static void compatibleFileName(HttpServletRequest request, HttpServletResponse response, String excelname) throws UnsupportedEncodingException { String agent = request.getHeader("USER-AGENT

POI Excel导出样式设置

HSSFSheet sheet = workbook.createSheet("sheetName"); //创建sheetsheet.setVerticallyCenter(true); //下面样式可作为导出左右分栏的表格模板sheet.setColumnWidth((short) 0, (short) 2600);// 设置列宽sheet.setColumnWidth((short) 1, (short) 2400);sheet.setColumnWidth((short) 2,

Java利用POI导入导出Excel中的数据

     首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地址http://poi.apache.org/download.html,有兴趣的朋友也可以去看看其中的API.      下面分享一下在对POI进行基本操作时觉得需要注意的两点:       1.POI中针对xlsx/xls是需要create different Workbook instance

Apache POI -- Java 导出Excel文档(笔记)

一.Action类 import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Met

poi导入导出excel后记

续上一篇:在springmvc项目中使用poi导入导出excel http://blog.csdn.net/kingson_wu/article/details/38942967 一. 导入时,发现了不少问题,如果是导出excel之后,在里面不删除行,只是简单的修改一些数据的话,则不会出问题,但如果是删除了一些行,或者excel表不是导出的,而是另外的excel文件,里面有很多数据ctrl+a,ctrl+v生成的,那么导入的时候就会出问题,因为里面虽然看起来的数据就那么多,但是有一些数据痕迹.很

Excel导出学习之道:Java Web利用POI导出Excel简单例子

采用Spring mvc架构: Controller层代码如下 [java] view plaincopy @Controller public class StudentExportController{ @Autowired private StudentExportService studentExportService; @RequestMapping(value = "/excel/export") public void exportExcel(HttpServletReq

springMVC中使用POI方式导出excel至客户端、服务器实例

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 这里的方法支持导出excel至项目所在服务器,或导出至客户端浏览器供用户下载,下面我把两个实例都放出来. 1.下载所需POI的jar包,并导入项目. 2.添加一个User类,用于存放用户实体,类中内容如下: 1 package com.mvc.po; 2 3 public class User { 4 private int id; 5 priva