说明

有时候我们需要上传文档,然后解析文档进行业务逻辑的处理,再存储到数据库中,如何读取文档的形式很多,接下来我们来一 一解析。

对比

(1)POI

首先我们引入相关的依赖

<!--poi-ooxml-->
			<dependency>
				<groupId>org.apache.poi</groupId>
				<artifactId>poi-ooxml</artifactId>
				<version>3.9</version>
			</dependency>

我们需要用 MultipartFile[] file 来进行接受Excel
MultipartFile工具类
MultipartFile是SpringMVC提供简化上传操作的工具类。
在不使用框架之前,都是使用原生的HttpServletRequest来接收上传的数据,文件是以二进制流传递到后端的,然后需要我们自己转换成File类。使用MultipartFile工具类之后,我们对文件上传的操作就简单多了。

public interface MultipartFile {
    //参数名称
    String getName();
    //源文件的名称
    String getOriginalFilename();
    //返回文件的内容类型
    String getContentType();
    //判断是否为空,或者上传的文件是否有内容
    boolean isEmpty();
    //返回文件大小,以字节为单位
    long getSize();
    //将文件内容转成byte[]返回
    byte[] getBytes() throws IOException;
    //返回InputStream读取文件的内容
    InputStream getInputStream() throws IOException;
    //用来把MultipartFile转换成File
    void transferTo(File var1) throws IOException, IllegalStateException;
}

知道了MultipartFile的类方法,我们就可以对文件进行操作了。

//文件类型
					String filetype = "";
					//文件名称
					String fileName = "";
					if(myfile.getOriginalFilename() != null && !"".equals(myfile.getOriginalFilename())){
						filetype = myfile.getOriginalFilename().substring(myfile.getOriginalFilename().indexOf(".") + 1,myfile.getOriginalFilename().length());
						fileName = myfile.getOriginalFilename().substring(0,myfile.getOriginalFilename().indexOf("."));
					}
					 //判断文件格式是否正确
					if (!"xls".equals(filetype) &&  !"xlsx".equals(filetype)) {
						model.put("message", "请选择正确的Excel文件上传!");
						return b(request, model, null);
					}	
          
             if("xls".equals(filetype)){
	    	a = ExcelUtilForBaidu.readExcel2003ZhitouAppKeyword(inputStream,username);
	    }else{
	    	a = ExcelUtilForBaidu.readExcel2007ZhitouAppKeyword(inputStream,username);
	    }

然后我们将inputStream进行转换

XSSFWorkbook workbook = new XSSFWorkbook(inputStream);

然后我们以InputStream的形式传入,读取Excel文件的内容。

写在最前面:    使用的是JAVA POI实现的导出Excel;    POI 提供了对2003版本的Excel的支持 ---- HSSFWorkbook    POI 提供了对2007版本以及更高版本的支持 ---- XSSFWorkbook   引入相关依赖:
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
 /**
     * 读取Excel文件的内容
     * @param inputStream excel文件,以InputStream的形式传入
     * @param sheetName sheet名字
     * @return 以List返回excel中内容
     */
    public static List<Map<String, String>> readExcel(InputStream inputStream, String sheetName) {

        //定义工作簿
        XSSFWorkbook xssfWorkbook = null;
        try {
            xssfWorkbook = new XSSFWorkbook(inputStream);
        } catch (Exception e) {
            System.out.println("Excel data file cannot be found!");
        }

        //定义工作表
        XSSFSheet xssfSheet;
        if (sheetName.equals("")) {
            // 默认取第一个子表
            xssfSheet = xssfWorkbook.getSheetAt(0);
        } else {
            xssfSheet = xssfWorkbook.getSheet(sheetName);
        }

        List<Map<String, String>> list = new ArrayList<Map<String, String>>();

        //定义行
        //默认第一行为标题行,index = 0
        XSSFRow titleRow = xssfSheet.getRow(0);

        //循环取每行的数据
        for (int rowIndex = 1; rowIndex < xssfSheet.getPhysicalNumberOfRows(); rowIndex++) {
            XSSFRow xssfRow = xssfSheet.getRow(rowIndex);
            if (xssfRow == null) {
                continue;
            }

            Map<String, String> map = new LinkedHashMap<String, String>();
            //循环取每个单元格(cell)的数据
            for (int cellIndex = 0; cellIndex < xssfRow.getPhysicalNumberOfCells(); cellIndex++) {
                XSSFCell titleCell = titleRow.getCell(cellIndex);
                XSSFCell xssfCell = xssfRow.getCell(cellIndex);
                map.put(getString(titleCell),getString(xssfCell));
            }
            list.add(map);
        }
        return list;
    }

    /**
     * 把单元格的内容转为字符串
     * @param xssfCell 单元格
     * @return 字符串
     */
    public static String getString(XSSFCell xssfCell) {
        if (xssfCell == null) {
            return "";
        }
        if (xssfCell.getCellTypeEnum() == CellType.NUMERIC) {
            return String.valueOf(xssfCell.getNumericCellValue());
        } else if (xssfCell.getCellTypeEnum() == CellType.BOOLEAN) {
            return String.valueOf(xssfCell.getBooleanCellValue());
        } else {
            return xssfCell.getStringCellValue();
        }
    }

    /**
     * 把内容写入Excel
     * @param list 传入要写的内容,此处以一个List内容为例,先把要写的内容放到一个list中
     * @param outputStream 把输出流怼到要写入的Excel上,准备往里面写数据
     */
    public static void writeExcel(List<List> list, OutputStream outputStream) {
        //创建工作簿
        XSSFWorkbook xssfWorkbook = null;
        xssfWorkbook = new XSSFWorkbook();

        //创建工作表
        XSSFSheet xssfSheet;
        xssfSheet = xssfWorkbook.createSheet();

        //创建行
        XSSFRow xssfRow;

        //创建列,即单元格Cell
        XSSFCell xssfCell;

        //把List里面的数据写到excel中
        for (int i=0;i<list.size();i++) {
            //从第一行开始写入
            xssfRow = xssfSheet.createRow(i);
            //创建每个单元格Cell,即列的数据
            List sub_list =list.get(i);
            for (int j=0;j<sub_list.size();j++) {
                xssfCell = xssfRow.createCell(j); //创建单元格
                xssfCell.setCellValue((String)sub_list.get(j)); //设置单元格内容
            }
        }

        //用输出流写到excel
        try {
            xssfWorkbook.write(outputStream);
            outputStream.flush();
            outputStream.close();
        }catch (IOException e) {
            e.printStackTrace();
        }

    }

持续更新中…