欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

poi的入门使用,实现excel样式自定义导出,复制即可导出

程序员文章站 2022-07-13 12:35:31
...

poi的入门使用,实现excel样式自定义导出,复制即可导出

使用Java main方法实现导出

本人一枚新手,不专业的地方还请各位大神见谅

复制到java程序运行可以直接导出, (导出内容来自百度),前提是引入poi jar包,我没找到连接,有资源的希望提供一下

  public static void main(String[] args) throws IOException {

        //创建HSSFWorkbook对象
        HSSFWorkbook wb = new HSSFWorkbook();

        // 设置字体样式
        HSSFFont font = wb.createFont();
        // 字体大小
        font.setFontHeightInPoints((short) 30);
        // 字体
        font.setFontName("楷体");
        // 颜色
        font.setColor(HSSFColor.GREEN.index);

        // 设置单元格样式 红色
        HSSFCellStyle rad = wb.createCellStyle();
        rad.setFillForegroundColor(IndexedColors.RED.getIndex());
        rad.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        // 设置单元格样式 绿色
        HSSFCellStyle green = wb.createCellStyle();
        green.setFillForegroundColor(IndexedColors.GREEN.getIndex());
        green.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        // 字体样式
        HSSFCellStyle fond = wb.createCellStyle();
        fond.setFont(font);

        //建立sheet对象 ,取名'成绩表'
        HSSFSheet sheet=wb.createSheet("成绩表");

        //在sheet里创建第一行,参数为行索引
        HSSFRow row1=sheet.createRow(0);
        //创建单元格
        HSSFCell cell=row1.createCell(0);

        //设置单元格内容
        cell.setCellValue("学生成绩表");
        //设置单元格颜色,想要什么颜色就传什么参数, rad || green
        cell.setCellStyle(fond);

        //合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列, 第一列为0,第二列为1
        sheet.addMergedRegion(new CellRangeAddress(0,0,0,3));

        //在sheet里创建第二行
        // 这里要根据实际需求使用for动态生成行(row),我这里做demo就写死了
        HSSFRow row2=sheet.createRow(1);

        //创建单元格并设置单元格内容  row2.createCell(0)创建第二行第一个单元格
        // 这里要根据实际需求使用for动态生成列,也可以自己手写
        HSSFCell cell1 = row2.createCell(0);
        cell1.setCellValue("姓名");
        //一样的设置颜色()
        cell1.setCellStyle(rad);
        // 注意: 上面的写法正确;
        // 错误写法:row2.createCell(0).setCellValue("姓名");
        // ----- :row2.createCell(0).setCellStyle(rad);
        // 影响: 这样等于构建两个单元格,第二个会吧第一个覆盖,所以只会显示颜色,汉字被覆盖

        row2.createCell(1).setCellValue("班级");

        row2.createCell(2).setCellValue("语文成绩");

        row2.createCell(3).setCellValue("数学成绩");

        row2.createCell(4).setCellValue("英语成绩");

        //在sheet里创建第三行

        HSSFRow row3=sheet.createRow(2);

        row3.createCell(0).setCellValue("小明");

        row3.createCell(1).setCellValue("1班");

        row3.createCell(2).setCellValue(80);

        row3.createCell(3).setCellValue(75);

        row3.createCell(4).setCellValue(88);

        HSSFRow row4=sheet.createRow(3);

        row4.createCell(0).setCellValue("小红");

        row4.createCell(1).setCellValue("1班");

        row4.createCell(2).setCellValue(82);

        row4.createCell(3).setCellValue(70);

        row4.createCell(4).setCellValue(90);

        //输出Excel文件, 我本机维护好的demo文件夹,没有这个文件加会报错, System.currentTimeMillis() 一串顺随机数
        String fileName = "D:\\demo\\" + System.currentTimeMillis() + ".xlsx";
        File aa = new File(fileName);
        // 写出文件流
        wb.write(aa);
        // 关闭文件流
        wb.close();
    }

vue加mvc导出

我本地测试没问题,有问题的可以参考上面的程序,思路就是使用response的OutputStream流导出

