导出
/**
*
* @param request
* @param response
* @param titles 表头行
* @param datas 数据
* @param fileName 文件名
* @throws IOException
*/
public void exportExcel(HttpServletRequest request, HttpServletResponse response,List<String> titles,List<ExcelData>datas,String fileName) throws IOException {
//创建工作簿
XSSFWorkbook wb=new XSSFWorkbook();
//创建工作表
XSSFSheet sheet = wb.createSheet();
//设置默认行宽
sheet.setDefaultColumnWidth(20);
//创建输出流
OutputStream outputStream=null;
//最终文件名
String finalFileName=fileName==null?String.valueOf(System.currentTimeMillis()):fileName;
//第一行创建表头元素
XSSFRow title = sheet.createRow(0);
//设置表头元素
for (int i=0;i<titles.size();i++){
XSSFCell cell = title.createCell(i);
cell.setCellValue(titles.get(i));
}
//写入数据
int a=1;
for (int j=0;j<datas.size();j++) {
XSSFRow row = sheet.createRow(a++);
ExcelData excelData = datas.get(j);
//写入表头对应的数据
for (int i = 0; i < titles.size(); i++) {
XSSFCell cell = row.createCell(i);
if (i==0){
cell.setCellValue(excelData.getName());
}else if (i==1){
cell.setCellValue(excelData.getCode());
}
}
}
//导出数据
try {
// response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;Filename=" + finalFileName+ ".xlsx");
outputStream=response.getOutputStream();
wb.write(outputStream);
}catch (Exception e){
e.printStackTrace();
throw new IOException("导出Excel异常:"+e.getMessage());
}finally {
if (outputStream!=null){
outputStream.flush();
outputStream.close();
}
if (wb!=null){
wb.close();
}
}
}
导出的时候,如果数据的类型不是String字符串,那么我们最好将其转换成String类型
if (valueObject instanceof String) {
//取出的数据是字符串直接赋值
value = (String) map.get(heardKey[j]);
} else if (valueObject instanceof Integer) {
//取出的数据是Integer
value = String.valueOf(((Integer) (valueObject)).floatValue());
} else if (valueObject instanceof BigDecimal) {
## 标题 //取出的数据是BigDecimal
value = String.valueOf(((BigDecimal) (valueObject)).floatValue());
} else {
value = valueObject.toString();
}
导入
public void inputExcel(MultipartFile file)throws Exception{
//判断文件是否为空
if (file.isEmpty()){
throw new NullPointerException("上传失败,文件为空!");
}
//获取文件名
String originalFilename = file.getOriginalFilename();
//获取后缀
String fileType = originalFilename.substring(originalFilename.lastIndexOf(".") + 1, originalFilename.length());
//获取输入流
InputStream inputStream = file.getInputStream();
Workbook wb = null;
//Excel数据
List<ExcelData>dataList=new ArrayList<>();
try {
//判断excel版本
if (XLS.equals(fileType)) {
wb = new HSSFWorkbook(inputStream);
} else if (XLSX.equals(fileType)) {
wb = new XSSFWorkbook(inputStream);
} else {
// 无效后缀名称,这里之能保证excel的后缀名称,不能保证文件类型正确,不过没关系,在创建Workbook的时候会校验文件格式
throw new IllegalArgumentException("Invalid excel version");
}
// 解析sheet
for (int i = 0; i < wb.getNumberOfSheets(); i++) {
//获取sheet
Sheet sheet = wb.getSheetAt(i);
//获取总行数
int rowCount=sheet.getPhysicalNumberOfRows();
//遍历每一行,+1是为了除去表头
for (int r=sheet.getFirstRowNum()+1;r<rowCount;r++){
Row row = sheet.getRow(r);
if (row == null) {
continue;
}
if (row.getFirstCellNum() < 0) {
continue;
}
ExcelData data=new ExcelData();
//获取总列数
int cellCount = row.getPhysicalNumberOfCells();
// 解析sheet 的列
for (int k = 0; k < cellCount; k++) {
Cell cell = row.getCell(k);
getCellValue(data,k, cell);
}
dataList.add(data);
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (inputStream!=null){
inputStream.close();
}
if (wb!=null){
wb.close();
}
}
dataList.stream().forEach(x-> System.out.println(x));
}
private ExcelData getCellValue(ExcelData data,int num, Cell cell) {
int cellType = cell.getCellType();
String cellValue = null;
switch(cellType) {
case Cell.CELL_TYPE_STRING: //文本
cellValue = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_NUMERIC: //数字、日期
if(DateUtil.isCellDateFormatted(cell)) {
cellValue = sdf.format(cell.getDateCellValue()); //日期型
}
else {
cellValue = String.valueOf(cell.getNumericCellValue()); //数字
if(cellValue.endsWith(".0")) {
cellValue = cellValue.substring(0, cellValue.length()-2);
}
}
break;
case Cell.CELL_TYPE_BOOLEAN: //布尔型
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_BLANK: //空白
cellValue = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_ERROR: //错误
cellValue = "错误";
break;
case Cell.CELL_TYPE_FORMULA: //公式
cellValue = "错误";
break;
default:
cellValue = "错误";
}
cellValue = cellValue.trim();
if (num==0){
data.setName(cellValue);
}else if (num==1){
data.setCode(cellValue);
}
return data;
}