栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 生成Excel系列之poi

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 生成Excel系列之poi

前言

网上找了好久资源都没找到把自己之前开发使用的Excel工具类贴出来,

Mavn jar
    
        org.apache.poi
        poi
        3.14
    
    
        org.apache.poi
        poi-ooxml
        3.14
    
    
        commons-io
        commons-io
        2.4
    
工具类
package com.example.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;


public class ExcelUtil {

    public static final int PERPAGENUM = 50000;

    
    public static byte[] createExcelByte(String excelName, int[] colwidth, String[] titleNames,
                                          List listExcelValue) throws Exception {
        String excelFullName = excelName + ".xls";// 生成excel表格文件名称
        int sheetNum = 1;// 工作薄sheet编号
        int bodyRowCount = 1;// 正文内容行号
        int currentRowCount = 1;// 当前的行号
        HSSFWorkbook workbook = new HSSFWorkbook();// 创建excel
        HSSFSheet sheet = workbook.createSheet(excelName + "(" + sheetNum + ")");// 创建一个工作薄
        HSSFRow row = null;// 创建一行
        HSSFCell cell = null;// 每个单元格
        HSSFCellStyle titleCellStyle = createTitleCellStyle(workbook);// 设置标题样式
        writeTitleContent(sheet, titleCellStyle, colwidth, titleNames);// 写入标题
        HSSFCellStyle bodyCellStyle = createBodyCellStyle(workbook);// 设置正文样式
        // 中文乱码处理
        // request.setCharacterEncoding(Constant.ENCODE_UTF);
        // response.setCharacterEncoding(Constant.ENCODE_UTF);
        // 第二行开始写入数据 正文内容
        for (String[] linevalue : listExcelValue) {
            row = sheet.createRow(bodyRowCount);// 创建一行
            // 每行excel单元格
            for (int i = 0; i < linevalue.length; i++) {
                cell = row.createCell(i);// 创建一个单元格
                cell.setCellStyle(bodyCellStyle);// 给单元格设置样式
                cell.setCellValue(linevalue[i]);// 给单元格设置值
            }

            // 每个sheet显示50000条数据,超过50000创建一个新的sheet页
            if (listExcelValue.size() > currentRowCount && currentRowCount % PERPAGENUM == 0) {
                sheet = null;
                sheetNum++;// 工作薄编号递增1
                sheet = workbook.createSheet(excelName + "(" + sheetNum + ")");// 创建一个新的工作薄
                bodyRowCount = 0;// 正文内容行号置位为0
                writeTitleContent(sheet, titleCellStyle, colwidth, titleNames);// 写入标题
            }
            bodyRowCount++;// 正文内容行号递增1
            currentRowCount++;// 当前行号递增1
        }
        listExcelValue = null;
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        workbook.write(os);
        return os.toByteArray();
    }


    
    public static ResponseEntity createExcel(String excelName, int[] colwidth, String[] titleNames,
                                                     List listExcelValue) throws Exception {
        String excelFullName = excelName + ".xls";// 生成excel表格文件名称
        int sheetNum = 1;// 工作薄sheet编号
        int bodyRowCount = 1;// 正文内容行号
        int currentRowCount = 1;// 当前的行号
        HSSFWorkbook workbook = new HSSFWorkbook();// 创建excel
        HSSFSheet sheet = workbook.createSheet(excelName + "(" + sheetNum + ")");// 创建一个工作薄
        HSSFRow row = null;// 创建一行
        HSSFCell cell = null;// 每个单元格
        HSSFCellStyle titleCellStyle = createTitleCellStyle(workbook);// 设置标题样式
        writeTitleContent(sheet, titleCellStyle, colwidth, titleNames);// 写入标题
        HSSFCellStyle bodyCellStyle = createBodyCellStyle(workbook);// 设置正文样式
        // 中文乱码处理
        // request.setCharacterEncoding(Constant.ENCODE_UTF);
        // response.setCharacterEncoding(Constant.ENCODE_UTF);
        // 第二行开始写入数据 正文内容
        for (String[] linevalue : listExcelValue) {
            row = sheet.createRow(bodyRowCount);// 创建一行
            // 每行excel单元格
            for (int i = 0; i < linevalue.length; i++) {
                cell = row.createCell(i);// 创建一个单元格
                cell.setCellStyle(bodyCellStyle);// 给单元格设置样式
                cell.setCellValue(linevalue[i]);// 给单元格设置值
            }

            // 每个sheet显示50000条数据,超过50000创建一个新的sheet页
            if (listExcelValue.size() > currentRowCount && currentRowCount % PERPAGENUM == 0) {
                sheet = null;
                sheetNum++;// 工作薄编号递增1
                sheet = workbook.createSheet(excelName + "(" + sheetNum + ")");// 创建一个新的工作薄
                bodyRowCount = 0;// 正文内容行号置位为0
                writeTitleContent(sheet, titleCellStyle, colwidth, titleNames);// 写入标题
            }
            bodyRowCount++;// 正文内容行号递增1
            currentRowCount++;// 当前行号递增1
        }
        listExcelValue = null;

        ByteArrayOutputStream os = new ByteArrayOutputStream();
        workbook.write(os);
        // String filename = new
        // String(excelFullName.getBytes(Constant.ENCODE_UTF),
        // Constant.ENCODE_IOS8);// 为了解决中文名称乱码问题
        // String filename = excelFullName;
        // String filename = URLEncoder.encode(excelFullName,
        // EncodeCharSet.UTF8.getId());

        HttpHeaders headers = new HttpHeaders();
        headers.setContentDispositionFormData("attachment", excelFullName=java.net.URLEncoder.encode(excelFullName, "UTF-8"));
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        List accessHeaders = new ArrayList<>();
        accessHeaders.add("Content-Disposition");
        headers.setAccessControlExposeHeaders(accessHeaders);
        return new ResponseEntity(os.toByteArray(), headers, HttpStatus.OK);
    }

    
    public static HSSFCellStyle createBodyCellStyle(HSSFWorkbook workbook) {
        HSSFCellStyle cellStyle = workbook.createCellStyle();
        HSSFFont font = workbook.createFont();
        font.setFontHeightInPoints((short) 8);
        font.setFontName(HSSFFont.FONT_ARIAL);// 设置标题字体
        cellStyle.setFont(font);
        cellStyle = workbook.createCellStyle();
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
        return cellStyle;
    }

    
    public static HSSFCellStyle createDateBodyCellStyle(HSSFWorkbook workbook) {
        HSSFCellStyle cellStyle = workbook.createCellStyle();
        HSSFFont font = workbook.createFont();
        font.setFontHeightInPoints((short) 8);
        font.setFontName(HSSFFont.FONT_ARIAL);// 设置标题字体
        cellStyle.setFont(font);
        cellStyle = workbook.createCellStyle();
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
        HSSFDataFormat format = workbook.createDataFormat();
        cellStyle.setDataFormat(format.getFormat("yyyy-mm-dd"));
        return cellStyle;
    }

    
    public static HSSFCellStyle createTitleCellStyle(HSSFWorkbook workbook) {
        HSSFCellStyle cellStyle = workbook.createCellStyle();
        HSSFFont font = workbook.createFont();
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        font.setFontHeightInPoints((short) 8);
        font.setFontName(HSSFFont.FONT_ARIAL);// 设置标题字体
        cellStyle.setFont(font);
        cellStyle = workbook.createCellStyle();
        cellStyle.setFont(font);// 设置列标题样式
        cellStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index);// 设置背景色
        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
        return cellStyle;
    }

    
    public static void writeTitleContent(HSSFSheet sheet, HSSFCellStyle cellStyle, int[] colwidth, String[] titleNames) {
        HSSFRow row = sheet.createRow(0);// 创建一行
        HSSFCell cell = null;
        for (int i = 0; i < titleNames.length; i++) {
            sheet.setColumnWidth(i, colwidth[i]);// 设置列宽
            cell = row.createCell(i);// 创建单元格
            cell.setCellStyle(cellStyle);// 创建单元样式
            cell.setCellValue(titleNames[i]);// 创建单元格内容
        }
    }
}

示例
     @GetMapping(value = "/exports")
     public ResponseEntity exports() throws Exception {
          String excelName = "测试导出";
          // 设置工作薄列宽
          int[] colwidth = { 6000, 6000};
          // 设置工作薄标题行
          String[] titleNames = { "code","中文"};
          // excel 表格内容数组集合
          List listExcelValue = new ArrayList<>();
          // 每一行的内容 转换为字符数组 放入list中
          String[] tablevalue = {"001","点点"};
          listExcelValue.add(tablevalue);
          return ExcelUtil.createExcel(excelName, colwidth, titleNames, listExcelValue);
     }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353680.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号