java excel工具类

本文涉及的产品
数据可视化DataV,5个大屏 1个月
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
简介: java excel工具类

public class ExcelExportUtil {

private static final Logger log = LoggerFactory.getLogger(ExcelExportUtil.class);

/**
 * 导出
 *
 * @param title
 * @param headers
 * @param strArray
 * @param response
 * @throws UnsupportedEncodingException
 */
public static void exportExcel(String title, String[] headers, String[][] strArray, HttpServletResponse response) throws UnsupportedEncodingException {
    ExcelUtil excelUtil = new ExcelUtil();
    excelUtil.exportExcel(title, headers, strArray, response);
}

/**
 * @param workbook
 * @param response
 * @param fileName
 * @throws Exception
 */
public static void exportExcel(Workbook workbook, HttpServletResponse response, String fileName) throws Exception {
    OutputStream os = response.getOutputStream();
    response.reset();
    response.setContentType("application/vnd.ms-excel;charset=utf-8");
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST,PUT,GET,DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "*");
    response.setCharacterEncoding("utf-8");
    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
    workbook.write(os);
    os.flush();
    os.close();
}

/**
 * 导出文件
 *
 * @param response
 * @param file     完整文件路径,包括文件名称
 * @param fileName 文件名称 ,包括后缀
 * @throws Exception
 */
public static void exportExcel(HttpServletResponse response, String file, String fileName) throws Exception {
    //读取文件流
    FileReader fileReader = new FileReader(file);
    File file1 = fileReader.getFile();
    if (null == file1 || !file1.exists()) {
        throw new DoValidException("文件不存在");
    }
    BufferedInputStream inputStream = fileReader.getInputStream();
    Workbook sheets = ExcelExportUtil.chooseFormat(fileName, inputStream);
    exportExcel(sheets, response, fileName);
}

/**
 * 根据 list<t> 数据 导出excel
 *
 * @param response
 * @param data      实际数据
 * @param fileName  文件名称
 * @param sheetName 默认附表名称
 * @throws Exception
 */
public static <E> void exportExcel(HttpServletResponse response, List<E> data, Class<E> clazz, String fileName, String sheetName) throws Exception {
    EasyExcelUtil.exportExcel(response, data, clazz, fileName, sheetName);
}

/**
 * 根据 list<t> 数据 导出excel
 *
 * @param response
 * @param data     实际数据
 * @param fileName 文件名称
 * @throws Exception
 */
public static <E> void exportExcel(HttpServletResponse response, List<E> data, Class<E> clazz, String fileName) throws Exception {
    exportExcel(response, data, clazz, fileName, "sheet");
}

/**
 * 根据 list<t> 数据 导出excel
 * 先写excel,再读取,最后下载导出
 *
 * @param response
 * @param data      实际数据
 * @param fileName  文件名称
 * @param sheetName 默认附表名称
 * @throws Exception
 */
public static <E> void exportExcelByWriterAfter(HttpServletResponse response, List<E> data, Class<E> clazz, String filePath, String fileName, String sheetName) throws Exception {
    EasyExcelUtil.exportExcelByWriterAfter(response, data, clazz, filePath, fileName, sheetName);
}

/**
 * 根据 list<t> 数据 导出excel
 * 先写excel,再读取,最后下载导出
 *
 * @param response
 * @param data     实际数据
 * @param fileName 文件名称
 * @throws Exception
 */
public static <E> void exportExcelByWriterAfter(HttpServletResponse response, List<E> data, Class<E> clazz, String filePath, String fileName) throws Exception {
    exportExcelByWriterAfter(response, data, clazz, filePath, fileName, "sheet");
}

/**
 * 选择EXCEL版本(xls和xlsx)
 *
 * @param file 文件流(上传的文件流)
 * @return EXCEL版本
 * @throws Exception 向上抛出异常
 */
public static Workbook chooseExcelFormat(MultipartFile file) throws Exception {
    if (!FileUploaderManger.verify(file, FileTypeEnum.EXCEL)) {
        throw new DoValidException("不是正确的excel格式");
    }
    String fileName = file.getOriginalFilename();
    return chooseFormat(fileName, file.getInputStream());
}

/**
 * 读取静态文件夹下的模板Excel
 *
 * @param path 模板地址
 * @return EXCEL表格文件
 * @throws Exception 向上抛出异常
 */
