第一次弄文件导入导出转换的功能,结束之后拿出来分享一下,期间在网上找了很多,(这是实在想吐槽一下,一些博文写的导入导出还要指定一个文件路径来弄,还写死,这不是搞笑嘛。纯属吐槽那个写死路径的功能,实际项目开发中真的有这样的功能需求吗)。
公司要求弄个excel 转txt,word,pdf等文件的操作,其中还有很多细节需求,什么列间距,格式七七八八的需求 哭了。 这里先写下基础操作 后续再更新excel转其他文件类型操作 。
上传文件
@RequestMapping("/uploadExExcel")
@ResponseBody
public ResponseData uploadExExcel(@RequestPart("file") MultipartFile file, HttpServletRequest request) {
String name = file.getOriginalFilename();
request.getSession().setAttribute("upFile", name);
//这里是获取服务器存在文件的路径
//这里是我自己封装了一个方法来调用 就没展示出来了
String fileSavePath = ConstantsContext.getFileUploadPath();
File folder = new File(fileSavePath);
if (!folder.exists()) {
folder.mkdirs();
}
try {
file.transferTo(new File(fileSavePath + name));
} catch (Exception e) {
throw new ServiceException(BizExceptionEnum.UPLOAD_ERROR);
}
HashMap<String, Object> map = new HashMap<>();
map.put("fileId", IdWorker.getIdStr());
return ResponseData.success(0, "上传成功", map);
}
这里是我的处理是 ,上传完成文件之后继续调用导出数据接口 所以参数是request,和response
导出数据
/**
* 导出文件数据
*
* @param request
* @param response
*/
@ResponseBody
@RequestMapping("wordExport")
public void wordExport(HttpServletRequest request, HttpServletResponse response) {
//获取已上传文件的全称
String fileName = (String) request.getSession().getAttribute("upFile");
String wordname = StringUtils.substring(fileName, 0, fileName.lastIndexOf("."));
//获取系统设置的上传文件路径
String fileSavePath = ConstantsContext.getFileUploadPath();
File file2 = new File(fileSavePath + fileName);
//h获取excel内容
List<List<String>> pdfItemList = TxtExportUtil.readExcel(file2, fileName);
WordExportUtil.createFile(response, wordname, pdfItemList);
}
这里的 WordExportUtil.createFile() 方法就是把从excel获取到的内容放入word中 这个方法后续开放出来这里就先不贴出来了
重点来了
TxtExportUtil.readExcel(file2, fileName);
方法是关键 ,读取excel 数据
不管你是excel转什么文件 ,转之前都是需要获取excel文件内容,所以可以封装出来一个方法便于其他方法调用
/**
* 读取excel文件的内容,返回行级内容集合
* @param excelFile
* @param fileName
* @return
*/
public static List<List<String>> readExcel(File excelFile,String fileName) {
Workbook workbook=null;
FileInputStream fis =null;
List<List<String>> resultList=new ArrayList();
String cellValue=null;
//判断excel表格文件类型
try {
fis=new FileInputStream(excelFile);
if (fileName.toLowerCase().endsWith("xlsx")){
workbook = new XSSFWorkbook(fis);
}else if (fileName.toLowerCase().endsWith("xls")){
workbook = new HSSFWorkbook(new POIFSFileSystem(fis));
}else{
}
//获取excel文件中的sheet表格数量
//文件多表解析
int numberOfSheets = workbook.getNumberOfSheets();
//遍历单元格
for (int i = 0; i < numberOfSheets; i++){
Sheet sheet = workbook.getSheetAt(0);
//getPhysicalNumberOfRows()获取的是物理行数,也就是不包括那些空行(隔行)的情况
//从表头开始
for (int j=0;j<sheet.getPhysicalNumberOfRows();j++){
//获取每行
Row row = sheet.getRow(j);
//非空行
if(row !=null ){
List list=new ArrayList();
//获取每行的单元格
for (int k=0;k < row.getLastCellNum();k++){
Cell cell=row.getCell(k);
if (cell == null){
list.add("");
continue;
}
switch (cell.getCellType()){
case STRING:
cell.setCellType(STRING);
list.add(cell.getStringCellValue());
break;
case NUMERIC:
// 数字类型 小数,整数,日期
// 如果是数字类型的话,判断是不是日期类型
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date d = cell.getDateCellValue();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy'/'MM'/'dd");
cellValue = formatter.format(d);
list.add(cellValue);
} else if(cell.getCellStyle().getDataFormat() == 31) {
Date d = cell.getDateCellValue();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy'/'MM'/'dd");
cellValue = formatter.format(d);
list.add(cellValue);
} else {
DecimalFormat df = new DecimalFormat("0");
cellValue = df.format(cell.getNumericCellValue());
list.add(cellValue);
}
break;
case BOOLEAN:
list.add(String.valueOf(cell.getBooleanCellValue()));
break;
case FORMULA:
list.add(cell.getCellFormula());
break;
default:
break;
}
}
resultList.add(j,list);
}
}
}
fis.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
return resultList;
}
}
到这里一个简单的文件上传,读取excel文件内容的功能就可以了。