使用poi导出数据到excel详解编程语言

一、首先是导入poi所需要的jar包,我是用的是maven,添加jar包依赖

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

二、导出excel工具类代码编写

package com.cccuu.project.myUtils; 
 
import org.apache.poi.hssf.usermodel.*; 
import org.apache.poi.hssf.util.HSSFColor; 
import org.apache.poi.ss.util.CellRangeAddress; 
 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.util.List; 
 
/*******************************************  
 * 
 * @Package com.cccuu.project.myUtils 
 * @Author duan 
 * @Date 2018/3/29 9:12 
 * @Version V1.0 
 *******************************************/ 
public class ExcelUtil { 
 
 
    /** 
     * 导出excel 
     * @param title  导出表的标题 
     * @param rowsName 导出表的列名 
     * @param dataList  需要导出的数据 
     * @param fileName  生成excel文件的文件名 
     * @param response 
     */ 
    public void exportExcel(String title,String[] rowsName,List<Object[]> dataList,String fileName,HttpServletResponse response) throws Exception{ 
        OutputStream output = response.getOutputStream(); 
        response.reset(); 
        response.setHeader("Content-disposition", 
                "attachment; filename="+fileName); 
        response.setContentType("application/msexcel"); 
        this.export(title,rowsName,dataList,fileName,output); 
        this.close(output); 
 
    } 
 
 
 
    /* 
     * 导出数据 
     */ 
    private void export(String title,String[] rowName,List<Object[]> dataList,String fileName,OutputStream out) throws Exception { 
        try { 
            HSSFWorkbook workbook = new HSSFWorkbook(); // 创建工作簿对象 
            HSSFSheet sheet = workbook.createSheet(title); // 创建工作表 
            HSSFRow rowm = sheet.createRow(0);  // 产生表格标题行 
            HSSFCell cellTiltle = rowm.createCell(0);   //创建表格标题列 
            // sheet样式定义;    getColumnTopStyle();    getStyle()均为自定义方法 --在下面,可扩展 
            HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);// 获取列头样式对象 
            HSSFCellStyle style = this.getStyle(workbook); // 获取单元格样式对象 
            //合并表格标题行,合并列数为列名的长度,第一个0为起始行号,第二个1为终止行号,第三个0为起始列好,第四个参数为终止列号 
            sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (rowName.length - 1))); 
            cellTiltle.setCellStyle(columnTopStyle);    //设置标题行样式 
            cellTiltle.setCellValue(title);     //设置标题行值 
            int columnNum = rowName.length;     // 定义所需列数 
            HSSFRow rowRowName = sheet.createRow(2); // 在索引2的位置创建行(最顶端的行开始的第二行) 
            // 将列头设置到sheet的单元格中 
            for (int n = 0; n < columnNum; n++) { 
                HSSFCell cellRowName = rowRowName.createCell(n); // 创建列头对应个数的单元格 
                cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); // 设置列头单元格的数据类型 
                HSSFRichTextString text = new HSSFRichTextString(rowName[n]); 
                cellRowName.setCellValue(text); // 设置列头单元格的值 
                cellRowName.setCellStyle(columnTopStyle); // 设置列头单元格样式 
            } 
 
            // 将查询出的数据设置到sheet对应的单元格中 
            for (int i = 0; i < dataList.size(); i++) { 
                Object[] obj = dataList.get(i);   // 遍历每个对象 
                HSSFRow row = sheet.createRow(i + 3);   // 创建所需的行数 
                for (int j = 0; j < obj.length; j++) { 
                    HSSFCell cell = null;   // 设置单元格的数据类型 
                    if (j == 0) { 
                        cell = row.createCell(j, HSSFCell.CELL_TYPE_NUMERIC); 
                        cell.setCellValue(i + 1); 
                    } else { 
                        cell = row.createCell(j, HSSFCell.CELL_TYPE_STRING); 
                        if (!"".equals(obj[j]) && obj[j] != null) { 
                            cell.setCellValue(obj[j].toString()); // 设置单元格的值 
                        } 
                    } 
                    cell.setCellStyle(style); // 设置单元格样式 
                } 
            } 
 
            // 让列宽随着导出的列长自动适应 
            for (int colNum = 0; colNum < columnNum; colNum++) { 
                int columnWidth = sheet.getColumnWidth(colNum) / 256; 
                for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) { 
                    HSSFRow currentRow; 
                    // 当前行未被使用过 
                    if (sheet.getRow(rowNum) == null) { 
                        currentRow = sheet.createRow(rowNum); 
                    } else { 
                        currentRow = sheet.getRow(rowNum); 
                    } 
                    if (currentRow.getCell(colNum) != null) { 
                        HSSFCell currentCell = currentRow.getCell(colNum); 
                        if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) { 
                            int length = currentCell.getStringCellValue() 
                                    .getBytes().length; 
                            if (columnWidth < length) { 
                                columnWidth = length; 
                            } 
                        } 
                    } 
                } 
                if (colNum == 0) { 
                    sheet.setColumnWidth(colNum, (columnWidth - 2) * 256); 
                } else { 
                    sheet.setColumnWidth(colNum, (columnWidth + 4) * 256); 
                } 
            } 
            workbook.write(out); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 
 
    /* 
     * 列头单元格样式 
     */ 
    private HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) { 
 
        // 设置字体 
        HSSFFont font = workbook.createFont(); 
        // 设置字体大小 
        font.setFontHeightInPoints((short) 11); 
        // 字体加粗 
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 
        // 设置字体名字 
        font.setFontName("Courier New"); 
        // 设置样式; 
        HSSFCellStyle style = workbook.createCellStyle(); 
        // 设置底边框; 
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN); 
        // 设置底边框颜色; 
        style.setBottomBorderColor(HSSFColor.BLACK.index); 
        // 设置左边框; 
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN); 
        // 设置左边框颜色; 
        style.setLeftBorderColor(HSSFColor.BLACK.index); 
        // 设置右边框; 
        style.setBorderRight(HSSFCellStyle.BORDER_THIN); 
        // 设置右边框颜色; 
        style.setRightBorderColor(HSSFColor.BLACK.index); 
        // 设置顶边框; 
        style.setBorderTop(HSSFCellStyle.BORDER_THIN); 
        // 设置顶边框颜色; 
        style.setTopBorderColor(HSSFColor.BLACK.index); 
        // 在样式用应用设置的字体; 
        style.setFont(font); 
        // 设置自动换行; 
        style.setWrapText(false); 
        // 设置水平对齐的样式为居中对齐; 
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
        // 设置垂直对齐的样式为居中对齐; 
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); 
 
        return style; 
 
    } 
 
    /* 
     * 列数据信息单元格样式 
     */ 
    private HSSFCellStyle getStyle(HSSFWorkbook workbook) { 
        // 设置字体 
        HSSFFont font = workbook.createFont(); 
        // 设置字体大小 
        // font.setFontHeightInPoints((short)10); 
        // 字体加粗 
        // font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 
        // 设置字体名字 
        font.setFontName("Courier New"); 
        // 设置样式; 
        HSSFCellStyle style = workbook.createCellStyle(); 
        // 设置底边框; 
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN); 
        // 设置底边框颜色; 
        style.setBottomBorderColor(HSSFColor.BLACK.index); 
        // 设置左边框; 
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN); 
        // 设置左边框颜色; 
        style.setLeftBorderColor(HSSFColor.BLACK.index); 
        // 设置右边框; 
        style.setBorderRight(HSSFCellStyle.BORDER_THIN); 
        // 设置右边框颜色; 
        style.setRightBorderColor(HSSFColor.BLACK.index); 
        // 设置顶边框; 
        style.setBorderTop(HSSFCellStyle.BORDER_THIN); 
        // 设置顶边框颜色; 
        style.setTopBorderColor(HSSFColor.BLACK.index); 
        // 在样式用应用设置的字体; 
        style.setFont(font); 
        // 设置自动换行; 
        style.setWrapText(false); 
        // 设置水平对齐的样式为居中对齐; 
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
        // 设置垂直对齐的样式为居中对齐; 
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); 
        return style; 
    } 
 
    /** 
     * 关闭输出流 
     * @param os 
     */ 
    private void close(OutputStream os) { 
        if (os != null) { 
            try { 
                os.close(); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
        } 
    } 
 
}