public static Workbook readExcelExport(String path) throws Exception {
    Resource resource = new ClassPathResource(path);
    String fileName = resource.getFilename();
    InputStream is = resource.getInputStream();
    return ExcelExportUtil.chooseFormat(fileName, is);
}

/**
 * 选择EXCEL版本
 *
 * @param fileName 文件名
 * @param is       流
 * @return 结果
 * @throws Exception 向上抛出异常
 */
public static Workbook chooseFormat(String fileName, InputStream is) throws Exception {
    Workbook excelFile;
    byte[] buf = IOUtils.toByteArray(is);
    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(buf);
    if (StringUtils.isEmpty(fileName)) {
        throw new DoValidException("文件名不存在");
    }
    String matches = "^.+\\.(?i)(xls)$";
    if (fileName.matches(matches)) {
        excelFile = new HSSFWorkbook(byteArrayInputStream);
    } else {
        excelFile = new XSSFWorkbook(byteArrayInputStream);
    }
    return excelFile;
}

/**
 * 以上一行为模板创建新的行
 *
 * @param sheet    表
 * @param rowNum   第几行
 * @param cellNums 创建列总数
 * @return 返回生成的行
 */
public static Row createRowAndCell(Sheet sheet, int rowNum, int cellNums) {
    Row row = sheet.getRow(rowNum);
    if (row == null) {
        row = sheet.createRow(rowNum);
        for (int j = 0; j <= cellNums; j++) {
            Cell upCell = sheet.getRow(rowNum - 1).getCell(j);
            Cell cell = row.createCell(j);
            cell.setCellStyle(upCell.getCellStyle());
        }
    }
    return row;
}

/**
 * 构造名称管理器和数据验证及公式
 *
 * @param workbook            目标工作簿
 * @param dropDownDataSource  以父级id为key,子级名称列表为value的集合
 * @param dataSourceSheetName 作为数据源的工作表名称
 * @param columnStep          起始列的列号(以下表0为初始列)
 * @param totalLevel          总共的层级数量
 * @throws IOException
 * @throws InvalidFormatException
 */
public static Workbook cascade(Workbook workbook, Map<String, List<String>> dropDownDataSource, final String dataSourceSheetName, final int columnStep, final int totalLevel) throws IOException, InvalidFormatException {

    Sheet dataSourceSheet = workbook.createSheet(dataSourceSheetName);
    workbook.setSheetHidden(workbook.getSheetIndex(dataSourceSheet), true);

    Row headerRow = dataSourceSheet.createRow(0);
    boolean firstTime = true;
    int columnIndex = 0;
    // 构造名称管理器数据源
    for (String key : dropDownDataSource.keySet()) {
        Cell cell = headerRow.createCell(columnIndex);
        cell.setCellValue(key);
        if (dropDownDataSource.get(key) == null || dropDownDataSource.get(key).size() == 0) {
            continue;
        }
        ArrayList<String> values = (ArrayList) dropDownDataSource.get(key);
        int dataRowIndex = 1;
        for (String value : values) {
            Row row = firstTime ? dataSourceSheet.createRow(dataRowIndex) : dataSourceSheet.getRow(dataRowIndex);
            if (row == null) {
                row = dataSourceSheet.createRow(dataRowIndex);
            }
            row.createCell(columnIndex).setCellValue(value);
            dataRowIndex++;
        }

        // 构造名称管理器
        String range = buildRange(columnIndex, 2, values.size());
        Name name = null;
        try {
            name = workbook.createName();
            name.setNameName(key);
        } catch (Exception e) {
            name = workbook.getName(key);
        }
        String formula = dataSourceSheetName + "!" + range;
        name.setRefersToFormula(formula);
        columnIndex++;
        firstTime = false;
    }


    Sheet assetSheet = workbook.getSheetAt(0);
    // 第一级设置DataValidation
    setValidationData(assetSheet, 1, 100, 0 + columnStep, 0 + columnStep, dataSourceSheet.getRow(0).getCell(0).toString());

    // 剩下的层级设置DataValidation
    for (int i = 1; i < totalLevel; i++) {
        char[] offset = new char[1];
        offset[0] = (char) ('A' + columnStep + i - 1);
        String formulaString = buildFormulaString(new String(offset), 1);
        CellRangeAddressList addressList = new CellRangeAddressList(1, 100, 0 + columnStep + i, 0 + columnStep + i);
        DVConstraint dvConstraint = DVConstraint.createFormulaListConstraint(formulaString);
        DataValidation validation = new HSSFDataValidation(addressList, dvConstraint);
        assetSheet.addValidationData(validation);
    }
    return workbook;
}

