导出工具类
package com. yutu. garden. utils ; import com. baomidou. mybatisplus. core. toolkit. ObjectUtils ;
import org. apache. commons. io. IOUtils ;
import org. apache. poi. hssf. util. HSSFColor ;
import org. apache. poi. xssf. usermodel. XSSFWorkbook ;
import org. slf4j. Logger ;
import org. slf4j. LoggerFactory ;
import org. apache. poi. hssf. usermodel. * ;
import org. apache. poi. ss. usermodel. * ;
import org. springframework. core. io. ResourceLoader ;
import org. springframework. stereotype. Component ;
import org. springframework. web. multipart. MultipartFile ; import javax. annotation. Resource ;
import javax. servlet. ServletOutputStream ;
import javax. servlet. http. HttpServletRequest ;
import javax. servlet. http. HttpServletResponse ;
import java. io. * ;
import java. net. URLEncoder ;
import java. nio. charset. StandardCharsets ;
import java. text. DecimalFormat ;
import java. text. SimpleDateFormat ;
import java. util. ArrayList ;
import java. util. Date ;
import java. util. List ;
@Component
public class ExcelUtils { @Resource private ResourceLoader resourceLoader; private static Logger log = LoggerFactory . getLogger ( ExcelUtils . class ) ; static { System . setProperty ( "java.awt.headless" , "true" ) ; } public static void setTitle ( HSSFSheet sheet, String [ ] str, int startNum, Short height, HSSFCellStyle style, Integer [ ] widths, int width) { try { HSSFRow row = sheet. createRow ( startNum) ; if ( ObjectUtils . isEmpty ( height) ) { height = ( short ) ( 20 * 20 ) ; } row. setHeight ( height) ; HSSFCell cell; for ( int j = 0 ; j < str. length; j++ ) { cell = row. createCell ( j) ; if ( ObjectUtils . isNotEmpty ( widths) && ObjectUtils . isNotEmpty ( widths[ j] ) ) { sheet. setColumnWidth ( j, widths[ j] ) ; } else { sheet. autoSizeColumn ( j) ; int colWidth = sheet. getColumnWidth ( j) * width / 10 ;
sheet. setColumnWidth ( j, colWidth) ; } cell. setCellValue ( str[ j] ) ; cell. setCellStyle ( style) ; } } catch ( Exception e) { e. printStackTrace ( ) ; } } public static void setTitle ( HSSFSheet sheet, List < String > str, int startNum, Short height, HSSFCellStyle style, Integer [ ] widths) { try { HSSFRow row = sheet. createRow ( startNum) ; if ( ObjectUtils . isEmpty ( height) ) { height = ( short ) ( 20 * 20 ) ; } row. setHeight ( height) ; HSSFCell cell; for ( int j = 0 ; j < str. size ( ) ; j++ ) { cell = row. createCell ( j) ; if ( ObjectUtils . isNotEmpty ( widths) && ObjectUtils . isNotEmpty ( widths[ j] ) ) { sheet. setColumnWidth ( j, widths[ j] ) ; } else { sheet. autoSizeColumn ( j) ; sheet. setColumnWidth ( j, sheet. getColumnWidth ( j) * 30 / 10 ) ; } cell. setCellValue ( str. get ( j) ) ; cell. setCellStyle ( style) ; } } catch ( Exception e) { e. printStackTrace ( ) ; } } public static void setData ( HSSFSheet sheet, List < Object [ ] > data, int startNum, HSSFCellStyle style) { try { int rowNum = startNum+ 1 ; for ( int i = 0 ; i < data. size ( ) ; i++ ) { HSSFRow row = sheet. createRow ( rowNum) ; for ( int j = 0 ; j < data. get ( i) . length; j++ ) { HSSFCell cell = row. createCell ( j) ; if ( ObjectUtils . isEmpty ( data. get ( i) [ j] ) ) { cell. setCellValue ( "" ) ; } else { cell. setCellValue ( data. get ( i) [ j] . toString ( ) ) ; } cell. setCellStyle ( style) ; } rowNum++ ; } } catch ( Exception e) { e. printStackTrace ( ) ; } } public static void setDataByList ( HSSFSheet sheet, List < List < Object > > data, int startNum) { try { int rowNum = startNum+ 1 ; for ( int i = 0 ; i < data. size ( ) ; i++ ) { HSSFRow row = sheet. createRow ( rowNum) ; for ( int j = 0 ; j < data. get ( i) . size ( ) ; j++ ) { if ( ObjectUtils . isEmpty ( data. get ( i) . get ( j) ) ) { row. createCell ( j) . setCellValue ( "" ) ; } else { row. createCell ( j) . setCellValue ( data. get ( i) . get ( j) . toString ( ) ) ; } } rowNum++ ; } } catch ( Exception e) { e. printStackTrace ( ) ; } } public static void setBrowser ( HttpServletResponse response, HSSFWorkbook workbook, String fileName) { try { String name = URLEncoder . encode ( fileName, "UTF-8" ) ; response. setHeader ( "Content-Disposition" , "attachment;filename=\"" + name + "\".xlsx;filename*=utf-8''" + name + ".xlsx" ) ; OutputStream os = new BufferedOutputStream ( response. getOutputStream ( ) ) ; response. setContentType ( "application/vnd.ms-excel" ) ; response. setCharacterEncoding ( "utf-8" ) ; workbook. write ( os) ; os. flush ( ) ; os. close ( ) ; } catch ( Exception e) { e. printStackTrace ( ) ; } } public static HSSFCellStyle getStyleByCENTER ( HSSFWorkbook workbook, int size) { HSSFCellStyle style = workbook. createCellStyle ( ) ; HSSFFont font = workbook. createFont ( ) ; font. setBold ( true ) ; font. setFontName ( "宋体" ) ; font. setFontHeightInPoints ( ( short ) size) ; style. setFont ( font) ; style. setAlignment ( HorizontalAlignment . CENTER ) ; style. setVerticalAlignment ( VerticalAlignment . CENTER ) ; style. setDataFormat ( HSSFDataFormat . getBuiltinFormat ( "m/d/yy h:mm" ) ) ; return style; } public static HSSFCellStyle getStyleByBorder ( HSSFWorkbook workbook, int size, boolean isText) { HSSFCellStyle style = workbook. createCellStyle ( ) ; HSSFFont font = workbook. createFont ( ) ; if ( ! isText) { font. setBold ( true ) ; } font. setFontName ( "宋体" ) ; font. setFontHeightInPoints ( ( short ) size) ; style. setFont ( font) ; style. setAlignment ( HorizontalAlignment . CENTER ) ; style. setVerticalAlignment ( VerticalAlignment . CENTER ) ; style. setDataFormat ( HSSFDataFormat . getBuiltinFormat ( "m/d/yy h:mm" ) ) ; style. setBorderBottom ( BorderStyle . THIN ) ; style. setBorderLeft ( BorderStyle . THIN ) ; style. setBorderTop ( BorderStyle . THIN ) ; style. setBorderRight ( BorderStyle . THIN ) ; return style; } public static HSSFCellStyle getDataStyle ( HSSFWorkbook workbook, int size, boolean isSetBold, HSSFColor. HSSFColorPredefined background) { HSSFCellStyle style = workbook. createCellStyle ( ) ; HSSFFont font = workbook. createFont ( ) ; font. setBold ( isSetBold) ; font. setFontName ( "宋体" ) ; font. setFontHeightInPoints ( ( short ) size) ; style. setFont ( font) ; if ( ObjectUtils . isNotEmpty ( background) ) { style. setFillPattern ( FillPatternType . SOLID_FOREGROUND ) ; style. setFillForegroundColor ( background. getIndex ( ) ) ; } return style; } public static List < String > getExcelData ( MultipartFile file, int startRow, Integer endRow) { int resultSize = 0 ; ArrayList < String > resultData = new ArrayList < > ( resultSize) ; try { if ( ! checkFile ( file) ) { log. error ( "上传的excel文件格式有问题" ) ; return resultData; } Workbook workbook = getWorkBook ( file) ; if ( ObjectUtils . isNotEmpty ( workbook) ) { Sheet sheet = workbook. getSheetAt ( 0 ) ; if ( ObjectUtils . isEmpty ( sheet) ) { return resultData; } resultSize = sheet. getLastRowNum ( ) + 1 ; int firstRowNum = sheet. getFirstRowNum ( ) ; int lastRowNum = sheet. getLastRowNum ( ) ; if ( ObjectUtils . isNotEmpty ( endRow) ) { lastRowNum = endRow; } for ( int rowNum = firstRowNum + startRow; rowNum <= lastRowNum; rowNum++ ) { Row row = sheet. getRow ( rowNum) ; if ( rowIsEmpty ( row) ) { break ; } int firstCellNum = row. getFirstCellNum ( ) ; int lastCellNum = row. getLastCellNum ( ) ; StringBuilder stringBuffer = new StringBuilder ( ) ; for ( int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++ ) { Cell cell = row. getCell ( cellNum) ; String cellValue = getCellValue ( cell) ; stringBuffer. append ( getCellValue ( cell) ) . append ( ",&" ) ; } resultData. add ( stringBuffer. toString ( ) ) ; } workbook. close ( ) ; } } catch ( IOException e) { e. printStackTrace ( ) ; } return resultData; } public static boolean checkFile ( MultipartFile file) throws IOException { if ( null == file) { log. error ( "文件不存在!" ) ; return false ; } String fileName = file. getOriginalFilename ( ) ; if ( ObjectUtils . isEmpty ( fileName) || ( ! fileName. endsWith ( "xls" ) && ! fileName. endsWith ( "xlsx" ) ) ) { log. error ( fileName + "不是excel文件" ) ; return false ; } return true ; } public static Workbook getWorkBook ( MultipartFile file) { String fileName = file. getOriginalFilename ( ) ; Workbook workbook = null ; try { InputStream is = file. getInputStream ( ) ; if ( ObjectUtils . isNotEmpty ( fileName) ) { if ( fileName. endsWith ( "xls" ) ) { workbook = new HSSFWorkbook ( is) ; } else if ( fileName. endsWith ( "xlsx" ) ) { workbook = new XSSFWorkbook ( is) ; } } } catch ( IOException e) { log. error ( e. getMessage ( ) ) ; } return workbook; } public static String getCellValue ( Cell cell) { String cellValue = "" ; if ( cell == null ) { return cellValue; } switch ( cell. getCellTypeEnum ( ) ) { case NUMERIC : cellValue = stringDateProcess ( cell) ; break ; case STRING : cellValue = String . valueOf ( cell. getStringCellValue ( ) ) ; break ; case BOOLEAN : cellValue = String . valueOf ( cell. getBooleanCellValue ( ) ) ; break ; case FORMULA : cellValue = String . valueOf ( cell. getCellFormula ( ) ) ; break ; case BLANK : cellValue = "" ; break ; case ERROR : cellValue = "非法字符" ; break ; default : cellValue = "未知类型" ; break ; } return cellValue; } public static String stringDateProcess ( Cell cell) { String result = new String ( ) ; if ( HSSFDateUtil . isCellDateFormatted ( cell) ) { SimpleDateFormat sdf = null ; if ( cell. getCellStyle ( ) . getDataFormat ( ) == HSSFDataFormat . getBuiltinFormat ( "h:mm" ) ) { sdf = new SimpleDateFormat ( "HH:mm" ) ; } else { sdf = new SimpleDateFormat ( "yyyy-MM-dd hh:mm:ss" ) ; } Date date = cell. getDateCellValue ( ) ; result = sdf. format ( date) ; } else if ( cell. getCellStyle ( ) . getDataFormat ( ) == 58 ) { SimpleDateFormat sdf = new SimpleDateFormat ( "yyyy-MM-dd hh:mm:ss" ) ; double value = cell. getNumericCellValue ( ) ; Date date = org. apache. poi. ss. usermodel. DateUtil. getJavaDate ( value) ; result = sdf. format ( date) ; } else { double value = cell. getNumericCellValue ( ) ; CellStyle style = cell. getCellStyle ( ) ; DecimalFormat format = new DecimalFormat ( ) ; String temp = style. getDataFormatString ( ) ; if ( "General" . equals ( temp) ) { int decimalPlaces = countDecimalPlaces ( value) ; StringBuilder pattern = new StringBuilder ( "#." ) ; for ( int i = 0 ; i < decimalPlaces; i++ ) { pattern. append ( "#" ) ; } format. applyPattern ( pattern. toString ( ) ) ; } result = format. format ( value) ; } return result; } public static int countDecimalPlaces ( double value) { String stringValue = Double . toString ( value) ; int integerPlaces = stringValue. indexOf ( '.' ) ; return stringValue. length ( ) - integerPlaces - 1 ; } public static boolean rowIsEmpty ( Row row) { if ( null == row) { return true ; } for ( int c = row. getFirstCellNum ( ) ; c < row. getLastCellNum ( ) ; c++ ) { Cell cell = row. getCell ( c) ; if ( cell != null && cell. getCellTypeEnum ( ) != CellType . BLANK ) { return false ; } } return true ; } public void downloadTemplate ( HttpServletResponse response, HttpServletRequest request, String filename, String path) throws IOException { InputStream inputStream = null ; ServletOutputStream servletOutputStream = null ; try { org. springframework. core. io. Resource resource = resourceLoader. getResource ( "classpath:" + path) ; response. setContentType ( "application/vnd.ms-excel" ) ; response. addHeader ( "Cache-Control" , "no-cache, no-store, must-revalidate" ) ; response. addHeader ( "charset" , "utf-8" ) ; response. addHeader ( "Pragma" , "no-cache" ) ; String encodeName = URLEncoder . encode ( filename, StandardCharsets . UTF_8 . toString ( ) ) ; response. setHeader ( "Content-Disposition" , "attachment; filename=\"" + encodeName + "\"; filename*=utf-8''" + encodeName) ; inputStream = resource. getInputStream ( ) ; servletOutputStream = response. getOutputStream ( ) ; IOUtils . copy ( inputStream, servletOutputStream) ; response. flushBuffer ( ) ; } catch ( Exception e) { e. printStackTrace ( ) ; } finally { try { if ( servletOutputStream != null ) { servletOutputStream. close ( ) ; } if ( inputStream != null ) { inputStream. close ( ) ; } System . gc ( ) ; } catch ( Exception e) { e. printStackTrace ( ) ; } } }
}
控制层接口
package com. yutu. garden. controller ; import com. yutu. garden. utils. ExcelUtilsWP ;
import io. swagger. annotations. Api ;
import io. swagger. annotations. ApiOperation ;
import org. springframework. web. bind. annotation. GetMapping ;
import org. springframework. web. bind. annotation. RequestMapping ;
import org. springframework. web. bind. annotation. RestController ; import javax. annotation. Resource ;
import javax. servlet. http. HttpServletRequest ;
import javax. servlet. http. HttpServletResponse ;
import java. io. IOException ; @RestController
@RequestMapping ( "excel" )
@Api ( tags = "Excel模板下载" )
public class ExcelTemplateController { @Resource private ExcelUtilsWP excelUtils; @ApiOperation ( "下载苗木计划清单模板" ) @GetMapping ( "/downloadPunishTemplate" ) public void downloadPunishTemplate ( HttpServletResponse response, HttpServletRequest request) throws IOException { String filename = "苗木计划清单模板.xlsx" ; String path = "template/苗木计划清单模板.xlsx" ; excelUtils. downloadTemplate ( response, request, filename, path) ; }
}
Excel模板存放位置