如何使用 PIO 导入、导出 Excel 表格(单)

这里简单举个单线程导入导出的例子 ;

  1. 首先 加入依赖 (这里加入简单可用的依赖 ;网上还有很多,自己可以找找需要的,官网全)
   <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>
  1. 这里要用的工具类 有两个一个是导入的

    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;
        }
    }
    
  2. 另一个是方便直接下载的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;
    	}
      }
    
  3. 导入导出 实际操作 (核心还是基本的 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);
    
     }	
    }
    
  4. 注意 :若要使用其他不同版本的依赖 ,可百度查一下

猜你喜欢

转载自blog.csdn.net/cxy_chh/article/details/90643909