springboot中poi使用操作方法

在項目中,有很多對excel的操作,大都數(shù)時候我們都會使用poi工具類,本文將介紹poi的一些使用方法。
1.poi導(dǎo)入excel,并展示數(shù)據(jù)
使用poi導(dǎo)入excel,解析后返回List數(shù)據(jù)到前臺展示。
/**
*
* (讀入excel文件,解析后返回)
* @param file(文件類型)
* @throws IOException
* @return List<String[]>
*/
public static List<String[]> readExcel(MultipartFile file)
throws IOException {
// 檢查文件
checkFile(file);
// 獲得Workbook工作薄對象
Workbook workbook = getWorkBook(file);
// 創(chuàng)建返回對象,把每行中的值作為一個數(shù)組,所有行作為一個集合返回
List<String[]> list = new ArrayList<String[]>();
if (workbook != null) {
for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++ ) {
// 獲得當前sheet工作表
Sheet sheet = workbook.getSheetAt(sheetNum);
if (sheet == null) {
continue;
}
// 獲得當前sheet的開始行
int firstRowNum = sheet.getFirstRowNum();
// 獲得當前sheet的結(jié)束行
int lastRowNum = sheet.getLastRowNum();
// 循環(huán)除了第一行的所有行
for (int rowNum = firstRowNum + 1; rowNum <= lastRowNum; rowNum++ ) {
// 獲得當前行
Row row = sheet.getRow(rowNum);
if (row == null) {
continue;
}
// 獲得當前行的開始列
int firstCellNum = row.getFirstCellNum();
// 獲得當前行的列數(shù)
int lastCellNum = row.getLastCellNum();
String[] cells = new String[row.getLastCellNum()];
// 循環(huán)當前行
for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++ ) {
Cell cell=row.getCell(cellNum, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL);
cells[cellNum] = getCellValue(cell);
}
list.add(cells);
}
}
}
return list;
}
/**
*
* (判斷文件)
* @param file
* @throws IOException
* @return void
*/
public static void checkFile(MultipartFile file)
throws IOException {
// 判斷文件是否存在
if (null == file) {
throw new FileNotFoundException("文件不存在!");
}
// 獲得文件名
String fileName = file.getOriginalFilename();
// 判斷文件是否是excel文件
if (!fileName.endsWith(XLS_TYPE) && !fileName.endsWith(XLSX_TYPE)) {
throw new IOException(fileName + "不是excel文件");
}
}
public static String getCellValue(Cell cell) {
String cellValue = "";
if (cell == null) {
return cellValue;
}
// 把數(shù)字當成String來讀,避免出現(xiàn)1讀成1.0的情況
if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
cell.setCellType(Cell.CELL_TYPE_STRING);
}
// 判斷數(shù)據(jù)的類型
switch (cell.getCellType()) {
// 數(shù)字
case Cell.CELL_TYPE_NUMERIC:
cellValue = String.valueOf(cell.getNumericCellValue());
break;
// 字符串
case Cell.CELL_TYPE_STRING:
cellValue = String.valueOf(cell.getStringCellValue());
break;
// Boolean
case Cell.CELL_TYPE_BOOLEAN:
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
// 公式
case Cell.CELL_TYPE_FORMULA:
cellValue = String.valueOf(cell.getCellFormula());
break;
// 空值
case Cell.CELL_TYPE_BLANK:
cellValue = "";
break;
// 故障
case Cell.CELL_TYPE_ERROR:
cellValue = "非法字符";
break;
default:
cellValue = "未知類型";
break;
}
return cellValue;
}
/**
*
* (getWorkBook:(創(chuàng)建WorkBook對象))
* @param file
* @return
* @return Workbook
*/
public static Workbook getWorkBook(MultipartFile file) {
// 獲得文件名
String fileName = file.getOriginalFilename();
// 創(chuàng)建Workbook工作薄對象,表示整個excel
Workbook workbook = null;
try {
// 獲取excel文件的io流
InputStream is = file.getInputStream();
// 根據(jù)文件后綴名不同(xls和xlsx)獲得不同的Workbook實現(xiàn)類對象
if (fileName.endsWith(XLS_TYPE)) {
// 2003
workbook = new HSSFWorkbook(is);
}
else if (fileName.endsWith(XLSX_TYPE)) {
// 2007
workbook = new XSSFWorkbook(is);
}
}
catch (IOException e) {
e.printStackTrace();
}
return workbook;
}2.poi導(dǎo)出excel并以web下載方式保存excel
將數(shù)據(jù)庫中的數(shù)據(jù)組裝成excel并導(dǎo)出,并在web下載欄中直接下載。
/**
* 人員導(dǎo)出
*
* @param sysSysUserVO
* @throws IOException
*/
@PostMapping("/exportUser")
@ApiOperation(value = "導(dǎo)出人員excel", notes = "導(dǎo)出人員excel")
public void
exportUser(@ApiParam(name = "人員id", value = "人員id", required = false) @RequestBody List<SysUserVO> sysSysUserVO)
throws IOException {
List<SysUserVO> middleList = new ArrayList<>();
// 查詢用戶詳細信息
for (SysUserVO sysUserVO : sysSysUserVO) {
List<SysUserVO> resultListSysUser = sysUserService.querySysUserAll(sysUserVO);
userInfoUtil.completionInformation(resultListSysUser.get(0));
middleList.add(resultListSysUser.get(0));
}
// excle格式
String[] headers = {"用戶名", "姓名", "密碼", "啟動狀態(tài)", "崗位", "角色", "所屬部門", "手機", "郵箱", "身份證號"};
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
// 設(shè)置列寬
sheet.setDefaultColumnWidth((short)18);
HSSFRow row = sheet.createRow(0);
for (short i = 0; i < headers.length; i++) {
// 創(chuàng)建單元格,每行多少數(shù)據(jù)就創(chuàng)建多少個單元格
HSSFCell cell = row.createCell(i);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
// 給單元格設(shè)置內(nèi)容
cell.setCellValue(text);
}
for (int j = 0; j < middleList.size(); j++) {
SysUserVO export = middleList.get(j);
// 從第二行開始填充數(shù)據(jù)
row = sheet.createRow(j + 1);
List<String> datas = new ArrayList<>();
String userName = export.getUsername();
String trueName = export.getTureName();
String password = export.getPassword();
String status = String.valueOf(export.getIsEnabled());
String postName = export.getPostName();
String roleName = export.getRoleName();
String organName = export.getOrganizationName();
String phone = export.getMobile();
String email = export.getEmail();
String identityCard = export.getIdentityCard();
datas.add(userName);
datas.add(trueName);
datas.add(password);
datas.add(status);
datas.add(postName);
datas.add(roleName);
datas.add(organName);
datas.add(phone);
datas.add(email);
datas.add(identityCard);
for (int k = 0; k < datas.size(); k++) {
String string = datas.get(k);
HSSFCell cell = row.createCell(k);
HSSFRichTextString richString = new HSSFRichTextString(string);
HSSFFont font3 = workbook.createFont();
// 定義Excel數(shù)據(jù)顏色,這里設(shè)置為藍色
font3.setColor(HSSFColor.BLUE.index);
richString.applyFont(font3);
cell.setCellValue(richString);
}
}
String fileName = "人員導(dǎo)出.xls";
// 導(dǎo)出
HttpServletResponse response =
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
RequestAttributes requsetAttributes = RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes)requsetAttributes).getRequest();
// 獲得瀏覽器代理信息
final String userAgent = request.getHeader("USER-AGENT");
// 判斷瀏覽器代理并分別設(shè)置響應(yīng)給瀏覽器的編碼格式
if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "Trident")) {
// IE瀏覽器
fileName = URLEncoder.encode(fileName, "UTF-8");
} else if (StringUtils.contains(userAgent, "Mozilla")) {
// google,火狐瀏覽器
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
} else {
// 其他瀏覽器
fileName = URLEncoder.encode(fileName, "UTF-8");// 其他瀏覽器
}
// 設(shè)置HTTP響應(yīng)頭
response.reset();
// 重置 如果不在頁面上顯示而是下載下來 則放開注釋
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
OutputStream os = response.getOutputStream();
workbook.write(os);
os.close();
}3.poi導(dǎo)出并以流方式保存excel
將數(shù)據(jù)庫中的數(shù)據(jù)組裝成excel并導(dǎo)出,并以數(shù)據(jù)流方式存在指定的路徑。
public class BarcodeExportlFlow implements IBarcodeExport {
@Autowired
BarcodeManageBatchSerivce barcodeManageBatchSerivce;
@Override
public OutputStream exportData() throws IOException {
//查詢批次碼
BarcodeBatchManageBo input = new BarcodeBatchManageBo();
List<BarcodeBatchManageBo> middleList = barcodeManageBatchSerivce.selectBatch(input);
String[] headers = {"id", "條碼批次碼", "激活狀態(tài)", "有效狀態(tài)", "導(dǎo)入人", "導(dǎo)入時間", "激活人", "激活時間", "作廢人", "作廢時間", "本批次條數(shù)"};
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
//設(shè)置列寬
sheet.setDefaultColumnWidth((short) 18);
HSSFRow row = sheet.createRow(0);
for (short i = 0; i < headers.length; i++) {
//創(chuàng)建單元格,每行多少數(shù)據(jù)就創(chuàng)建多少個單元格
HSSFCell cell = row.createCell(i);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
//給單元格設(shè)置內(nèi)容
cell.setCellValue(text);
}
for (int j = 0; j < middleList.size(); j++) {
BarcodeBatchManageBo export = middleList.get(j);
//從第二行開始填充數(shù)據(jù)
row = sheet.createRow(j + 1);
List<String> datas = new ArrayList<>();
String id = export.getId().toString();
String batchCode = export.getBatchCode();
String activationStatus = export.getActivationStatus();
String effectiveStatus = export.getEffectiveStatus();
datas.add(id);
datas.add(batchCode);
datas.add(activationStatus);
datas.add(effectiveStatus);
for (int k = 0; k < datas.size(); k++) {
String string = datas.get(k);
HSSFCell cell = row.createCell(k);
HSSFRichTextString richString = new HSSFRichTextString(string);
HSSFFont font3 = workbook.createFont();
//定義Excel數(shù)據(jù)顏色,這里設(shè)置為藍色
font3.setColor(HSSFColor.BLUE.index);
richString.applyFont(font3);
cell.setCellValue(richString);
}
}
FileOutputStream fos = new FileOutputStream("D:/wb.xls");
workbook.write(fos);
fos.close();
return null;
}
}到此這篇關(guān)于springboot中poi操作合集的文章就介紹到這了,更多相關(guān)springboot poi操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot中使用?POI的示例代碼
- SpringBoot EasyPoi動態(tài)導(dǎo)入導(dǎo)出的兩種方式實現(xiàn)方法詳解
- SpringBoot如何基于POI-tl和word模板導(dǎo)出龐大的Word文件
- SpringBoot集成POI實現(xiàn)Excel導(dǎo)入導(dǎo)出的示例詳解
- SpringBoot?AOP?@Pointcut切入點表達式排除某些類方式
- springboot?aop里的@Pointcut()的配置方式
- springboot中EasyPoi實現(xiàn)自動新增序號的方法
- 淺談springboot之JoinPoint的getSignature方法
- SpringBoot中使用JeecgBoot的Autopoi導(dǎo)出Excel的方法步驟
相關(guān)文章
SpringBoot的Admin服務(wù)監(jiān)控詳解
這篇文章主要介紹了SpringBoot的Admin服務(wù)監(jiān)控詳解,Spring Boot Admin(SBA)是一個開源的社區(qū)項目,用于管理和監(jiān)控 Spring Boot 應(yīng)用程序,需要的朋友可以參考下2024-01-01
應(yīng)用Java泛型和反射導(dǎo)出CSV文件的方法
這篇文章主要介紹了應(yīng)用Java泛型和反射導(dǎo)出CSV文件的方法,通過一個自定義函數(shù)結(jié)合泛型與反射的應(yīng)用實現(xiàn)導(dǎo)出CSV文件的功能,具有一定的參考借鑒價值,需要的朋友可以參考下2014-12-12
Java 數(shù)據(jù)結(jié)構(gòu)之刪除鏈表中重復(fù)的結(jié)點
在一個排序的鏈表中,會存在重復(fù)的結(jié)點,如何實現(xiàn)刪除該鏈表中重復(fù)的結(jié)點,重復(fù)的結(jié)點不保留,并返回鏈表頭指針呢?接下來小編將帶你詳細介紹2021-12-12
Struts2通過自定義標簽實現(xiàn)權(quán)限控制的方法
這篇文章主要介紹了Struts2通過自定義標簽實現(xiàn)權(quán)限控制的方法,介紹了定義Struts2的自定義標簽的三個步驟以及詳細解釋,需要的朋友可以參考下。2017-09-09
Spring Boot 整合mybatis 與 swagger2
之前使用springMVC+spring+mybatis,總是被一些繁瑣的xml配置,還經(jīng)常出錯,下面把以前的一些ssm項目改成了spring boot + mybatis,相對于來說優(yōu)點太明顯了,具體內(nèi)容詳情大家通過本文學(xué)習(xí)吧2017-08-08

