Java导出Excel
POI简介
前言:文章尾部有4.1.0版本,含有读取、生成和兼容Excel的工具类,3.6和3.17版本了解即可
POI简介:Jakarta POI 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,在各种组件中目前只有用于操作Excel的HSSF相对成熟。
官方主页http://poi.apache.org/index.html,
API文档http://poi.apache.org/apidocs/index.html
引入pom
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.6</version> </dependency> 或者 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency>
Jakarta POI HSSF API组件:
HSSF(用于操作Excel的组件)提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,有以下几种常用的对象:
常用组件:
HSSFWorkbook excel的文档对象
HSSFSheet excel的表单
HSSFRow excel的行
HSSFCell excel的格子单元
HSSFFont excel字体
样式:
HSSFCellStyle cell样式
基本操作步骤:
首先,我们应该要知道的是,一个Excel文件对应一个workbook,一个workbook中有多个sheet组成,一个sheet是由多个行(row)和列(cell)组成。那么我们用poi要导出一个Excel表格
的正确顺序应该是:
1、用HSSFWorkbook打开或者创建“Excel文件对象”
2、用HSSFWorkbook对象返回或者创建Sheet对象
3、用Sheet对象返回行对象,用行对象得到Cell对象
4、对Cell对象读写。
5、将生成的HSSFWorkbook放入HttpServletResponse中响应到前端页面
3.6版本的Excel工具类:
package com.example.demo.utils; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; /** * @author 谢辉 * @Classname ExcelUtil * @Description TODO * @Date 2020/12/9 18:29 */ public class ExcelUtil { /** * 导出Excel * * @param sheetName sheet名称 * @param title 标题 * @param values 内容 * @param wb HSSFWorkbook对象 * @return */ public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) { // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 if (wb == null) { wb = new HSSFWorkbook(); } // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet HSSFSheet sheet = wb.createSheet(sheetName); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 HSSFRow row = sheet.createRow(0); // 第四步,创建单元格,并设置值表头 设置表头居中 HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式 //声明列对象 HSSFCell cell = null; //创建标题 for (int i = 0; i < title.length; i++) { cell = row.createCell(i); cell.setCellValue(title[i]); cell.setCellStyle(style); } //创建内容 for (int i = 0; i < values.length; i++) { row = sheet.createRow(i + 1); for (int j = 0; j < values[i].length; j++) { //将内容按顺序赋给对应的列对象 row.createCell(j).setCellValue(values[i][j]); } } return wb; } }
3.17版本的Excel工具类:
package com.resafety.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; /** * @author 谢辉 * @Classname XiehExcelUtil * @Description TODO * @Date 2020/12/9 18:34 */ public class ExcelUtilX { /** * 导出Excel * * @param sheetName sheet名称 * @param title 标题 * @param data 内容 * @param wb Workbook对象: 如果是.xls文件的请传入HSSFWorkbook对象类型 * 如果是.xlsx文件的请传入XSSFWorkbook对象类型 默认使用HSSFWorkbook对象类型 * @return */ public static Workbook getHSSFWorkbook(String sheetName, String[] title, String[][] data, Workbook wb) { // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 if (wb == null) { // 默认使用兼容.xls文件的 wb = new HSSFWorkbook(); } // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet Sheet sheet = wb.createSheet(sheetName); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 Row row = sheet.createRow(0); // 第四步,创建单元格,并设置值表头 设置表头居中 CellStyle style = wb.createCellStyle(); // 水平居中 style.setAlignment(HorizontalAlignment.CENTER); // 垂直居中 // style.setVerticalAlignment(VerticalAlignment.CENTER); // 声明列对象 Cell cell = null; // 创建标题 for (int i = 0; i < title.length; i++) { cell = row.createCell(i); cell.setCellValue(title[i]); cell.setCellStyle(style); } // 创建内容 for (int i = 0; i < data.length; i++) { row = sheet.createRow(i + 1); for (int j = 0; j < data[i].length; j++) { // 将内容按顺序赋给对应的列对象 row.createCell(j).setCellValue(data[i][j]); } } return wb; } /** * 导出Excel * * @param sheetName sheet名称 * @param title 标题 * @param data 内容 * @param wb Workbook对象: 如果是.xls文件的请传入HSSFWorkbook对象类型 * 如果是.xlsx文件的请传入XSSFWorkbook对象类型 默认使用HSSFWorkbook对象类型 * @return */ public static Workbook getHSSFWorkbook(String sheetName, List<ExcelUtilX.TitileBean> title, List<Map<String, Object>> data, Workbook wb) { // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 if (wb == null) { wb = new HSSFWorkbook(); } if (title == null || title.size() <= 0) { throw new IllegalArgumentException("传入的title参数有问题"); } if (data == null) { data = new ArrayList<Map<String, Object>>(); } if (data.size() > 0) { Map<String, Object> map = data.get(0); if (map.size() != title.size()) { throw new IllegalArgumentException("传入的title列数和实际数据列数不一致!"); } } // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet Sheet sheet = wb.createSheet(sheetName); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 Row row = sheet.createRow(0); // 第四步,创建单元格,并设置值表头 设置表头居中 CellStyle style = wb.createCellStyle(); // 水平居中 style.setAlignment(HorizontalAlignment.CENTER); // 垂直居中 // style.setVerticalAlignment(VerticalAlignment.CENTER); // 声明列对象 Cell cell = null; int titleLength = title.size(); // 创建标题 for (int i = 0; i < titleLength; i++) { cell = row.createCell(i); cell.setCellValue(title.get(i).getName()); cell.setCellStyle(style); } // 创建内容 for (int i = 0; i < data.size(); i++) { row = sheet.createRow(i + 1); for (int j = 0; j < titleLength; j++) { // 将内容按顺序赋给对应的列对象 Cell tempCell = row.createCell(j); // 这里为了代码清晰,每一步都写出来 Map<String, Object> map = data.get(i); Object objectValue = map.get(title.get(j).getId()); tempCell.setCellValue(objectValue.toString()); // tempCell.setCellStyle(style); } } return wb; } /** * 导出Excel * * @param sheetName sheet名称 * @param data 内容 * @param wb Workbook对象: 如果是.xls文件的请传入HSSFWorkbook对象类型 * 如果是.xlsx文件的请传入XSSFWorkbook对象类型 默认使用HSSFWorkbook对象类型 * @return */ public static Workbook getHSSFWorkbook(String sheetName, List<LinkedHashMap<String, Object>> data, Workbook wb) { // 创建title List<String> title = new ArrayList<String>(); // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 if (wb == null) { wb = new HSSFWorkbook(); } if (data == null) { data = new ArrayList<LinkedHashMap<String, Object>>(); } if (data.size() > 0) { // 因为LinkedHashMap保存了插入时的顺序 LinkedHashMap<String, Object> linkedHashMap = data.get(0); Set<Entry<String, Object>> entrySet = linkedHashMap.entrySet(); for (Entry<String, Object> entry : entrySet) { // 保存title,使用key值作为title title.add(entry.getKey()); } } // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet Sheet sheet = wb.createSheet(sheetName); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 Row row = sheet.createRow(0); // 第四步,创建单元格,并设置值表头 设置表头居中 CellStyle style = wb.createCellStyle(); // 水平居中 style.setAlignment(HorizontalAlignment.CENTER); // 垂直居中 // style.setVerticalAlignment(VerticalAlignment.CENTER); // 声明列对象 Cell cell = null; int titleLength = title.size(); // 创建标题 for (int i = 0; i < titleLength; i++) { cell = row.createCell(i); cell.setCellValue(title.get(i)); cell.setCellStyle(style); } // 创建内容 for (int i = 0; i < data.size(); i++) { row = sheet.createRow(i + 1); for (int j = 0; j < titleLength; j++) { // 将内容按顺序赋给对应的列对象 Cell tempCell = row.createCell(j); // 这里为了代码清晰,每一步都写出来 Map<String, Object> map = data.get(i); Object objectValue = map.get(title.get(j)); tempCell.setCellValue(objectValue.toString()); // tempCell.setCellStyle(style); } } return wb; } /** * 读取Excel数据,简单的行列数据(数据表格式),不适用复杂的数据 * * @param excelPath 文件路径 * @return 表格数据 * @throws IOException */ public static List<Map<String, Object>> readExcel(String excelPath) throws IOException { Workbook wb = null; InputStream is = new FileInputStream(excelPath); int indexPoint = excelPath.lastIndexOf("."); String suffixName = ""; if (indexPoint != -1) { suffixName = excelPath.substring(indexPoint + 1); System.out.println("后缀名是:" + suffixName); } // 根据文件后缀(xls/xlsx)进行判断 if ("xls".equalsIgnoreCase(suffixName)) { wb = new HSSFWorkbook(is); } else if ("xlsx".equalsIgnoreCase(suffixName)) { wb = new XSSFWorkbook(is); } else { throw new IllegalArgumentException("文件类型错误!"); } List<Map<String, Object>> data = new ArrayList<Map<String, Object>>(); List<String> keys = new ArrayList<String>(); // 遍历sheet页 for (int numSheet = 0, sheetLength = wb.getNumberOfSheets(); numSheet < sheetLength; numSheet++) { Sheet hssfSheet = wb.getSheetAt(numSheet); if (hssfSheet == null) { continue; } // 开始遍历行 if (hssfSheet.getLastRowNum() > 0) { // 使用第一行作为key Row row = hssfSheet.getRow(0); for (int i = row.getFirstCellNum(), keyNum = row.getLastCellNum(); i < keyNum; i++) { keys.add(row.getCell(i).getStringCellValue()); } // 遍历数据行(除去第一行,下标从1开始) for (int j = hssfSheet.getFirstRowNum() + 1, k = hssfSheet.getLastRowNum(); j <= k; j++) { Map<String, Object> map = new LinkedHashMap<String, Object>(); // 遍历每个列 for (int index = hssfSheet.getRow(j).getFirstCellNum(), cellLength = hssfSheet.getRow(j) .getLastCellNum(); index < cellLength; index++) { map.put(keys.get(index), getValue(hssfSheet.getRow(j).getCell(index))); } // 存放数据 data.add(map); } } // 行结束 } // sheet页for结束 return data; } private static String getValue(Cell hssfCell) { if (hssfCell.getCellTypeEnum() == CellType.BOOLEAN) { // 返回布尔类型的值 return String.valueOf(hssfCell.getBooleanCellValue()); } else if (hssfCell.getCellTypeEnum() == CellType.NUMERIC) { // 返回数值类型的值 // return String.valueOf(hssfCell.getNumericCellValue()); return numOfImport(hssfCell); } else if (hssfCell.getCellTypeEnum() == CellType.BLANK) { // 返回空值 return ""; } else { // 返回字符串类型的值 return String.valueOf(hssfCell.getStringCellValue()); } } /** * 数字转换字符串 * * @param cell * @return */ private static String numOfImport(Cell cell) { String value = cell.toString(); if (cell.getCellTypeEnum() == CellType.STRING) {// 字符串类型 return value; } else { String[] str = value.split("\\."); if (str.length > 1) { String str1 = str[1]; int m = Integer.parseInt(str1); if (m == 0) { return str[0]; } else { return value; } } else { return value; } } } public static class TitileBean { private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "TitileBean [id=" + id + ", name=" + name + "]"; } } }
关于poi3.17居中的问题
用到poi居中的3.6版本写法都是这样的:
HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
然后设置到cell中就不多说啦
这样是不行的
poi3.17正确的写法:
//水平居中 cellStyle.setAlignment(HorizontalAlignment.CENTER); //垂直居中 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
后面略..
4.1.0版本Excel工具类升级版(增加xls、xlsx格式兼容和读取Excel功能)推荐使用此版本
pom文件:
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.0</version> </dependency>
工具类:
package com.example.demo.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; /** * @author 谢辉 * @Classname XiehExcelUtil * @Description TODO * @Date 2020/12/9 18:34 */ public class ExcelUtilX { /** * 导出Excel * * @param sheetName sheet名称 * @param title 标题 * @param data 内容 * @param wb Workbook对象: * 如果是.xls文件的请传入HSSFWorkbook对象类型 * 如果是.xlsx文件的请传入XSSFWorkbook对象类型 * 默认使用HSSFWorkbook对象类型 * @return */ public static Workbook getHSSFWorkbook(String sheetName, String[] title, String[][] data, Workbook wb) { // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 if (wb == null) { // 默认使用兼容.xls文件的 wb = new HSSFWorkbook(); } // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet Sheet sheet = wb.createSheet(sheetName); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 Row row = sheet.createRow(0); // 第四步,创建单元格,并设置值表头 设置表头居中 CellStyle style = wb.createCellStyle(); // 水平居中 style.setAlignment(HorizontalAlignment.CENTER); // 垂直居中 // style.setVerticalAlignment(VerticalAlignment.CENTER); // 声明列对象 Cell cell = null; // 创建标题 for (int i = 0; i < title.length; i++) { cell = row.createCell(i); cell.setCellValue(title[i]); cell.setCellStyle(style); } // 创建内容 for (int i = 0; i < data.length; i++) { row = sheet.createRow(i + 1); for (int j = 0; j < data[i].length; j++) { // 将内容按顺序赋给对应的列对象 row.createCell(j).setCellValue(data[i][j]); } } return wb; } /** * 导出Excel * * @param sheetName sheet名称 * @param title 标题 * @param data 内容 * @param wb Workbook对象: * 如果是.xls文件的请传入HSSFWorkbook对象类型 * 如果是.xlsx文件的请传入XSSFWorkbook对象类型 * 默认使用HSSFWorkbook对象类型 * @return */ public static Workbook getHSSFWorkbook(String sheetName, List<ExcelUtilX.TitileBean> title, List<Map<String, Object>> data, Workbook wb) { // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 if (wb == null) { wb = new HSSFWorkbook(); } if (title == null || title.size() <= 0) { throw new IllegalArgumentException("传入的title参数有问题"); } if (data == null) { data = new ArrayList<Map<String, Object>>(); } if (data.size() > 0) { Map<String, Object> map = data.get(0); if (map.size() != title.size()) { throw new IllegalArgumentException("传入的title列数和实际数据列数不一致!"); } } // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet Sheet sheet = wb.createSheet(sheetName); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 Row row = sheet.createRow(0); // 第四步,创建单元格,并设置值表头 设置表头居中 CellStyle style = wb.createCellStyle(); // 水平居中 style.setAlignment(HorizontalAlignment.CENTER); // 垂直居中 // style.setVerticalAlignment(VerticalAlignment.CENTER); // 声明列对象 Cell cell = null; int titleLength = title.size(); // 创建标题 for (int i = 0; i < titleLength; i++) { cell = row.createCell(i); cell.setCellValue(title.get(i).getName()); cell.setCellStyle(style); } // 创建内容 for (int i = 0; i < data.size(); i++) { row = sheet.createRow(i + 1); for (int j = 0; j < titleLength; j++) { // 将内容按顺序赋给对应的列对象 Cell tempCell = row.createCell(j); // 这里为了代码清晰,每一步都写出来 Map<String, Object> map = data.get(i); Object objectValue = map.get(title.get(j).getId()); tempCell.setCellValue(objectValue.toString()); // tempCell.setCellStyle(style); } } return wb; } /** * 导出Excel * * @param sheetName sheet名称 * @param data 内容 * @param wb Workbook对象: * 如果是.xls文件的请传入HSSFWorkbook对象类型 * 如果是.xlsx文件的请传入XSSFWorkbook对象类型 * 默认使用HSSFWorkbook对象类型 * @return */ public static Workbook getHSSFWorkbook(String sheetName, List<LinkedHashMap<String, Object>> data, Workbook wb) { // 创建title List<String> title = new ArrayList<String>(); // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 if (wb == null) { wb = new HSSFWorkbook(); } if (data == null) { data = new ArrayList<LinkedHashMap<String, Object>>(); } if (data.size() > 0) { // 因为LinkedHashMap保存了插入时的顺序 LinkedHashMap<String, Object> linkedHashMap = data.get(0); Set<Entry<String, Object>> entrySet = linkedHashMap.entrySet(); for (Entry<String, Object> entry : entrySet) { // 保存title,使用key值作为title title.add(entry.getKey()); } } // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet Sheet sheet = wb.createSheet(sheetName); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 Row row = sheet.createRow(0); // 第四步,创建单元格,并设置值表头 设置表头居中 CellStyle style = wb.createCellStyle(); // 水平居中 style.setAlignment(HorizontalAlignment.CENTER); // 垂直居中 // style.setVerticalAlignment(VerticalAlignment.CENTER); // 声明列对象 Cell cell = null; int titleLength = title.size(); // 创建标题 for (int i = 0; i < titleLength; i++) { cell = row.createCell(i); cell.setCellValue(title.get(i)); cell.setCellStyle(style); } // 创建内容 for (int i = 0; i < data.size(); i++) { row = sheet.createRow(i + 1); for (int j = 0; j < titleLength; j++) { // 将内容按顺序赋给对应的列对象 Cell tempCell = row.createCell(j); // 这里为了代码清晰,每一步都写出来 Map<String, Object> map = data.get(i); Object objectValue = map.get(title.get(j)); tempCell.setCellValue(objectValue.toString()); // tempCell.setCellStyle(style); } } return wb; } /** * 读取Excel数据,简单的行列数据(数据表格式),不适用复杂的数据 * * @param excelPath 文件路径 * @return 表格数据 * @throws IOException */ public static List<Map<String, Object>> readExcel(String excelPath) throws IOException { Workbook wb = null; InputStream is = new FileInputStream(excelPath); int indexPoint = excelPath.lastIndexOf("."); String suffixName = ""; if (indexPoint != -1) { suffixName = excelPath.substring(indexPoint + 1); System.out.println("后缀名是:" + suffixName); } //根据文件后缀(xls/xlsx)进行判断 if ("xls".equalsIgnoreCase(suffixName)) { wb = new HSSFWorkbook(is); } else if ("xlsx".equalsIgnoreCase(suffixName)) { wb = new XSSFWorkbook(is); } else { throw new IllegalArgumentException("文件类型错误!"); } List<Map<String, Object>> data = new ArrayList<Map<String, Object>>(); List<String> keys = new ArrayList<String>(); // 遍历sheet页 for (int numSheet = 0, sheetLength = wb.getNumberOfSheets(); numSheet < sheetLength; numSheet++) { Sheet hssfSheet = wb.getSheetAt(numSheet); if (hssfSheet == null) { continue; } // 开始遍历行 if (hssfSheet.getLastRowNum() > 0) { // 使用第一行作为key Row row = hssfSheet.getRow(0); for (int i = row.getFirstCellNum(), keyNum = row.getLastCellNum(); i < keyNum; i++) { keys.add(row.getCell(i).getStringCellValue()); } // 遍历数据行(除去第一行,下标从1开始) for (int j = hssfSheet.getFirstRowNum() + 1, k = hssfSheet.getLastRowNum(); j <= k; j++) { Map<String, Object> map = new LinkedHashMap<String, Object>(); // 遍历每个列 for (int index = hssfSheet.getRow(j) .getFirstCellNum(), cellLength = hssfSheet.getRow(j) .getLastCellNum(); index < cellLength; index++) { map.put(keys.get(index), getValue(hssfSheet.getRow(j).getCell(index))); } // 存放数据 data.add(map); } } // 行结束 } // sheet页for结束 return data; } private static String getValue(Cell hssfCell) { if (hssfCell.getCellType() == CellType.BOOLEAN) { // 返回布尔类型的值 return String.valueOf(hssfCell.getBooleanCellValue()); } else if (hssfCell.getCellType() == CellType.NUMERIC) { // 返回数值类型的值 //return String.valueOf(hssfCell.getNumericCellValue()); return numOfImport(hssfCell); } else if (hssfCell.getCellType() == CellType.BLANK) { // 返回空值 return ""; } else { // 返回字符串类型的值 return String.valueOf(hssfCell.getStringCellValue()); } } /** * 数字转换字符串 * * @param cell * @return */ private static String numOfImport(Cell cell) { String value = cell.toString(); if (cell.getCellType() == CellType.STRING) {//字符串类型 return value; } else { String[] str = value.split("\\."); if (str.length > 1) { String str1 = str[1]; int m = Integer.parseInt(str1); if (m == 0) { return str[0]; } else { return value; } } else { return value; } } } public static class TitileBean { private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "TitileBean [id=" + id + ", name=" + name + "]"; } } }
测试代码:
controller:
package com.example.demo.controller; import com.example.demo.utils.ExcelUtil; import com.example.demo.utils.ExcelUtilX; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.util.*; /** * @author 谢辉 * @Classname XiehController * @Description TODO * @Date 2020/12/9 18:00 */ @Controller @RequestMapping(value = "/xieh") public class XiehController { @RequestMapping(value = "/export") @ResponseBody public void export(HttpServletRequest request, HttpServletResponse response) throws Exception { List<ExcelUtilX.TitileBean> title = new ArrayList<>(); ExcelUtilX.TitileBean titileBean1 = new ExcelUtilX.TitileBean(); ExcelUtilX.TitileBean titileBean2 = new ExcelUtilX.TitileBean(); titileBean1.setId("name"); titileBean1.setName("名字"); titileBean2.setId("age"); titileBean2.setName("年龄"); title.add(titileBean1); title.add(titileBean2); List<Map<String, Object>> data = new ArrayList<>(); Map<String, Object> map = new HashMap<>(); map.put("name", "谢辉"); map.put("age", 23); data.add(map); //excel文件名 String fileName = "学生信息表.xls"; //sheet名 String sheetName = "学生信息表"; //创建HSSFWorkbook Workbook wb = ExcelUtilX.getHSSFWorkbook(sheetName, title, data, null); //响应到客户端 try { this.setResponseHeader(response, fileName); OutputStream os = response.getOutputStream(); wb.write(os); os.flush(); os.close(); } catch (Exception e) { e.printStackTrace(); } } @RequestMapping(value = "/export2") @ResponseBody public void export2(HttpServletRequest request, HttpServletResponse response) throws Exception { List<LinkedHashMap<String, Object>> data = new ArrayList<>(); LinkedHashMap<String, Object> map = new LinkedHashMap<>(); map.put("name", "谢辉"); map.put("age", 23); data.add(map); //excel文件名 String fileName = "学生信息表2.xlsx"; //sheet名 String sheetName = "学生信息表"; //创建HSSFWorkbook Workbook wb = ExcelUtilX.getHSSFWorkbook(sheetName, data, new XSSFWorkbook()); //响应到客户端 try { this.setResponseHeader(response, fileName); OutputStream os = response.getOutputStream(); wb.write(os); os.flush(); os.close(); } catch (Exception e) { e.printStackTrace(); } } @RequestMapping(value = "/export3") @ResponseBody public void export3(HttpServletRequest request, HttpServletResponse response) throws Exception { //获取数据 // List<PageData> list = reportService.bookList(page); List<Map<String, String>> list = new ArrayList<>(); Map<String, String> map1 = new LinkedHashMap<String, String>(); map1.put("stuName", "谢辉"); map1.put("stuSex", "男"); map1.put("stuAge", "23"); map1.put("stuSchoolName", "小学"); map1.put("stuClassName", "2"); list.add(map1); //excel标题 String[] title = {"名称", "性别", "年龄", "学校", "班级"}; // 内容 String[][] content = new String[list.size()][title.length]; //excel文件名 String fileName = "学生信息表3.xlsx"; //sheet名 String sheetName = "学生信息表"; for (int i = 0; i < list.size(); i++) { Map<String, String> obj = list.get(i); content[i][0] = obj.get("stuName"); content[i][1] = obj.get("stuSex"); content[i][2] = obj.get("stuAge"); content[i][3] = obj.get("stuSchoolName"); content[i][4] = obj.get("stuClassName"); } //创建HSSFWorkbook //HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null); Workbook wb = ExcelUtilX.getHSSFWorkbook(sheetName, title, content, new XSSFWorkbook()); //响应到客户端 try { this.setResponseHeader(response, fileName); OutputStream os = response.getOutputStream(); wb.write(os); os.flush(); os.close(); } catch (Exception e) { e.printStackTrace(); } } //发送响应流方法 private void setResponseHeader(HttpServletResponse response, String fileName) { try { try { fileName = new String(fileName.getBytes(), "ISO8859-1"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } response.setContentType("application/octet-stream;charset=ISO8859-1"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); response.addHeader("Pargam", "no-cache"); response.addHeader("Cache-Control", "no-cache"); } catch (Exception ex) { ex.printStackTrace(); } } }
test:
package com.example.demo; import com.example.demo.utils.ExcelUtilX; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.io.IOException; import java.util.List; import java.util.Map; @SpringBootTest class DemoApplicationTests { @Test void contextLoads() throws IOException { String p1 = "D:\\学生信息表2.xlsx"; List<Map<String, Object>> maps1 = ExcelUtilX.readExcel(p1); String p2 = "D:\\学生信息表3.xlsx"; List<Map<String, Object>> maps2 = ExcelUtilX.readExcel(p2); String p3 = "D:\\学生信息表.xls"; List<Map<String, Object>> maps3 = ExcelUtilX.readExcel(p3); System.out.println(maps1.toString()); System.out.println(maps2.toString()); System.out.println(maps3.toString()); } }
前端使用:
$(".Excel").click(function() { window.location.href = basePath + "/xieh/export"; });
结语:
Excel工具类供参考,可以自己拓展~~~~
码云地址:https://gitee.com/xieh-gitee/SpringBootExcleQRcode