三、测试,框架使用的是ssm

@RequestMapping("exportWordData") 
    public void exportExcelData(HttpServletRequest request,HttpServletResponse response){ 
        // 定义表的标题 
        String title = "员工列表一览"; 
        //定义表的列名 
        String[] rowsName = new String[] { "序号", "姓名", "性别", "特长", "学历", "入职时间", "简历", "照片", "部门" }; 
        //定义表的内容 
        List<Object[]> dataList = new ArrayList<Object[]>(); 
        Object[] objs = new Object[9]; 
        objs[0] = "测试"; 
        objs[1] = 11; 
        objs[2] = "111"; 
        objs[3] = "测试"; 
        objs[4] = "测试"; 
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 
        String date = df.format(2018-12-24); 
        objs[5] = date; 
        objs[6] = "测试"; 
        objs[7] = "测试"; 
        objs[8] = "测试"; 
        dataList.add(objs); 
        // 创建ExportExcel对象 
        ExcelUtil excelUtil = new ExcelUtil(); 
 
        try{ 
            String fileName= new String("测试excel文档.xlsx".getBytes("UTF-8"),"iso-8859-1");    //生成word文件的文件名 
            excelUtil.exportExcel(title,rowsName,dataList,fileName,response); 
            returnInfo.setResult(true); 
 
        }catch(Exception e){ 
            e.printStackTrace(); 
        } 
    }

使用poi导出数据到excel详解编程语言

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/16381.html

(0)
上一篇 2021年7月19日 19:15
下一篇 2021年7月19日 19:15

相关推荐

发表回复

登录后才能评论