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
}
})