/**
 * 添加数据有效性检查.
 *
 * @param sheet         要添加此检查的Sheet
 * @param firstRow      开始行
 * @param lastRow       结束行
 * @param firstCol      开始列
 * @param lastCol       结束列
 * @param formulaString 有效性检查的name
 * @throws IllegalArgumentException 如果传入的行或者列小于0(< 0)或者结束行/列比开始行/列小
 */
public static void setValidationData(Sheet sheet, int firstRow, int lastRow, int firstCol, int lastCol, String formulaString) throws IllegalArgumentException {
    if (firstRow < 0 || lastRow < 0 || firstCol < 0 || lastCol < 0 || lastRow < firstRow || lastCol < firstCol) {
        throw new IllegalArgumentException("Wrong Row or Column index : " + firstRow + ":" + lastRow + ":" + firstCol + ":" + lastCol);
    }
    if (sheet instanceof XSSFSheet) {
        XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet) sheet);
        XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint(formulaString);
        CellRangeAddressList addressList = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
        XSSFDataValidation validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, addressList);
        sheet.addValidationData(validation);
    } else if (sheet instanceof HSSFSheet) {
        CellRangeAddressList addressList = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
        DVConstraint dvConstraint = DVConstraint.createFormulaListConstraint(formulaString);
        DataValidation validation = new HSSFDataValidation(addressList, dvConstraint);
        sheet.addValidationData(validation);
    }
}

/**
 * 构造名称引用的数据源区域:
 */
private static String buildRange(int offset, int startRow, int rowCount) {
    char start = (char) ('A' + offset);
    return "$" + start + "$" + startRow + ":$" + start + "$" + (startRow + rowCount - 1);
}

/**
 * 构造indirect公式:
 */
private static String buildFormulaString(String offset, int rowNum) {
    return "INDIRECT($" + offset + (rowNum) + ")";
}

}

相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
10天前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
30 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
15天前
|
Java
Java 些许公共工具类
Java 些许公共工具类
12 1
|
1月前
|
存储 Java
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
42 2
|
18天前
|
Java Apache
Apache POI java对excel表格进行操作(读、写) 有代码!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
25 0
|
2月前
|
缓存 前端开发 Java
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
【8月更文挑战第10天】java基础巩固,工具类的封装
24 1
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
|
2月前
|
Java
Java应用结构规范问题之在UnitConvertUtils工具类将千米转换为米的问题如何解决
Java应用结构规范问题之在UnitConvertUtils工具类将千米转换为米的问题如何解决
|
2月前
|
存储 Java Apache
|
2月前
|
easyexcel Java 关系型数据库
阿里巴巴-EasyExcel 基于Java的简单、省内存的读写Excel
该文章主要介绍了在Java应用中如何使用EasyExcel技术完成对Excel文件的导入和导出操作,包括环境搭建、基本概念、快速入门、进阶操作和综合应用等内容,并提供了相关代码示例和注意事项。
 阿里巴巴-EasyExcel 基于Java的简单、省内存的读写Excel
|
2月前
|
存储 设计模式 安全
Java GenericObjectPool 对象池化技术--SpringBoot sftp 连接池工具类
Java GenericObjectPool 对象池化技术--SpringBoot sftp 连接池工具类
38 0
|
3月前
|
Java 数据安全/隐私保护
Java无模版导出Excel 0基础教程
经常写数据导出到EXCEL,没有模板的情况下使用POI技术。以此作为记录,以后方便使用。 2 工具类 样式工具: 处理工具Java接口 水印工具 导出Excel工具类 3 测试代码 与实际复杂业务不同 在此我们只做模拟 Controller Service 4 导出测试 使用Postman进行接口测试,没接触过Postman的小伙伴可以看我这篇博客Postman导出excel文件保存为文件可以看到导出很成功,包括水印 sheet页名称自适应宽度。还有一些高亮……等功能可以直接搜索使用
Java无模版导出Excel 0基础教程