@PostMapping("/guaExportAll")
    public void download(HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''");
        //创建HSSFWorkbook对象
        HSSFWorkbook wb = new HSSFWorkbook();

        // 设置字体样式
        HSSFFont font = wb.createFont();
        // 字体大小
        font.setFontHeightInPoints((short) 30);
        // 字体
        font.setFontName("楷体");
        // 颜色
        font.setColor(HSSFColor.GREEN.index);

        // 设置单元格样式 红色
        HSSFCellStyle rad = wb.createCellStyle();
        rad.setFillForegroundColor(IndexedColors.RED.getIndex());
        rad.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        // 设置单元格样式 绿色
        HSSFCellStyle green = wb.createCellStyle();
        green.setFillForegroundColor(IndexedColors.GREEN.getIndex());
        green.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        // 字体样式
        HSSFCellStyle fond = wb.createCellStyle();
        fond.setFont(font);

        //建立sheet对象 ,取名'成绩表'
        HSSFSheet sheet=wb.createSheet("成绩表");

        //在sheet里创建第一行,参数为行索引
        HSSFRow row1=sheet.createRow(0);
        //创建单元格
        HSSFCell cell=row1.createCell(0);

        //设置单元格内容
        cell.setCellValue("学生成绩表");
        //设置单元格颜色,想要什么颜色就传什么参数, rad || green
        cell.setCellStyle(fond);

        //合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列, 第一列为0,第二列为1
        sheet.addMergedRegion(new CellRangeAddress(0,0,0,3));

        //在sheet里创建第二行
        // 这里要根据实际需求使用for动态生成行(row),我这里做demo就写死了
        HSSFRow row2=sheet.createRow(1);

        //创建单元格并设置单元格内容  row2.createCell(0)创建第二行第一个单元格
        // 这里要根据实际需求使用for动态生成列,也可以自己手写
        HSSFCell cell1 = row2.createCell(0);
        cell1.setCellValue("姓名");
        //一样的设置颜色()
        cell1.setCellStyle(rad);
        // 注意: 上面的写法正确;
        // 错误写法:row2.createCell(0).setCellValue("姓名");
        // ----- :row2.createCell(0).setCellStyle(rad);
        // 影响: 这样等于构建两个单元格,第二个会吧第一个覆盖,所以只会显示颜色,汉字被覆盖

        row2.createCell(1).setCellValue("班级");

        row2.createCell(2).setCellValue("语文成绩");

        row2.createCell(3).setCellValue("数学成绩");

        row2.createCell(4).setCellValue("英语成绩");

        //在sheet里创建第三行

        HSSFRow row3=sheet.createRow(2);

        row3.createCell(0).setCellValue("小明");

        row3.createCell(1).setCellValue("1班");

        row3.createCell(2).setCellValue(80);

        row3.createCell(3).setCellValue(75);

        row3.createCell(4).setCellValue(88);

        HSSFRow row4=sheet.createRow(3);

        row4.createCell(0).setCellValue("小红");

        row4.createCell(1).setCellValue("1班");

        row4.createCell(2).setCellValue(82);

        row4.createCell(3).setCellValue(70);

        row4.createCell(4).setCellValue(90);

        wb.write(response.getOutputStream());
        wb.close();
    }

这里附上前端代码,框架是 Ant Design of Vue

<a-button @click="downLoadExcel">导出</a-button>

import 导入的路径要与自己的项目对应

    import { downLoadExcelAll } from '@/views/demo/expor'
// 导出方法
            downLoadExcel () {
                downLoadExcelAll({
                    url: '/demo/download',
                    fileName: '导出.xlsx' })
            }
import request from '@/utils/request'

export const downLoadExcelAll = ({ url, data, fileName = 'download.xlsx' }) => {
    fileName += fileName.indexOf('.xlsx') > -1 ? '' : '.xlsx'
    request({ url, method: 'post', responseType: 'arraybuffer', data }).then(res => {
        const blob = new Blob([res], { type: 'application/msexcel' })
        if ('download' in document.createElement('a')) {
            // 非IE下载
            const elink = document.createElement('a')
            elink.download = fileName
            elink.style.display = 'none'
            elink.href = URL.createObjectURL(blob)
            document.body.appendChild(elink)
            elink.click()
            URL.revokeObjectURL(elink.href) // 释放URL 对象
            document.body.removeChild(elink)
        } else {
            // IE10+下载
            navigator.msSaveBlob(blob, fileName)
        }
    })
}
import axios from 'axios'

// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 180000, // request timeout
  validateStatus: function (status) {
    // `validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject  promise 。
    // 如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 否则,promise 将被 rejecte
    // return status >= 200 && status < 300; // 默认的
    return true
  }
})

后面会更新导出数据库内容的方法 及导入

相关标签: java poi