java poi 导入导出excel_java中利用poi导入导出Excel表格

本文介绍了如何在Java中使用POI库进行Excel文件的导入和导出。提供了创建Excel表格的工具类`ExcelUtils`,包括设置标题、列宽、单元格样式等功能,并展示了读取Excel文件的方法,适用于数据处理场景。
摘要由CSDN通过智能技术生成

java中利用poi导入导出Excel表格

最近多次用到,以此做记录。

需要用到的jar包

这里我贴出了pom,需要jar的朋友可以自行下载,或留言给我。

org.apache.poi

poi

3.17

org.apache.poi

poi-ooxml

3.17

编写工具类,导入导出Excel

import org.apache.poi.hssf.usermodel.*;

import org.apache.poi.ss.usermodel.CellType;

import org.apache.poi.ss.usermodel.HorizontalAlignment;

import org.apache.poi.ss.util.CellRangeAddress;

import org.apache.poi.xssf.usermodel.XSSFCell;

import org.apache.poi.xssf.usermodel.XSSFRow;

import org.apache.poi.xssf.usermodel.XSSFSheet;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;

import java.io.FileInputStream;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/**

* Excel导入导出工具类

*/

public class ExcelUtilss {

/**

* 构建一个Excel表格

*/

public static HSSFWorkbook createExcel(Map> map, String[] str, String title) {

//创建一个HSSFWorkbook

//这个将构建一个新的Excel文件

HSSFWorkbook wb = new HSSFWorkbook();

//在HSSFWorkbook中添加有一个HSSFSheet

//构建一个新的工作簿

//并命名

HSSFSheet sheet = wb.createSheet("工作簿一");

/**

*构建一个标题行

*/

//创建单元格对象

HSSFCellStyle styleTitle = wb.createCellStyle();

//将单元格的格式设置为居中

styleTitle.setAlignment(HorizontalAlignment.CENTER);

//创建一个字体格式

HSSFFont font = wb.createFont();

//设置字体格式

font.setFontHeightInPoints((short) 20);

//将这个字体放入到单元格对象中

styleTitle.setFont(font);

//创建工作簿的标题行

//CellRangeAddress参数 1起始行号 2终止行号 3起始列号 4终止列号

sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 11));

//声明标题开始行

HSSFRow row = sheet.createRow(0);

//创建一个单元格

HSSFCell hssfCell = row.createCell(0);

//写入标题内容

hssfCell.setCellValue(title);

//将上面声明的标题单元格样式放入单元格

hssfCell.setCellStyle(styleTitle);

//创建正文单元格对象

//创建单元格对象

HSSFCellStyle style = wb.createCellStyle();

//设置单元格样式居中

style.setAlignment(HorizontalAlignment.CENTER);

//指定列宽

sheet.setDefaultColumnWidth(20);

//声明正文开始行,这里剔除了标题行

HSSFRow row1 = sheet.createRow(2);

//创建正文单元格

//这里写入单元格标题行

//读取传入的数组

HSSFCell cell = null;

for (int x = 0; x < str.length; x++) {

cell = row1.createCell((short) x);

cell.setCellValue(str[x]);

cell.setCellStyle(style);

}

//写入实体数据,map中list数据的顺序必须和数组str中的顺序一致

int i = 2;

HSSFCell cel = null;

//单元格样式对象

HSSFCellStyle sty = wb.createCellStyle();

//循环读取传入的集合对象

for (String st : map.keySet()) {

//设置行

row1 = sheet.createRow(i + 1);

//获取map中的list

List list = map.get(st);

//创建单元格,并设置值

for (int j = 0; j < str.length; j++) {

//判断,根据自己的业务逻辑调整,进行日期转换

if (j == 0 || j == 13 || j == 14 || j == 15) {

cel = row.createCell((short) j);

cel.setCellType(CellType.NUMERIC);

cel.setCellValue(list.get(j));

//更改excel单元格自定义日期格式

HSSFDataFormat format = wb.createDataFormat();

sty.setDataFormat(format.getFormat("M月d日"));

cel.setCellStyle(sty);

} else {

//创建单元格

cel = row1.createCell((short) j);

//写入值

cel.setCellValue(list.get(j));

//写入样式

cel.setCellStyle(style);

}

}

//迭代行

i++;

}

return wb;

}

/**

* 读取excel文件

*

* @param file 读取的文件对象

* @return

* @throws Exception

*/

public static List> readExcel(File file) throws Exception {

//打开需要读取的文件

FileInputStream inputStream = new FileInputStream(file);

//读取工作簿

XSSFWorkbook wordBook = new XSSFWorkbook(inputStream);

//读取工作表,从0开始

XSSFSheet sheet = wordBook.getSheetAt(0);

//存储数据集合

List> mapList = new ArrayList>();

//存储单元格标题数据

Map stringMap = new HashMap();

//获取表格内容的最后一行的行数,获得循环次数

int lastRowNum = sheet.getLastRowNum();

//循环按行读取数据

for (int i = 0; i <= lastRowNum; i++) {

//存储单行数据集合

Map map = new HashMap();

//读取第i行

XSSFRow row = sheet.getRow(i);

//获取每一行的最后一列的列号,即总列数,循环次数

int columnNum = row.getLastCellNum();

//循环读取单行数据

for (int j = 0; j < columnNum; j++) {

//读取弟j个单元格对象

XSSFCell cell = row.getCell(j);

//设置单元格的数据类型数据类型

cell.setCellType(CellType.STRING);

//读取单元格的值

String value = cell.getStringCellValue();

//第一行是存储表头数据

if (i == 0) {

//单元格值

stringMap.put(j, value);

} else {

//否则存储表头对应单元格数据

map.put(stringMap.get(j), value);

}

}

if (i != 0) {

//将一行数据存入集合

mapList.add(map);

}

}

//关闭输入流

inputStream.close();

//关闭工作簿

wordBook.close();

return mapList;

}

}

工具类的使用

导出时:需要传入三个参数

Map> map:是导出的数据

String[] str:单元格的标题数组

map集合中存储的String键值为标识当前数据处于哪一行,list数据则根据str数组的顺序存储对应的数据,一个list数据标识一行。

String title:工作簿的标题数据

导出文件后的下载输出

//通过工具类获取到了一个文件对象

HSSFWorkbook wb = ExcelUtilss.createExcel(map, str, title);

// 下载表格

OutputStream os = null;

try {

// 创建一个普通输出流

os = response.getOutputStream();

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String fileName = formatter.format(new Date());

// 请求浏览器打开下载窗口

response.reset();

response.setCharacterEncoding("UTF-8");

// Content-disposition 告诉浏览器以下载的形式打开

String header = request.getHeader("User-Agent").toUpperCase();

if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) {

fileName = URLEncoder.encode(fileName, "utf-8");

fileName = fileName.replace("+", "%20"); // IE下载文件名空格变+号问题

} else {

fileName = new String(fileName.getBytes(), "ISO8859-1");

}

response.setHeader("Content-Disposition", "attachment; filename=" + fileName);// 要保存的文件名

response.setContentType("application/vnd.ms-excel");

response.setHeader("Access-Control-Allow-Origin", "*");

// 直接用数组缓冲输出流输出

wb.write(os);

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

os.close();

} catch (IOException e) {

e.printStackTrace();

}

}

导入时将前端MultipartFile文件转换为File

File excelFile = MultipartFileToFile.multipartFileToFile(uploadImage);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值