使用zip壓縮包上傳excel文件的優點
1、體積更小,節約帶寬2、比excel直接讀取更方便攜帶參數及修改3、可以一次性批量導入
Java代碼
Controller
@PostMapping ( "/importData" ) @ApiOperationSupport ( order = 3 ) @ApiOperation ( value = "上傳" ) public R importData ( @RequestParam MultipartFile file, @RequestParam ( "versionId" ) String versionId) { try { dataTableFjService. importDataSheets ( file, versionId) ; } catch ( Exception e) { log. error ( "上傳文件接口" , e) ; return R . fail ( "上傳文件接口異常" ) ; } return R . success ( "上傳成功" ) ; }
Service
void importDataSheets ( MultipartFile file, String dataManagementId, String versionId) ;
Impl
@Transactional ( rollbackFor = Exception . class )
public void importDataSheets ( MultipartFile file, String versionId) throws IOException { if ( file. isEmpty ( ) ) { throw new ServiceException ( "上傳文件為空" ) ; } DataVersionFj dataVersion = dataVersionFjService. getById ( versionId) ; if ( Func . isEmpty ( dataVersion) ) { throw new ServiceException ( "未查詢到版本信息" ) ; } @Cleanup ZipInputStream zipInputStream = new ZipInputStream ( file. getInputStream ( ) , Charset . forName ( "GBK" ) ) ; ZipEntry entry = zipInputStream. getNextEntry ( ) ; while ( entry != null ) { if ( ! entry. isDirectory ( ) ) { String entryName = entry. getName ( ) ; if ( entryName. contains ( "/" ) ) { entryName = entryName. split ( "/" ) [ 1 ] ; } if ( ! isExcelFile ( entryName) ) { throw new ServiceException ( "文件類型有誤" ) ; } byte [ ] fileBytes = IOUtils . toByteArray ( zipInputStream) ; @Cleanup InputStream is = new ByteArrayInputStream ( fileBytes) ; applicationContext. getBean ( XXXImpl . class ) . processExcelFile ( dataVersion, entryName, is) ; } zipInputStream. closeEntry ( ) ; entry = zipInputStream. getNextEntry ( ) ; } ……
}
@Transactional ( rollbackFor = Exception . class )
public void processExcelFile ( DataVersionFj dataVersion, String fileName, InputStream zipInputStream) { Workbook workbook = null ; try { workbook = fileName. endsWith ( "xlsx" ) ? new XSSFWorkbook ( zipInputStream) : new HSSFWorkbook ( zipInputStream) ; } catch ( Exception e) { e. printStackTrace ( ) ; throw new ServiceException ( "[" + fileName + "],文件打開失敗,請核對文件內容" ) ; } String [ ] tableNames = fileName. split ( "[.]" ) ; TableNameEnum tableNameEnum = TableNameEnum . getByName ( tableNames[ 0 ] ) ; List < String > fieldMeaningNames = null ; List < String > fieldMeaningNames2 = null ; List < String > fieldMeaningNames3 = null ; Sheet dataSheet = workbook. getSheetAt ( 0 ) ; int dataRow = 0 ; Iterator < Row > rowIterator = dataSheet. iterator ( ) ; int dataIndex = 0 ; while ( rowIterator. hasNext ( ) && dataIndex < 3 ) { Row headRow = rowIterator. next ( ) ; Iterator < Cell > cellIterator = headRow. cellIterator ( ) ; List < String > fieldMeaningNamesThis = getFieldMeaningName ( cellIterator) ; if ( Func . isNotEmpty ( fieldMeaningNamesThis) ) { if ( isEmptyRow ( fieldMeaningNamesThis, fileName) ) { continue ; } switch ( dataIndex) { case 0 : fieldMeaningNames = fieldMeaningNamesThis; break ; case 1 : fieldMeaningNames2 = fieldMeaningNamesThis; break ; case 2 : fieldMeaningNames3 = fieldMeaningNamesThis; break ; } dataRow = dataIndex; } dataIndex++ ; } if ( fieldMeaningNames == null || fieldMeaningNames. size ( ) == 0 ) { throw new ServiceException ( "上傳文件內容為空" ) ; } try { if ( Func . isNotEmpty ( fieldMeaningNames3) ) { for ( int i = 1 ; i < fieldMeaningNames3. size ( ) ; i++ ) { if ( Func . isNotBlank ( fieldMeaningNames3. get ( i) ) && Func . isBlank ( fieldMeaningNames2. get ( i) ) ) { for ( int j = i - 1 ; j >= 0 ; j-- ) { if ( Func . isNotBlank ( fieldMeaningNames2. get ( j) ) ) { fieldMeaningNames2. set ( i, fieldMeaningNames2. get ( j) ) ; break ; } } } } } if ( Func . isNotEmpty ( fieldMeaningNames2) ) { for ( int i = 1 ; i < fieldMeaningNames2. size ( ) ; i++ ) { if ( Func . isNotBlank ( fieldMeaningNames2. get ( i) ) && Func . isBlank ( fieldMeaningNames. get ( i) ) ) { for ( int j = i - 1 ; j >= 0 ; j-- ) { if ( Func . isNotBlank ( fieldMeaningNames. get ( j) ) ) { fieldMeaningNames. set ( i, fieldMeaningNames. get ( j) ) ; break ; } } } } } List < Map < String , Object > > fieldMeaningModify = new ArrayList < > ( ) ; List < Map < String , Object > > fieldMeaningTemp = new ArrayList < > ( ) ; for ( int i = 0 ; i < fieldMeaningNames. size ( ) ; i++ ) { Map < String , Object > item = new HashMap < > ( ) ; item. put ( "name" , fieldMeaningNames. get ( i) ) ; item. put ( "index" , i) ; fieldMeaningTemp. add ( item) ; } if ( fieldMeaningModify. size ( ) == 0 ) { fieldMeaningModify = fieldMeaningTemp; } ……} catch ( Exception e) { log. error ( "插入數據異常:{}" , e. getMessage ( ) ) ; e. printStackTrace ( ) ; throw new ServiceException ( "導入異常" ) ; }
}
public List < String > getFieldMeaningName ( Iterator < Cell > cellIterator) { List < String > fieldMeaningNames = new ArrayList < > ( ) ; DataFormatter dataFormatter = new DataFormatter ( ) ; while ( cellIterator. hasNext ( ) ) { Cell cell = cellIterator. next ( ) ; String value = dataFormatter. formatCellValue ( cell) ; fieldMeaningNames. add ( value) ; } return fieldMeaningNames;
}