这里简单举个单线程导入导出的例子 ;
- 首先 加入依赖 (这里加入简单可用的依赖 ;网上还有很多,自己可以找找需要的,官网全)
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.3.0</version>
</dependency>
-
这里要用的工具类 有两个一个是导入的
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.IOException; import java.io.InputStream; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; public class ImportExcelUtil { private final static String excel2003L =".xls"; //2003- 版本的excel private final static String excel2007U =".xlsx"; //2007+ 版本的excel /** * 描述:获取IO流中的数据,组装成List<List<Object>>对象 * @param in,fileName * @return * @throws IOException */ public List<List<Object>> getBankListByExcel(InputStream in,String fileName) throws Exception{ List<List<Object>> list = null; //创建Excel工作薄 Workbook work = this.getWorkbook(in,fileName); if(null == work){ throw new Exception("创建Excel工作薄为空!"); } Sheet sheet = null; Row row = null; Cell cell = null; list = new ArrayList<List<Object>>(); //遍历Excel中所有的sheet for (int i = 0; i < work.getNumberOfSheets(); i++) { sheet = work.getSheetAt(i); if(sheet==null){continue;} //遍历当前sheet中的所有行 for (int j = sheet.getFirstRowNum(); j < sheet.getLastRowNum(); j++) { row = sheet.getRow(j); if(row==null||row.getFirstCellNum()==j){continue;} //遍历所有的列 List<Object> li = new ArrayList<Object>(); for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) { cell = row.getCell(y); li.add(this.getCellValue(cell)); } list.add(li); } } return list; } /** * 描述:根据文件后缀,自适应上传文件的版本 * @param inStr,fileName * @return * @throws Exception */ public Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{ Workbook wb = null; String fileType = fileName.substring(fileName.lastIndexOf(".")); if(excel2003L.equals(fileType)){ wb = new HSSFWorkbook(inStr); //2003- }else if(excel2007U.equals(fileType)){ wb = new XSSFWorkbook(inStr); //2007+ }else{ throw new Exception("解析的文件格式有误!"); } return wb; } /** * 描述:对表格中数值进行格式化 * @param cell * @return */ public Object getCellValue(Cell cell){ Object value = null; DecimalFormat df = new DecimalFormat("0"); //格式化number String字符 SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd"); //日期格式化 DecimalFormat df2 = new DecimalFormat("0.00"); //格式化数字 switch (cell.getCellType()) { case Cell.CELL_TYPE_STRING: value = cell.getRichStringCellValue().getString(); break; case Cell.CELL_TYPE_NUMERIC: if("General".equals(cell.getCellStyle().getDataFormatString())){ value = df.format(cell.getNumericCellValue()); }else if("m/d/yy".equals(cell.getCellStyle().getDataFormatString())){ value = sdf.format(cell.getDateCellValue()); }else{ value = df2.format(cell.getNumericCellValue()); } break; case Cell.CELL_TYPE_BOOLEAN: value = cell.getBooleanCellValue(); break; case Cell.CELL_TYPE_BLANK: value = ""; break; default: break; } return value; } /** * 描述:获取IO流中的数据,组装成List<List<Object>>对象 * @param in,fileName * @return * @throws IOException */ public List<List<Object>> getBankListByExcel2(InputStream in,String fileName) throws Exception{ List<List<Object>> list = null; //创建Excel工作薄 Workbook work = this.getWorkbook(in,fileName); if(null == work){ throw new Exception("创建Excel工作薄为空!"); } Sheet sheet = null; Row row = null; Cell cell = null; list = new ArrayList<List<Object>>(); //遍历Excel中所有的sheet for (int i = 0; i < work.getNumberOfSheets(); i++) { sheet = work.getSheetAt(i); if(sheet==null){continue;} //遍历当前sheet中的所有行 for (int j = sheet.getFirstRowNum()+1; j <= sheet.getLastRowNum(); j++) { row = sheet.getRow(j); if(row==null||row.getFirstCellNum()==j){continue;} //遍历所有的列 List<Object> li = new ArrayList<Object>(); for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) { cell = row.getCell(y); li.add(this.getCellValue(cell)); } list.add(li); } } return list; } }
-
另一个是方便直接下载的FileUtil (这里用这个工具类之后 可直接下载)
import java.io.File; import java.io.IOException; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.FileUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.multipart.MultipartFile; public class FileUtil { private static final String url = "/upload"; /** * 上传文件方法 * @param file 上传的文件 * @param request request对象 * @return */ public static String FileUpload(MultipartFile file, HttpServletRequest request){ //保存文件的目标目录 String savePath = request.getRealPath("/"); // String savePath = request.getSession().getServletContext().getRealPath("/")+url; //获取源文件后缀名称 //12345.jpg int suffixIndex = file.getOriginalFilename().lastIndexOf("."); // .jpg String suffixName = file.getOriginalFilename().substring(suffixIndex); //生成新的文件名称,原因:防止文件名称一样后者上传的文件会覆盖前者上传的文件(前提是文件名称必须一样并且在用一个目录下) //生成新的文件名称,保证文件名称唯一有两种方法: // 1.通过UUID实现文件名称唯一 (UUID会生成32位字母+数字唯一的一个字符串) // 2.通过时间戳现文件名称唯一 (时间戳是毫秒级时间 时间会一直往上加,生成13位数字)注意只有java生成13位 其他则是10位比如oracle、mysql、php // 获取时间戳 //long currentTimeMillis = System.currentTimeMillis(); //System.out.println(currentTimeMillis); String newFileName = UUID.randomUUID().toString().replace("-", "") + suffixName; //检测目标目录是否存在 File targetFile = new File(savePath, newFileName); if(!targetFile.exists()){ //创建目标目录 targetFile.mkdirs(); } try { // 使用transferTo(dest)方法将上传文件写到服务器上指定的文件。 file.transferTo(targetFile); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return newFileName; } /** * 文件下载方法 * @param fileName 文件名称 * @param * @return */ public static ResponseEntity<byte[]> FileDownload(String fileName){ ResponseEntity<byte[]> entity = null; //获取源文件地址 //获取源文件 File sourceFile = new File(fileName); //设置头部信息(文件信息包括文件名称和下载文件类型) HttpHeaders headers = new HttpHeaders(); headers.setContentDispositionFormData("attachment", "文件名.xls"); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); //文件下载 try { entity = new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(sourceFile), headers, HttpStatus.CREATED); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return entity; } }
-
导入导出 实际操作 (核心还是基本的 IO 流操作)
import org.apache.commons.io.FileUtils; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URL; import java.util.ArrayList; import java.util.List; @Controller public class TreeController { @Autowired private TreeService treeService; @RequestMapping("main") public String main() { return "main"; } /** * @Author chh * @Description //TODO 查询 * @Date 22:44 2019/5/13 * @Param * @return **/ @RequestMapping("findTreeList") @ResponseBody public List<Tree> findTreeList() { return treeService.findTreeList(); } //导入 @RequestMapping("enterPoi") @ResponseBody public Boolean enterPoi(HttpServletRequest request) throws Exception { MultipartHttpServletRequest multipart= (MultipartHttpServletRequest) request; MultipartFile file = multipart.getFile("upfile"); if(file.isEmpty()){ throw new Exception("文件不存在"); } InputStream in = file.getInputStream(); List<List<Object>> bankListByExcel2 = new ImportExcelUtil().getBankListByExcel2(in, file.getOriginalFilename()); System.out.println(bankListByExcel2); List<Tree> trees = new ArrayList<>(); for (int i=0;i<bankListByExcel2.size();i++){ List<Object> objects = bankListByExcel2.get(i); Tree tree = new Tree(); tree.setText((String) objects.get(1)); tree.setUrl((String) objects.get(2)); tree.setPid(Integer.valueOf(objects.get(3).toString())); trees.add(tree); } try { treeService.savePoi(trees); in.close(); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * @Author chh * @Description //TODO 导出 * @Date 9:58 2019/5/14 * @Param * String str=""; * for (int i=0; i<treeList.size();i++){ * str+=treeList.get(i).getId()+treeList.get(i).getText()+treeList.get(i).getUrl()+treeList.get(i).getPid(); * } * @return **/ @ResponseBody @RequestMapping("exportPoi") public ResponseEntity<byte[]> exportExcel(String ids) throws IOException { List<Tree> treeList1 =treeService.findTreeListByIds(ids); String[] title={"id","text","url","pid"}; HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet(); HSSFRow row = sheet.createRow(0); HSSFCell cell = null; for (int i=0;i<title.length;i++){ cell = row.createCell(i); cell.setCellValue(title[i]); } for (int i=0; i<treeList1.size();i++){ HSSFRow row1 = sheet.createRow(i+1); HSSFCell cell1 = row1.createCell(0); cell1.setCellValue(treeList1.get(i).getId()); HSSFCell cell2 = row1.createCell(1); cell2.setCellValue(treeList1.get(i).getText()); HSSFCell cell3 = row1.createCell(2); cell3.setCellValue(treeList1.get(i).getUrl()); HSSFCell cell4 = row1.createCell(3); cell4.setCellValue(treeList1.get(i).getPid()); } //我这里是先固定了一个要导出的地址:实际下载地址自己在下载时选择 String pathname = "C:\\Users\\wo\\Desktop\\1.xlsx"; File file = new File(pathname); file.createNewFile(); FileOutputStream fileOutputStream = FileUtils.openOutputStream(file); workbook.write(fileOutputStream); return FileUtil.FileDownload(pathname); } }
-
注意 :若要使用其他不同版本的依赖 ,可百度查一下